筆記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;
}
}