最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Unity實(shí)現(xiàn)攻擊范圍檢測并繪制檢測區(qū)域

 更新時間:2020年04月28日 14:49:56   作者:畫個小圓兒  
這篇文章主要介紹了Unity實(shí)現(xiàn)攻擊范圍檢測并繪制檢測區(qū)域,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Unity實(shí)現(xiàn)攻擊范圍檢測并繪制檢測區(qū)域的具體代碼,供大家參考,具體內(nèi)容如下

一、圓形檢測

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
/// <summary>
/// 圓形檢測,并繪制出運(yùn)行的攻擊范圍
/// </summary>
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);
      }
    }
 }
 
  /// <summary>
  /// 圓形檢測
  /// </summary>
  /// <param name="attacked">被攻擊者</param>
  /// <param name="skillPostion">技能的位置</param>
  /// <param name="radius">半徑</param>
  /// <returns></returns>
  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;
    }
  }
 
  //生成網(wǎng)格
  public GameObject CreateMesh(List<Vector3> vertices)
  {
    int[] triangles;
    Mesh mesh = new Mesh();
    int triangleAmount = vertices.Count - 2;
    triangles = new int[3 * triangleAmount];
 
    //根據(jù)三角形的個數(shù),來計(jì)算繪制三角形的頂點(diǎn)順序
    //順序必須為順時針或者逆時針
    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<MeshFilter>();
      mr = go.AddComponent<MeshRenderer>();
      shader = Shader.Find("Unlit/Color");
    }
    //分配一個新的頂點(diǎn)位置數(shù)組
    mesh.vertices = vertices.ToArray();
    //包含網(wǎng)格中所有三角形的數(shù)組
    mesh.triangles = triangles;
    mf.mesh = mesh;
    mr.material.shader = shader;
    mr.material.color = Color.red;
    return go;
 
  }
 
  /// <summary>
  /// 繪制實(shí)心圓形
  /// </summary>
  /// <param name="t">圓形參考物</param>
  /// <param name="center">圓心</param>
  /// <param name="radius">半徑</param>
  public void ToDrawCircleSolid(Transform t, Vector3 center, float radius)
  {
    int pointAmount = 100;
    float eachAngle = 360f / pointAmount;
    Vector3 forward = t.forward;
 
    List<Vector3> vertices = new List<Vector3>();
    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;
 
 
/// <summary>
/// 矩形型攻擊檢測,并繪制檢測區(qū)域
/// </summary>
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);
      }
    }
 }
 
  /// <summary>
  /// 矩形攻擊范圍
  /// </summary>
  /// <param name="attacker">攻擊方</param>
  /// <param name="attacked">被攻擊方</param>
  /// <param name="forwardDistance">矩形前方的距離</param>
  /// <param name="rightDistance">矩形寬度/2</param>
  /// <returns></returns>
  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;
  }
 
  //制作網(wǎng)格
  private GameObject CreateMesh(List<Vector3> 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 * 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<MeshFilter>();
      mr = go.AddComponent<MeshRenderer>();
 
      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;
  }
 
 
  /// <summary>
  /// 繪制實(shí)心長方形
  /// </summary>
  /// <param name="t">矩形參考物</param>
  /// <param name="bottomMiddle">矩形的中心點(diǎn)</param>
  /// <param name="length">矩形長度</param>
  /// <param name="width">矩形寬度的一半</param>
  public void ToDrawRectangleSolid(Transform t, Vector3 bottomMiddle, float length, float width)
  {
    List<Vector3> vertices = new List<Vector3>();
 
    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;
 
/// <summary>
/// 扇型攻擊檢測,并繪制檢測區(qū)域
/// </summary>
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);
      }
    }
 }
 
  /// <summary>
  /// 扇形攻擊范圍
  /// </summary>
  /// <param name="attacker">攻擊者</param>
  /// <param name="attacked">被攻擊方</param>
  /// <param name="angle">扇形角度</param>
  /// <param name="radius">扇形半徑</param>
  /// <returns></returns>
  public bool UmbrellaAttact(Transform attacker, Transform attacked, float angle, float radius)
  {
    Vector3 deltaA = attacked.position - attacker.position;
 
    //Mathf.Rad2Deg : 弧度值到度轉(zhuǎn)換常度
    //Mathf.Acos(f) : 返回參數(shù)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;
    List<Vector3> vertices = new List<Vector3>();
 
    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(List<Vector3> vertices)
  {
    int[] triangles;
    Mesh mesh = new Mesh();
 
    int triangleAmount = vertices.Count - 2;
    triangles = new int[3 * triangleAmount];
 
    //根據(jù)三角形的個數(shù),來計(jì)算繪制三角形的頂點(diǎn)順序
    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<MeshFilter>();
      mr = go.AddComponent<MeshRenderer>();
 
      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;
  }
}

