筆記18 面試題:吸附

圖片說明

在這裏插入圖片描述

代碼:移動物體、垂直地面、吸附到Cube中心

public class CubeTest : MonoBehaviour {
    //來一個布爾值
    private bool isMove;

	void Start () {
			
	}
	
	void Update () {
		//如果移動
        if(isMove)
        {
            //射線
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            //拿到射線的結構體
            RaycastHit hit;
            //進行射線檢測。如果沒有指定層,會看到物體逐漸靠近屏幕。
            //使用了層,那麼必須寫上前面那個表示距離的參數(500f),以避免層失效。
            bool res = Physics.Raycast(ray, out hit, 500f, 1<<8);
            if (res)
            {
                //爲真,則位置等於點擊的位置。
                transform.position = hit.point;
                //如果出現問題,可將法線畫出
                //Debug.DrawRay(hit.point, hit.normal, Color.red);

                //因爲Player是垂直於平面的,所以讓它看向碰撞點的法線(一個向量)
                transform.rotation = Quaternion.LookRotation(hit.normal);
                /*看向一個向量,就是說其Z軸(因爲Z軸表示前方)和向量的方向保持一致。
                所以,使用此方法時,要保證Player的Z軸(本地座標)是朝上的
                區別於transform.LookAt(Vector3.zero);是看向某一點,例如相機看向汽車。
                另一個方法:
                碰撞點向上的方向等於碰撞點法線的方向。好處:不需要修改細長方塊的本地旋轉。
                transform.up = hit.normal;
                */
            }

            //判斷附近有沒有大方塊。範圍:中心點transform.position,半徑1米的圓
            Collider[] colliders = Physics.OverlapSphere(transform.position, 1f);
            //遍歷碰撞體
            foreach(Collider collider in colliders)
            {
                //做判斷:如果碰撞器的標籤是Taget(之前將方塊的標籤改爲了Taget)
                if (collider.tag == "Target")
                {
                    //便將我的位置等於方塊的中心點的位置
                    transform.position = collider.transform.position;
                }
            }
        }
	}

    private void OnMouseDown()
    {
        //isMove表示是否能移動。在這裏設置爲true
        isMove = true;
    }

    private void OnMouseUp()
    {
        isMove = false;
    }
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章