Unity3D 鼠标点击控制角色行走
鉴于用键盘方向键或w、a、s、d键操作角色行走的不便,经过和同事的一番倒腾,实现了鼠标控制角色行走、转向。
Unity3d 鼠标点击控制角色行走实现的过程如下:
1、获取目标点:通过相机向屏幕发射射线,射线会与地面collider发生碰撞,获取碰撞点坐标。
2、计算两者夹角:通过角色的position和目标点差值,计算出从角色当前position到目标点的向量,用此向量和角色朝向transfrom.Forward,计算出两者间的夹角。
3、旋转角色:通过调用transform.RotateAround函数实现角色旋转,使角色朝向目标点。
4、角色移动:通过实时改变角色position实现角色移动。
Unity3d 鼠标点击控制角色行走开发过程中遇到角色旋转问题,不能很好的判断该顺时或逆时针旋转,导致角色朝向不正确,进而导致不能正确的移动到目标点。另外发现Unity3d中的rotation初始角度为0时,当给它一个负旋转角度时,它不会逆时针旋转该角度,相反而是顺时针旋转(负角度+360),所以会导致朝向偏差。最后通过向量的叉乘,取其结果的Y坐标,根据其正负,改变两者夹角的正负。
<font style="color:rgb(85, 85, 85)"><font style="background-color:rgb(255, 255, 255)"><font face="Helvetica, Helvetica, sans-serif"><font style="font-size:12px">void Update ()
{
if(Input.GetMouseButtonDown(0))
{
RayControl();
}
if(flagMove)
{
if(Vector3.Distance(transform.position,mousePos)>1)
{
transform.Translate(transform.worldToLocalMatrix* transform.forward * Time.deltaTime*5);
}
else
{
flagMove=false;
}
}
}
void RayControl()
{
Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);// 向屏幕发射线
if(Physics.Raycast(ray,out hit,200))//射线的碰撞检测
{
GameObject targetPos=GameObject.CreatePrimitive(PrimitiveType.Sphere);
targetPos.transform.localScale=new Vector3(0.5f,0.5f,0.5f);
mousePos=hit.point;
mousePos.y=transform.position.y;
targetPos.transform.position=mousePos;
targetDir=mousePos-transform.position;//目标点的朝向 Vector3 tempDir=Vector3.Cross(transform.forward,targetDir.normalized);
float dotValue=Vector3.Dot(transform.forward,targetDir.normalized);
float angle=Mathf.Acos(dotValue)*Mathf.Rad2Deg;//计算夹角
if(tempDir.y<0)
{
angle=angle*(-1);
}
transform.RotateAround(transform.position,Vector3.up,angle);//旋转角色
flagMove=true;
}
}</font></font></font></font>
>>相关产品