UNITY中利用点乘和叉乘判断方向 2D

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;
        }
    }

这种也避免了复杂运算,更好

猜你喜欢

转载自blog.csdn.net/qq_53211468/article/details/127227094