Unity 攻擊范圍的檢測


一、扇形攻擊范圍檢測

 1 using System.Collections.Generic;
 2 using UnityEngine;
 3 
 4 public class AttackRange : MonoBehaviour
 5 {
 6     // 攻擊目標
 7     public Transform Target;
 8     // 扇形范圍大小
 9     private float SkillDistance = 10;
10     // 扇形的角度
11     private float SkillJiaodu = 90;
12 
13     private void Update()
14     {
15         // 與敵人的距離
16         float distance = Vector3.Distance(transform.position, Target.position);
17         // 玩家正前方的向量
18         Vector3 norVec = transform.rotation * Vector3.forward;
19         // 玩家與敵人的方向向量
20         Vector3 temVec = Target.position - transform.position;
21         // 求兩個向量的夾角
22         float jiajiao = Mathf.Acos(Vector3.Dot(norVec.normalized, temVec.normalized)) * Mathf.Rad2Deg;
23         if (distance < SkillDistance)
24         {
25             // 繪制扇形區域(繪制時取消注釋)
26             //ToDrawSectorSolid(transform, transform.localPosition, SkillJiaodu, SkillDistance);
27 
28             if (jiajiao <= SkillJiaodu * 0.5f)
29             {
30                 Debug.Log("小球出現在扇形范圍內!");
31             }
32         }
33     }
34 }

計算並繪制扇形范圍區域,便於測試和觀察

 1     GameObject go;
 2     MeshFilter mf;
 3     MeshRenderer mr;
 4     Shader shader;
 5 
 6     // 繪制實心扇形
 7     public void ToDrawSectorSolid(Transform t, Vector3 center, float angle, float radius)
 8     {
 9         int pointAmmount = 100;
10         float eachAngle = angle / pointAmmount;
11 
12         Vector3 forward = t.forward;
13         List<Vector3> vertices = new List<Vector3>();
14 
15         vertices.Add(center);
16         for (int i = 0; i < pointAmmount; i++)
17         {
18             Vector3 pos = Quaternion.Euler(0f, -angle / 2 + eachAngle * (i - 1), 0f) * forward * radius + center;
19             vertices.Add(pos);
20         }
21         CreateMesh(vertices);
22     }
23 
24     // 創建網格
25     private GameObject CreateMesh(List<Vector3> vertices)
26     {
27         int[] triangles;
28         Mesh mesh = new Mesh();
29 
30         int triangleAmount = vertices.Count - 2;
31         triangles = new int[3 * triangleAmount];
32 
33         // 根據三角形的個數,來計算繪制三角形的頂點順序
34         for (int i = 0; i < triangleAmount; i++)
35         {
36             triangles[3 * i] = 0;
37             triangles[3 * i + 1] = i + 1;
38             triangles[3 * i + 2] = i + 2;
39         }
40 
41         if (go == null)
42         {
43             go = new GameObject("mesh");
44             go.transform.position = new Vector3(0f, 0.1f, 0.5f);
45 
46             mf = go.AddComponent<MeshFilter>();
47             mr = go.AddComponent<MeshRenderer>();
48 
49             shader = Shader.Find("Unlit/Color");
50         }
51 
52         mesh.vertices = vertices.ToArray();
53         mesh.triangles = triangles;
54 
55         mf.mesh = mesh;
56         mr.material.shader = shader;
57         mr.material.color = Color.red;
58 
59         return go;
60     }

具體效果:

二、長方形攻擊范圍檢測

 1 using System.Collections.Generic;
 2 using UnityEngine;
 3 
 4 public class AttackRange : MonoBehaviour
 5 {
 6     // 攻擊目標
 7     public Transform Target;
 8 
 9     private void Update()
10     {
11         // 計算玩家與敵人的距離
12         float distance = Vector3.Distance(transform.position, Target.position);
13         // 玩家與敵人的方向向量
14         Vector3 temVec = Target.position - transform.position;
15         // 與玩家正前方做點積
16         float forwardDistance = Vector3.Dot(temVec, transform.forward.normalized);
17         if (forwardDistance > 0 && forwardDistance <= 10)
18         {
19             // 繪制矩形區域(繪制時取消注釋)
20             //ToDrawRectangleSolid(transform, transform.localPosition, 10, 2);
21 
22             float rightDistance = Vector3.Dot(temVec, transform.right.normalized);
23 
24             if (Mathf.Abs(rightDistance) <= 3)
25             {
26                 Debug.Log("小球進入矩形攻擊范圍");
27             }
28         }
29     }
30 }

