using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// 学习向量点乘
//业务逻辑:主角前方的向量和与每一个怪物的连线构成的向量
//这两个向量之间的夹角可以判断怪物是否在人物前方
//如果在前方可以显示怪物,并让怪物走过来,如果不在前方就不渲染,节省性能
//程序逻辑:1.拿到主角的前方向量A 2.拿到怪物当前坐标向量 B 3.算出人物到怪物的方向向量C
//4.点乘A和C,得出一个cos(A和C夹角)的余弦值-一个标量数值=Vector.Dot(A,C)
//5.如果数值大于0 两个向量之间的夹角小于90度,即它们大致指向相同的方向
//=0 时,两个向量是正交的,即它们的夹角为90度。
//<0 时,两个向量之间的夹角大于90度,即它们大致指向相反的方向。
public class fx : MonoBehaviour
{ public GameObject _role;//人
public GameObject _enemy;//怪物
void Update()
{
Vector3 roleForw = _role.transform.forward;//主角前方向量
Vector3 RoleToMonster = _enemy.transform.position - _role.transform.position;//主角到怪物的线
float dotResult = Vector3.Dot(roleForw, RoleToMonster.normalized);//a*b 主角前方的线*主角到怪物的线
Mathf.Acos(dotResult);//计算当前夹角,前提是点乘运算内部的向量单位化,这样点乘除以两个向量的模,模为1!
if (dotResult > 0)
{
Debug.Log("[0,90)度,怪物在我的前方" + "当前角度:");
_enemy.transform.Translate(-RoleToMonster * 2 * Time.deltaTime);
}
else if (dotResult == 0)
{
Debug.Log("夹角=[90)度,怪物在我的侧方");
}
else
{
Debug.Log("夹角>90)度,怪物在我的后方");
}
Debug.DrawRay(_role.transform.position, roleForw * 1000, Color.red);
Debug.DrawRay(_role.transform.position, RoleToMonster, Color.red);
}
}//end class
07-13
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交