三角形攻击区域

来源:互联网 发布:域名备案被注销 编辑:程序博客网 时间:2024/06/05 14:11

前言就不铺垫了...


这个功能可以在很多地方用的到,而且一般面试的时候也会提到一些。

因为自己遇到过这样 的问题,并且 在当时做的时候很费劲,但是后来 做出来之后,又觉得简单的要死。



  ok,进入正题。


先说思路。

1、计算角度。

2、计算与物体距离。

3、判断。

4、解决


第一步,计算角度


第一我们需要计算出角度。但是我们应该如何计算角度呢?

   首先我们需要明确,计算角度需要有两条边。

第一条是我们自身物体上的Z轴方向的向量,

第二条是敌人的位置的向量。

自身Z轴的向量为transform.forward;

敌人方向的向量为(敌人.position-transform.position);


这里两个向量都得出后,我们需要利用Vector3的angle方法求出他们的夹角。


简单例子

public class example : MonoBehaviour {public Transform target;void Update() {Vector3 targetDir = target.position - transform.position;Vector3 forward = transform.forward;float angle = Vector3.Angle(targetDir, forward);if (angle < 5.0F)print("close");}}
// prints "close" if the z-axis of this transform looks// almost towards the target//如果当前变换z轴接近目标小于5度的时候,打印"close"var target : Transform;function Update () {var targetDir = target.position - transform.position;var forward = transform.forward;var angle = Vector3.Angle(targetDir, forward);if (angle < 5.0)print("close");}
OK第一步完成。


第二步,计算距离。


公式为num=(B.x-A.x)*(B.y-A.y)*(B.z-A.z)


得出两个值 之后就简单了,判断喽。







第三步,判断角度与距离。




第四步,就OK了。



这里上一下代码,代码中有注释,应该很好理解。



using UnityEngine;using System.Collections;public class Test009 : MonoBehaviour {    public Transform T001;    public Transform T002;    public Transform enemy003;    private Vector3 forward;    private Vector3 V001;    private Vector3 V002;    private Vector3 E003;    //基于自己Z轴与001的角度    private float M_001_angle;    //基于自己Z轴与Enemy003的角度    private float M_E003_angle;    //以下为记录长度距离    private float E_1;void Start () {}// Update is called once per framevoid Update () {        //基于自己Z轴的向量         forward = transform.forward;        //基于自己Z轴与T001的向量-----------角度         V001 = T001.position - transform.position;         M_001_angle = Vector3.Angle(V001,forward);        // print(M_001_angle);//-----------------------------------------------------------        //基于自己Z轴与T002的向量-----------角度//-----------------------------------------------------------        //基于自己Z轴与Enemy的向量--------------角度         E003 = enemy003.position - transform.position;         M_E003_angle = Vector3.Angle(E003, forward);         //print(M_E003_angle);//判断位置         Vector3 E11p = enemy003.transform.position;         //(自己)  与E的距离         E_1 = (E11p.x - forward.x) * (E11p.x - forward.x) + (E11p.y - forward.y) * (E11p.y - forward.y) + (E11p.z - forward.z) * (E11p.z - forward.z);         print(E_1);        //判断角度         if (M_E003_angle <= 30)         {             if (E_1 <= 60)             {                 print("进入角度,干他!!");             }         }                  }}





0 0
原创粉丝点击