計算並繪制矩形范圍區域,便於測試和觀察

 1     GameObject go;
 2     MeshFilter mf;
 3     MeshRenderer mr;
 4     Shader shader;
 5 
 6     // 繪制矩形區域
 7     public void ToDrawRectangleSolid(Transform t, Vector3 bottomMiddle, float length, float width)
 8     {
 9         List<Vector3> vertices = new List<Vector3>();
10 
11         vertices.Add(bottomMiddle - t.right * width);
12         vertices.Add(bottomMiddle - t.right * width + t.forward * length);
13         vertices.Add(bottomMiddle + t.right * width + t.forward * length);
14         vertices.Add(bottomMiddle + t.right * width);
15 
16         CreateMesh(vertices);
17     }
18 
19     // 創建網格
20     private GameObject CreateMesh(List<Vector3> vertices)
21     {
22         int[] triangles;
23         Mesh mesh = new Mesh();
24 
25         int triangleAmount = vertices.Count - 2;
26         triangles = new int[3 * triangleAmount];
27 
28         for (int i = 0; i < triangleAmount; i++)
29         {
30             triangles[3 * 1] = 0;
31             triangles[3 * i + 1] = i + 1;
32             triangles[3 * i + 2] = i + 2;
33         }
34 
35         if (go == null)
36         {
37             go = new GameObject("Rectang");
38             go.transform.position = new Vector3(0, 0.1f, 0);
39             mf = go.AddComponent<MeshFilter>();
40             mr = go.AddComponent<MeshRenderer>();
41 
42             shader = Shader.Find("Unlit/Color");
43         }
44 
45         mesh.vertices = vertices.ToArray();
46         mesh.triangles = triangles;
47         mf.mesh = mesh;
48         mr.material.shader = shader;
49         mr.material.color = Color.red;
50 
51         return go;
52     }

具體效果:

三、半圓形攻擊范圍檢測

 1 using System.Collections.Generic;
 2 using UnityEngine;
 3 
 4 public class AttackRange : MonoBehaviour
 5 {
 6     // 攻擊目標
 7     public Transform Target;
 8 
 9     private void Update()
10     {
11         // 計算玩家與敵人的距離
12         float distance = Vector3.Distance(transform.position, Target.position);
13         // 玩家與敵人的方向向量
14         Vector3 temVec = Target.position - transform.position;
15         // 與玩家正前方做點積
16         float forwardDistance = Vector3.Dot(temVec, transform.forward.normalized);
17         if (forwardDistance > 0 && forwardDistance <= 10)
18         {
19             // 繪制半圓區域(繪制時取消注釋)
20             //ToDrawSectorSolid(transform, transform.localPosition, 180, 4);
21             if (distance <= 5)
22             {
23                 Debug.Log("小球進入半圓攻擊范圍!");
24             }
25         }
26     }
27 }

計算並繪制半圓范圍區域,便於測試和觀察

 1     GameObject go;
 2     MeshFilter mf;
 3     MeshRenderer mr;
 4     Shader shader;
 5 
 6     // 繪制半圓區域
 7     public void ToDrawSectorSolid(Transform t, Vector3 center, float angle, float radius)
 8     {
 9         int pointAmmount = 100;
10         float eachAngle = angle / pointAmmount;
11 
12         Vector3 forward = t.forward;
13         List<Vector3> vertices = new List<Vector3>();
14 
15         vertices.Add(center);
16         for (int i = 0; i < pointAmmount; i++)
17         {
18             Vector3 pos = Quaternion.Euler(0f, -angle / 2 + eachAngle * (i - 1), 0f) * forward * radius + center;
19             vertices.Add(pos);
20         }
21         CreateMesh(vertices);
22     }
23 
24     // 創建網格
25     private GameObject CreateMesh(List<Vector3> vertices)
26     {
27         int[] triangles;
28         Mesh mesh = new Mesh();
29 
30         int triangleAmount = vertices.Count - 2;
31         triangles = new int[3 * triangleAmount];
32 
33         // 根據三角形的個數,來計算繪制三角形的頂點順序
34         for (int i = 0; i < triangleAmount; i++)
35         {
36             triangles[3 * i] = 0;
37             triangles[3 * i + 1] = i + 1;
38             triangles[3 * i + 2] = i + 2;
39         }
40 
41         if (go == null)
42         {
43             go = new GameObject("mesh");
44             go.transform.position = new Vector3(0f, 0.1f, 0.5f);
45 
46             mf = go.AddComponent<MeshFilter>();
47             mr = go.AddComponent<MeshRenderer>();
48 
49             shader = Shader.Find("Unlit/Color");
50         }
51 
52         mesh.vertices = vertices.ToArray();
53         mesh.triangles = triangles;
54 
55         mf.mesh = mesh;
56         mr.material.shader = shader;
57         mr.material.color = Color.red;
58 
59         return go;
60     }

具體效果:

 

 

 

 

 

*** |  以上內容僅為學習參考、學習筆記使用  | ***


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM