void DirectionJudge()
{
Vector3 dir = mousePositionInWorld - transform.position;
dir.z = 0f;
var magiDir = Vector3.Magnitude(dir);//取模
float v = Vector3.Dot(Vector3.up, dir)/magiDir ;//点乘判断前后
float h = Vector3.Cross(Vector3.forward, dir).y;//叉乘判断左右
if (v >= 0.5f)
_anim.SetTrigger("up"); //Debug.Log("向前");
else if(v<-0.5f)
_anim.SetTrigger("down");//Debug.Log("向后");}
else if(h>0)
_anim.SetTrigger("right");//Debug.Log("向右");}
else if(h<0)//如果写else,点原地时会卡一个left的trigger进去,不行
_anim.SetTrigger("left");//Debug.Log("向左");}
}
主要是通过点乘和叉乘在做方向判断,鼠标点击来和物件当前位置做判断。
发现了一些值得注意的点,
mousePositionInWorld = Camera.main.ScreenToWorldPoint(Input.mousePosition);
这个方法获得的点 z值是-10,而且unity中很多运动学方法造成浮点数不精确
float step = speed* Time.deltaTime;
gameObject.transform.localPosition = Vector2.MoveTowards(gameObject.transform.localPosition, mousePositionInWorld, step);
//unity并不精确,如果用vector3 z会位移,一旦位移就在game窗口不显示。
所以在2D项目中尽可能使用二维向量,三维向量也要时刻归0,;
后面学习了一种方向配合两个参数X ,Y动画树的控制方法
public void PlayLocomotionAnimation(Vector3 currentPos,Vector3 navPos,Vector3 targetPos)
{
Vector3 lookDir = navPos-currentPos;
if (lookDir.magnitude<=0.0001f)
{
lookDir = targetPos - currentPos;
}
if (Vector3.Distance(currentPos,targetPos)>0.3f)
{
animator.SetFloat("LookX", lookDir.normalized.x);//归一化
animator.SetFloat("LookY", lookDir.normalized.y);
animator.SetBool("MoveState",true);
isMoving = true;
}
else if(Vector3.Distance(currentPos, targetPos) < 0.15f)
{
animator.SetBool("MoveState", false);
isMoving = false;
}
}
这种也避免了复杂运算,更好