zoukankan      html  css  js  c++  java
  • 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     }

    具体效果:

    *** |  以上内容仅为学习参考、学习笔记使用  | ***

  • 相关阅读:
    UVA 1400."Ray, Pass me the dishes!" -分治+线段树区间合并(常规操作+维护端点)并输出最优的区间的左右端点-(洛谷 小白逛公园 升级版)
    SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并
    洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间合并(单点更新、区间查询)
    HDU 3074.Multiply game-区间乘法-线段树(单点更新、区间查询),上推标记取模
    HDU 3183.A Magic Lamp-区间找最小值-RMQ(ST)
    HDU 1231.最大连续子序列-dp+位置标记
    牛客网 牛客练习赛43 F.Tachibana Kanade Loves Game-容斥(二进制枚举)+读入挂
    CodeForce-811B Vladik and Complicated Book(水题)
    POJ1426——Find The Multiple (简单搜索+取余)
    POJ——3278 Catch That Cow(BFS队列)
  • 原文地址:https://www.cnblogs.com/ChenZiRong1999/p/13292322.html
Copyright © 2011-2022 走看看