1. 程式人生 > >KING_UNITY學習之滑鼠點選地面控制人物移動

KING_UNITY學習之滑鼠點選地面控制人物移動

實現一個在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);
                }
            }
}