经过上述工程,实现了角色的移动功能。但是经过测试,发生了BUG,当角色因地形或其他遮蔽无法顺利抵达TargetPosition时,角色就会一直朝面向方向走下去。
这明显是不符合要求的。
我们把角色运动过程进行分解如下:
鼠标按下 → 确定目标点 → 鼠标松开 → 角色转向 → 计算角色与目标点距离 → 角色前进 → 角色到达目标范围 → 角色停止
明显,角色到达目标范围永远返回false,因为角色的朝向在鼠标松开那一刻便已经决定了,如果沿此方向不能达到目标点,那么角色就会超过最小范围圈,一直运动下去。
那么,需要在鼠标松开后,对角色运动状态进行检测,如果角色处于移动中,那么要求角色始终朝向目标点。
我们对PlayerDirection类进行优化,如下:
首先在PlayerMove中加入移动标识位
nameSpace PlayerMove
public bool isMoving = false;
void Update( )
{
if(distance > 0.1f)
{
isMoving = true;
}
else
{
isMoving = false;
}
}
private Vetor3 TargetPosition;
public GameObject Click;
private bool isMouseDown;
private PlayerMove playermove;
void Start( )
{
TargetPosition = tranform.position;
playermove = GetCompenont<PlayerMove>( );
}
void LookAtTarget( Vector3 target )
{
TargetPosion = target;
TargetPosion = new Vector3( target.x,transform.position.y, target.z);
transform.LookAt(TargetPosion);
}
void Update( )
{
if( Input.GetMouseDown(0))
{
Ray ray = camera.main.ScreenPointToRay( Input.MousePosition );
RaycastHit = hitinfo;
bool isCollier = Physics.Raycast( ray,out hitinfo );
if( isCollider && hitinfo.collider.tag == "Ground" )
{
GameObject.Instantiate( Click, hitinfo.point,Quaternion.identity );
isMouseDown = true;
}
}
if(Input.GetMousUp(0))
{
isMouseDown = false;
}
if( isMouseDown )
{
Ray ray = camera.main.ScreenPointToRay( Input.MousePosition );
RaycastHit = hitinfo;
bool isCollier = Physics.Raycast( ray,out hitinfo );
if( isCollider && hitinfo.collider.tag == "Ground" )
{
LookAt( hitinfo.point );
}
}
else
{
if( playermove.isMoving)
{
LookAt(TargetPosition);
}
}
}
以上,便解决了该BUG。
原文:http://www.cnblogs.com/yanbenxin/p/5789020.html