using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Dotstudy : MonoBehaviour
{
/// <summary>
/// 学习向量点乘
/// 业务逻辑:主角前方的向量与每一个怪物的连线构成的向量
/// 两个向量之间的夹脚可以判断怪物是否在人物前方,如果在前方则可以显示怪物,并让怪物走过来,如果前方没有怪物就无需渲染,节省性能。
///
/// 程序逻辑:
/// 1.拿到主角的前方向量A
/// 2.拿到怪物的当前坐标向量B
/// 3.算出任务到怪物的方向向量C
/// 4.点乘A和C 得出一个cos(A和C夹角)的余弦值-一个标量数值=Vector.Doc(A,C)
/// 5.如果数值大于0,两个向量之间的夹角小于90°,即它们大致指向相同的方向;=0时,两个向量是正交的,即他们的夹角为90°;<0时,两个向量之间的夹角大于90°,即它们大致指向相反方向。
/// </summary>
public GameObject _role;
public GameObject _enemy;
// Update is called once per frame
void Update()
{
Vector3 roleForw = _role.transform.forward;//主角前方向量
Vector3 RoleToMonster = _enemy.transform.position - _role.transform.position;
float dotResult = Vector3.Dot(roleForw, RoleToMonster);
if (dotResult > 0)
{
Debug.Log("夹角<90°,怪物在我的前方");
_enemy.transform.Translate(-RoleToMonster * 1* 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);
//#region
//Vector3 roleFront = _role.transform.forward;
//Vector3 roleToEnemy = (_enemy.transform.position - _role.transform.position).normalized;
//接下来计算点乘
//float DotResult = Vector3.Dot(roleFront, roleToEnemy);//点乘计算得出一个夹角余弦值,也就是一个标量
//Mathf.Cos(60 * Mathf.Deg2Rad);//用来计算60°的余弦值
//if (DotResult > 0)
//{
// Debug.Log("它们大致指向相同方向");
//}
//if (DotResult == 0)
//{
// Debug.Log("它们的夹角为90°");
//}
//if (DotResult< 0)
//{
// Debug.Log("它们大致指向相反方向");
//}
}//end update
}//end class
Unity-向量点乘
于 2023-10-30 18:54:18 首次发布