效果圖:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關(guān)文章

  • C#后端接收form-data,創(chuàng)建實(shí)體類教程

    C#后端接收form-data,創(chuàng)建實(shí)體類教程

    這篇文章主要介紹了C#后端接收form-data,創(chuàng)建實(shí)體類教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • c#字符串去掉空格的二種方法(去掉兩端空格)

    c#字符串去掉空格的二種方法(去掉兩端空格)

    本文主要介紹了字符串去掉兩端空格,并且將字符串中多個空格替換成一個空格的方法,需要的朋友可以參考下
    2014-02-02
  • C# 透明窗體制作實(shí)現(xiàn)方法比較分析

    C# 透明窗體制作實(shí)現(xiàn)方法比較分析

    制作透明窗體辦法有好幾種,各有優(yōu)缺點(diǎn).我們先來看看C#本身提供的辦法:通過設(shè)置窗體的 TransparencyKey實(shí)現(xiàn),需要的朋友可以了解下
    2012-12-12
  • Unity 點(diǎn)擊UI與點(diǎn)擊屏幕沖突的解決方案

    Unity 點(diǎn)擊UI與點(diǎn)擊屏幕沖突的解決方案

    這篇文章主要介紹了Unity 點(diǎn)擊UI與點(diǎn)擊屏幕沖突的解決方案,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C# 變量作用域常用說明小結(jié)

    C# 變量作用域常用說明小結(jié)

    在C#編程中,變量作用域是一個重要概念,指的是變量在何處被定義和可以訪問的范圍,正確理解和使用變量作用域有助于提升代碼的可讀性和避免潛在的錯誤,感興趣的可以了解一下
    2024-10-10
  • 詳解c# 委托鏈

    詳解c# 委托鏈

    這篇文章主要介紹了c# 委托鏈的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Linq利用Distinct去除重復(fù)項(xiàng)問題(可自己指定)

    Linq利用Distinct去除重復(fù)項(xiàng)問題(可自己指定)

    這篇文章主要介紹了Linq利用Distinct去除重復(fù)項(xiàng)問題(可自己指定),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C#正則表達(dá)式與HashTable詳解

    C#正則表達(dá)式與HashTable詳解

    這篇文章主要介紹了C#正則表達(dá)式與HashTable詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • C#實(shí)現(xiàn)數(shù)組元素的數(shù)據(jù)類型轉(zhuǎn)換方法詳解

    C#實(shí)現(xiàn)數(shù)組元素的數(shù)據(jù)類型轉(zhuǎn)換方法詳解

    這篇文章主要為大家介紹了C#中一維數(shù)組如何快速實(shí)現(xiàn)數(shù)組元素的數(shù)據(jù)類型的轉(zhuǎn)換,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-04-04
  • C# Process調(diào)用外部程序的實(shí)現(xiàn)

    C# Process調(diào)用外部程序的實(shí)現(xiàn)

    這篇文章主要介紹了C# Process調(diào)用外部程序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02

最新評論

嘉善县| 衡阳县| 沂南县| 仁寿县| 辽源市| 湖口县| 葫芦岛市| 怀化市| 翁牛特旗| 濮阳县| 荥经县| 鹤壁市| 轮台县| 怀宁县| 富锦市| 新巴尔虎左旗| 湘潭市| 习水县| 开鲁县| 来宾市| 福海县| 旺苍县| 咸阳市| 常熟市| 家居| 九龙城区| 灵宝市| 双流县| 上饶市| 东兰县| 济源市| 汉阴县| 温泉县| 丹阳市| 瑞金市| 星子县| 茶陵县| 同德县| 留坝县| 鄂托克旗| 哈尔滨市|