unity3d 设置是否在攻击范围

    xiaoxiao2021-04-14  36

    using UnityEngine; using System.Collections; public class Vector3Practice : MonoBehaviour { public Transform Target; public bool onlyOne = true; public Transform enemy; // Use this for initialization void Start () { } // Update is called once per frame void Update () { setArea1 (Target); } //沿着obj的X轴延伸10米后的坐标 public void SetXPosition1 (Transform objTran, float distance) { objTran.Translate (new Vector3 (distance, 0f, 0f), Space.Self); } //获取沿着obj的正前方延伸distance后的坐标 public Vector3 GetPosition1 (Transform objTran, float distance) { return Target.position + (Target.rotation * Vector3.forward) * distance; } //沿着世界坐标的X轴延伸10米后的坐标 public void SetPosition2 (Transform objTran) { objTran.Translate (new Vector3 (10f, 0f, 0f), Space.World); } //沿着物体的Y轴旋转30° public void SetRotation1 (Transform objTran) { objTran.rotation = Quaternion.Euler (0f, 30f, 0f) * objTran.rotation; } //向着目标点移动 Vector3.forward是一个标准向量(0,0,1) public void forward (Transform resource, Vector3 target) { resource.LookAt (target); resource.Translate (Vector3.forward * 100); } //主角看到的是向左30度,向右30度,的区域前方 public void setArea1 (Transform hero) { #region 目标点 到 目标点正前方5单位 Vector3 v0 = hero.position + hero.rotation * Vector3.forward * 5f; Debug.DrawLine (hero.position, v0, Color.red); #endregion #region 目标点 到 目标绕Y轴旋转30°再延伸5单位 Quaternion q1 = Quaternion.Euler (0f, 30f, 0) * hero.rotation; Vector3 v1 = hero.position + q1 * Vector3.forward * 5; Debug.DrawLine (hero.position, v1, Color.red); #endregion #region 目标点 到 目标绕Y轴旋转-30°再延伸5单位 Quaternion q2 = Quaternion.Euler (0f, -30f, 0) * hero.rotation; Vector3 v2 = hero.position + q2 * Vector3.forward * 5; Debug.DrawLine (hero.position, v2, Color.red); #endregion //方便查看 将目标点前面的三个点连起来 Debug.DrawLine (v0, v1, Color.red); Debug.DrawLine (v0, v2, Color.red); if (isInArea (enemy.position, Target.position, v0, v1) || isInArea (enemy.position, transform.position, v0, v2)) { Debug.Log ("enemy in this !!!"); } else { Debug.Log ("enemy not in this !!!"); } } //如果某点M在三角形ABC中,那么 MAB MAC MBC 的面积之和=三角形ABC的面积, //如果MAB MAC MBC的面积之和大于三角形ABC的面积,那么M就在三角形ABC的外面。 public bool isInArea (Vector3 point, Vector3 v0, Vector3 v1, Vector3 v2) { float x = point.x; float y = point.z; float v0x = v0.x; float v0y = v0.z; float v1x = v1.x; float v1y = v1.z; float v2x = v2.x; float v2y = v2.z; float t = triangleArea (v0x, v0y, v1x, v1y, v2x, v2y); float a = triangleArea (v0x, v0y, v1x, v1y, x, y) + triangleArea (v0x, v0y, x, y, v2x, v2y) + triangleArea (x, y, v1x, v1y, v2x, v2y); if (Mathf.Abs (t - a) <= 0.01f) { return true; } else { return false; } } //假设三角形的三个顶点为(a,b)(c,d)(e,f) //那么三角形的面积S△=|ad+be+cf-ed-af-bc|/2 public float triangleArea (float v0x, float v0y, float v1x, float v1y, float v2x, float v2y) { return Mathf.Abs ((v0x * v1y + v1x * v2y + v2x * v0y - v1x * v0y - v2x * v1y - v0x * v2y) / 2f); } }

    运行效果:

    转载请注明原文地址: https://ju.6miu.com/read-669709.html

    最新回复(0)