歡迎您光臨本站 註冊首頁

Unity實現攻擊範圍檢測並繪製檢測區域

←手機掃碼閱讀     sl_ivan @ 2020-05-05 , reply:0

本文實例為大家分享了Unity實現攻擊範圍檢測並繪製檢測區域的具體代碼,供大家參考,具體內容如下
一、圓形檢測
using System.Collections; using System.Collections.Generic; using UnityEngine; ///

/// 圓形檢測,並繪製出運行的攻擊範圍 ///

public class CircleDetect : MonoBehaviour { GameObject go; //生成矩形的對象 public Transform attack; //被攻擊方 MeshFilter mf; MeshRenderer mr; Shader shader; void Start () { } void Update () { if (Input.GetKeyDown(KeyCode.A)) { ToDrawCircleSolid(transform, transform.localPosition, 3); if (CircleAttack(attack,transform,3)) { Debug.Log("攻擊到了"); } } if (Input.GetKeyUp(KeyCode.A)) { if (go != null) { Destroy(go); } } } ///

/// 圓形檢測 ///

///

被攻擊者///

技能的位置///

半徑///

public bool CircleAttack(Transform attacked, Transform skillPostion, float radius) { float distance = Vector3.Distance(attacked.position, skillPostion.position); if (distance <= radius) { return true; } else { return false; } } //生成網格 public GameObject CreateMesh(List

vertices) { int[] triangles; Mesh mesh = new Mesh(); int triangleAmount = vertices.Count - 2; triangles = new int[3 * triangleAmount]; //根據三角形的個數,來計算繪製三角形的頂點順序 //順序必須為順時針或者逆時針 for (int i = 0; i < triangleAmount; i++) { triangles[3 * i] = 0; triangles[3 * i + 1] = i + 1; triangles[3 * i + 2] = i + 2; } if (go == null) { go = new GameObject("circle"); go.transform.SetParent(transform, false); go.transform.position = new Vector3(0, -0.4f, 0); mf = go.AddComponent(); mr = go.AddComponent(); shader = Shader.Find("Unlit/Color"); } //分配一個新的頂點位置數組 mesh.vertices = vertices.ToArray(); //包含網格中所有三角形的數組 mesh.triangles = triangles; mf.mesh = mesh; mr.material.shader = shader; mr.material.color = Color.red; return go; } ////// 繪製實心圓形 //////圓形參考物///圓心///半徑public void ToDrawCircleSolid(Transform t, Vector3 center, float radius) { int pointAmount = 100; float eachAngle = 360f / pointAmount; Vector3 forward = t.forward; Listvertices = new List(); for (int i = 0; i < pointAmount; i++) { Vector3 pos = Quaternion.Euler(0f, eachAngle * i, 0f) * forward * radius + center; vertices.Add(pos); } CreateMesh(vertices); } }
效果圖:
二、矩形檢測
using System.Collections; using System.Collections.Generic; using UnityEngine; ////// 矩形型攻擊檢測,並繪製檢測區域 ///public class DrawRectangDetect : MonoBehaviour { public Transform attacked; GameObject go; //生成矩形 MeshFilter mf; MeshRenderer mr; Shader shader; void Start () { } void Update () { if (Input.GetKeyDown(KeyCode.A)) { ToDrawRectangleSolid(transform, transform.localPosition, 4, 2); if (RectAttackJubge(transform, attacked, 4, 2f)) { Debug.Log("攻擊到"); } } if (Input.GetKeyUp(KeyCode.A)) { if (go != null) { Destroy(go); } } } ////// 矩形攻擊範圍 //////攻擊方///被攻擊方///矩形前方的距離///矩形寬度/2///public bool RectAttackJubge(Transform attacker, Transform attacked, float forwardDistance, float rightDistance) { Vector3 deltaA = attacked.position - attacker.position; float forwardDotA = Vector3.Dot(attacker.forward, deltaA); if (forwardDotA > 0 && forwardDotA <= forwardDistance) { if (Mathf.Abs(Vector3.Dot(attacker.right,deltaA)) < rightDistance) { return true; } } return false; } //製作網格 private GameObject CreateMesh(Listvertices) { int[] triangles; Mesh mesh = new Mesh(); int triangleAmount = vertices.Count - 2; triangles = new int[3 * triangleAmount]; for (int i = 0; i < triangleAmount; i++) { triangles[3 * 1] = 0; triangles[3 * i + 1] = i + 1; triangles[3 * i + 2] = i + 2; } if (go == null) { go = new GameObject("Rectang"); go.transform.position = new Vector3(0, 0.1f, 0); mf = go.AddComponent(); mr = go.AddComponent(); shader = Shader.Find("Unlit/Color"); } mesh.vertices = vertices.ToArray(); mesh.triangles = triangles; mf.mesh = mesh; mr.material.shader = shader; mr.material.color = Color.red; return go; } ////// 繪製實心長方形 //////矩形參考物///矩形的中心點///矩形長度///矩形寬度的一半public void ToDrawRectangleSolid(Transform t, Vector3 bottomMiddle, float length, float width) { Listvertices = new List(); vertices.Add(bottomMiddle - t.right * width); vertices.Add(bottomMiddle - t.right * width + t.forward * length); vertices.Add(bottomMiddle + t.right * width + t.forward * length); vertices.Add(bottomMiddle + t.right * width ); CreateMesh(vertices); } }
效果圖:
三、扇形攻擊檢測
using System.Collections; using System.Collections.Generic; using UnityEngine; ////// 扇型攻擊檢測,並繪製檢測區域 ///public class SectorDetect : MonoBehaviour { public Transform attacked; //受攻擊著 GameObject go; MeshFilter mf; MeshRenderer mr; Shader shader; void Start () { } void Update () { if (Input.GetKeyDown(KeyCode.A)) { ToDrawSectorSolid(transform, transform.localPosition, 60, 3); if (UmbrellaAttact(transform,attacked.transform,60,4)) { Debug.Log("受攻擊了"); } } if (Input.GetKeyUp(KeyCode.A)) { if (go != null) { Destroy(go); } } } ////// 扇形攻擊範圍 //////攻擊者///被攻擊方///扇形角度///扇形半徑///public bool UmbrellaAttact(Transform attacker, Transform attacked, float angle, float radius) { Vector3 deltaA = attacked.position - attacker.position; //Mathf.Rad2Deg : 弧度值到度轉換常度 //Mathf.Acos(f) : 返回參數f的反餘弦值 float tmpAngle = Mathf.Acos(Vector3.Dot(deltaA.normalized, attacker.forward)) * Mathf.Rad2Deg; if (tmpAngle < angle * 0.5f && deltaA.magnitude < radius) { return true; } return false; } public void ToDrawSectorSolid(Transform t, Vector3 center, float angle, float radius) { int pointAmmount = 100; float eachAngle = angle / pointAmmount; Vector3 forward = t.forward; Listvertices = new List(); vertices.Add(center); for (int i = 0; i < pointAmmount; i++) { Vector3 pos = Quaternion.Euler(0f, -angle / 2 + eachAngle * (i - 1), 0f) * forward * radius + center; vertices.Add(pos); } CreateMesh(vertices); } private GameObject CreateMesh(Listvertices) { int[] triangles; Mesh mesh = new Mesh(); int triangleAmount = vertices.Count - 2; triangles = new int[3 * triangleAmount]; //根據三角形的個數,來計算繪製三角形的頂點順序 for (int i = 0; i < triangleAmount; i++) { triangles[3 * i] = 0; triangles[3 * i + 1] = i + 1; triangles[3 * i + 2] = i + 2; } if (go == null) { go = new GameObject("mesh"); go.transform.position = new Vector3(0f, 0.1f, 0.5f); mf = go.AddComponent(); mr = go.AddComponent(); shader = Shader.Find("Unlit/Color"); } mesh.vertices = vertices.ToArray(); mesh.triangles = triangles; mf.mesh = mesh; mr.material.shader = shader; mr.material.color = Color.red; return go; } }



[sl_ivan ] Unity實現攻擊範圍檢測並繪製檢測區域已經有279次圍觀

http://coctec.com/docs/program/show-post-232913.html