今天呢,我们来一起实现一个在RPG中游戏中十分常见的功能该文章 ,通过鼠标点击屏幕来控制人物的走动。首先来说一下原理,当我们点击屏幕时,我们按照一定的方法,将屏幕上的二维坐标转化为三维坐标,然后我们从摄像机位置发射 一条经过该点的射线,则这条射线与大地平面的交点,就是我们的目标位置。那么确定了这个位置以后,我们需要做的就是让角色从原来的位置移动到这个位置,并在其间添加角色动画即可。对于角色移动的问题,如果复杂点的画我们可能要计算移动的方向向量,并针对起点和终点进行插值计算来实现,这里我们选择一种相对简单的办法,在Unity3D中,有一个LookAt()方法,该方法可以使物体发生旋转,使其z轴始终指向目标物体。再完成了旋转后,我们需要让物体沿着Z轴方向(forward)移动。这样就实现了鼠标点击控制人物走动这一功能。好了,下面我们来一起看今天的内容吧!



     首先创建一个场景,我们准备一个地形Terrain和平行光Direction Light,并拖入我们事先准备好的人物模型,如图:


   


     接下来为模型添加动画组件,并将动画的类型设置为Legacy模式,如图所示:




     我们设置默认的动画为idle,接下来,我们来编写脚本代码:



• using UnityEngine;  
• using System.Collections;  
•   
• public class PeopleControl : MonoBehaviour {  
•       
•     //目标点坐标  
•     private Vector3 mTargetPos;  
•       
•     void Start ()   
•     {  
•       
•     }  
•       
•     void Update ()   
•     {  
•       //按下鼠标右键时  
•       if(Input.GetMouseButton(1))  
•       {  
•          //获取屏幕坐标  
•          Vector3 mScreenPos=Input.mousePosition;  
•          //定义射线  
•          Ray mRay=Camera.main.ScreenPointToRay(mScreenPos);  
•          RaycastHit mHit;  
•          //判断射线是否击中地面  
•          if(Physics.Raycast(mRay,out mHit))  
•          {  
•             if(mHit.collider.gameObject.tag=="Terrain")  
•             {  
•                //获取目标坐标  
•                mTargetPos=mHit.point;  
•                //让主角面朝目标坐标并向目标移动  
•                transform.LookAt(mTargetPos);  
•                //播放奔跑动画  
•                transform.gameObject.GetComponent().Play("run");  
•                transform.Translate(Vector3.forward * 0.5F);  
•             }  
•          }  
•       }  
•       //松开鼠标右键时  
•       if(Input.GetMouseButtonUp(1))  
•       {  
•         transform.gameObject.GetComponent().Play("idle");  
•       }  
•     }  
• }


       将脚本绑定到角色上以后,我们就能看到下面的效果啦,哈哈:)


       

20140411185411046.gif (83.68 KB, 下载次数: 0)


       这就是今天的内容啦,当然我们还需要解决的问题还有如何在控制人物走动的时候避免和其它物体发生碰撞,以及后续的优化问题,这些内容我们会在后面的文章中为大家解答,谢谢大家!