KING_UNITY學習之滑鼠點選地面控制人物移動
阿新 • • 發佈:2019-02-19
實現一個在RPG中游戲中十分常見的功能,通過滑鼠點選螢幕來控制人物的走動。
一、原理:
當我們點選螢幕時,我們按照一定的方法,將螢幕上的二維座標轉化為三維座標,然後我們從攝像機位置發射 一條經過該點的射線,則這條射線與大地平面的交點,就是我們的目標位置。那麼確定了這個位置以後,我們需要做的就是讓角色從原來的位置移動到這個位置,並在其間新增角色動畫即可。對於角色移動的問題,如果複雜點的畫我們可能要計算移動的方向向量,並針對起點和終點進行插值計算來實現,這裡我們選擇一種相對簡單的辦法,在Unity3D中,有一個LookAt()方法,該方法可以使物體發生旋轉,使其z軸始終指向目標物體。在完成了旋轉後,我們需要讓物體沿著Z軸方向(forward)移動。這樣就實現了滑鼠點選控制人物走動這一功能。
二、例項:
public Transform Cam;
public AnimationClip Run;
public AnimationClip Idle;
private Ray mRay;
private RaycastHit mHit;
private bool isCanAutoMove;
private Vector3 mTargetPos;
void Update() { // 滑鼠點選某個點,人物走向該地點 if (Input.GetMouseButton(0)) { mRay = Cam.camera.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(mRay, out mHit)) { if (mHit.collider.gameObject.tag == "Terrain") { mTargetPos = mHit.point; transform.LookAt(new Vector3(mTargetPos.x,mTargetPos.y,mTargetPos.z)); isCanAutoMove = true; } } } if (isCanAutoMove) { animation.CrossFade(Run.name, 0.15f); transform.Translate(Vector3.forward * movespeed * Time.deltaTime); Cam.transform.Translate(Vector3.forward * movespeed * Time.deltaTime); float targetDist = Vector3.Distance(mTargetPos, transform.position); if (targetDist <= 1) { isCanAutoMove = false; animation.CrossFade(Idle.name, 0.15f); } } }