实现一个在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);
}
}
}