Unity-向量点乘

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值