Unity(射线)
#1、描述
此課程說明射線的使用,并且舉例一個鼠標點擊游戲對象移動的示例,注意,如果想要被射線響應到,必須給物體加上碰撞器,不然沒有效果
#2、示例
public int speen;private Vector3 targer;private bool isOver = true;// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {//當按下鼠標左鍵的時候if (Input.GetMouseButtonDown(0)) {//根據屏幕坐標轉換世界坐標,生成一條射線返回Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//創建射線于游戲對象交叉時生成的信息接受類RaycastHit hit = new RaycastHit ();//如果射線于一個游戲對象碰撞交叉時,返回true為真,會把碰撞的信息out到hit對象中if (Physics.Raycast (ray, out hit)) {//從信息類中判斷游戲對象名字是否是地板if (hit.collider.name.Equals ("Plane")) {targer = hit.point; //把坐標賦值給目標對象targer.y = 0.5f; // 重新設置他的y坐標isOver = false; // 設置是否結束為false,這樣就會執行moveto方法了}}}//始終執行移動方法,只有當isOver == true的時候執行MoveTo (targer);}public void MoveTo(Vector3 vector3){//如果沒有結束if (!isOver) {//畫出一條Debug線,從自身延伸到目標的地方,連出一條線,這里說明一下,drawline只會繪畫一次,速度很快,如果要一直顯示,后面還有個duraline字段Debug.DrawLine(transform.position,vector3,Color.blue);//用目標向量 - 當前向量 , 獲取出兩個位置的差異向量Vector3 distance = vector3 - transform.position;//移動游戲對象到目標位置 //distance.normalized :確定方向//speen : 速度//Time.deltaTime : 確保一秒執行speen速度的距離transform.Translate (distance.normalized * speen * Time.deltaTime);//計算兩個點相差的距離,如果差別不大,就結束移動if (Vector3.Distance (vector3, transform.position) <= 0.1f) {isOver = true;transform.position = vector3; }}} 復制代碼#3 射線的技巧 在執行 Physics.Raycast方法的時候,有個參數是int layerMask,這個參數是用于過濾掉不處理的層級的,但是也有一些講究,比如player層級,他要怎么表示這個層級呢,就比較用
1 << LayerMask.NameToLayer("player") 復制代碼Raycast (ray : Ray, out hitInfo : RaycastHit, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers)其實很簡單:1 << 10 打開第10的層。~(1 << 10) 打開除了第10之外的層。~(1 << 0) 打開所有的層。(1 << 10) | (1 << 8) 打開第10和第8的層。 復制代碼射線碰撞檢測+LayerMask的使用
轉載于:https://juejin.im/post/5b3ac96d6fb9a025051946d0
總結
- 上一篇: java四种访问权限
- 下一篇: Flutter 实例 - 加载更多的Li