一 两个向量点乘结果是一个标量 可以得到 怪物在我前方还是后方。游戏中 扇形,矩形 区域检测可以用点乘 代码如下
1. 扇形检测
Vector3 toDir = enemy.transform.position - this.transform.position; //得到 怪物与我之间的距离
float angle = Mathf.Acos(Vector3.Dot(transform.forward, toDir.normalized)) * Mathf.Rad2Deg; //弧度转角度
if (angle < maxAngle * 0.5f && toDir.magnitude < 5)
{
Debug.Log("进入范围");
}
2 矩形检测
private bool RectAttack(Transform selfTrans, Transform enemy, float width, float distance) //生成一个矩形体范围的碰撞区域
{
Vector3 tmpDis = enemy.position - selfTrans.position; //算出攻击者和被攻击者之间的向量差
float dir = Vector3.Dot(selfTrans.forward, tmpDis.normalized); //判断前后
if (dir > 0&& tmpDis.magnitude<= distance)
{
float leftOrRight = Mathf.Abs(Vector3.Dot(selfTrans.right, tmpDis));
Debug.Log("leftOrRight:"+ leftOrRight);
if (leftOrRight <= width) //判断左右距离
{
Debug.LogError("进入攻击");
return true;
}
return false;
}
return false;
}
两个向量点乘结果 为正 它们的夹角小于90度,为负 大于90 ,为零 相互垂直
2 两个向量叉乘结果是一个向量,可以得到 怪物是在左边还是右边(y值 判断) 叉乘代码如下
Vector3 toDir = enemy.transform.position - this.transform.position; //得到 怪物与我之间的距离
Vector3 vCross = Vector3.Cross(this.transform.forward, toDir );
if(vCross.y >0)
{
Debug.Log("怪物在自己的右方");
}
else
{
Debug.Log("怪物在自己的左方");
}