欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

一、圓形檢測(cè)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
/// <summary>
/// 圓形檢測(cè),并繪制出運(yùn)行的攻擊范圍
/// </summary>
public class CircleDetect : MonoBehaviour {
 
  GameObject go;  //生成矩形的對(duì)象
  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>
  /// 圓形檢測(cè)
  /// </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ù)三角形的個(gè)數(shù),來(lái)計(jì)算繪制三角形的頂點(diǎn)順序
    //順序必須為順時(shí)針或者逆時(shí)針
    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");
    }
    //分配一個(gè)新的頂點(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);
  }
 
}

效果圖:

二、矩形檢測(cè)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
 
/// <summary>
/// 矩形型攻擊檢測(cè),并繪制檢測(cè)區(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í)心長(zhǎng)方形
  /// </summary>
  /// <param name="t">矩形參考物</param>
  /// <param name="bottomMiddle">矩形的中心點(diǎn)</param>
  /// <param name="length">矩形長(zhǎng)度</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);
  }
}

效果圖:

三、扇形攻擊檢測(cè)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
/// <summary>
/// 扇型攻擊檢測(cè),并繪制檢測(cè)區(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ù)三角形的個(gè)數(shù),來(lái)計(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;
  }
}

效果圖:

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

相關(guān)文章

  • C#中使用gRPC通訊的示例詳解

    C#中使用gRPC通訊的示例詳解

    這篇文章主要為大家詳細(xì)介紹了C#中如何使用gRPC通訊,包括GRPC文件的創(chuàng)建生成、服務(wù)端和客戶端函數(shù)類庫(kù)的封裝等,需要的可以了解下
    2024-04-04
  • WinForm下 TextBox只允許輸入數(shù)字的小例子

    WinForm下 TextBox只允許輸入數(shù)字的小例子

    WinForm下 TextBox只允許輸入數(shù)字的小例子,需要的朋友可以參考一下
    2013-04-04
  • 基于Unity實(shí)現(xiàn)2D邊緣檢測(cè)

    基于Unity實(shí)現(xiàn)2D邊緣檢測(cè)

    這篇文章主要介紹了如何利用Unity實(shí)現(xiàn)2D邊緣檢測(cè),從而達(dá)到人物描邊效果。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-04-04
  • C#異步編程幾點(diǎn)需要注意的地方

    C#異步編程幾點(diǎn)需要注意的地方

    這篇文章我們來(lái)討論下關(guān)于C#異步編程幾個(gè)不成文的建議,希望對(duì)你寫出高性能的異步編程代碼有所幫助
    2020-05-05
  • 一步步教你如何創(chuàng)建第一個(gè)C#項(xiàng)目

    一步步教你如何創(chuàng)建第一個(gè)C#項(xiàng)目

    這篇文章主要給大家介紹了關(guān)于如何創(chuàng)建第一個(gè)C#項(xiàng)目的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-12-12
  • C# 從枚舉值獲取對(duì)應(yīng)的文本描述詳解

    C# 從枚舉值獲取對(duì)應(yīng)的文本描述詳解

    這篇文章主要介紹了C# 從枚舉值獲取對(duì)應(yīng)的文本描述詳解的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • C# 反射與 Quartz 實(shí)現(xiàn)流程處理詳情

    C# 反射與 Quartz 實(shí)現(xiàn)流程處理詳情

    根據(jù)要實(shí)現(xiàn)流程處理,比如用戶可以定義一個(gè)定時(shí)任務(wù),每周一查看報(bào)表。任務(wù)是用Quartz可實(shí)現(xiàn),但用戶自己選擇報(bào)表就比較麻煩,這時(shí)因?yàn)橄到y(tǒng)的不同模塊的生成報(bào)表的函數(shù)不同,這時(shí)便可以傳入一個(gè)方法名和方法的輸入?yún)?shù),就可以調(diào)用該方法。下面小編我為大家介紹具體過(guò)程
    2021-09-09
  • C#調(diào)用Windows的API實(shí)現(xiàn)窗體動(dòng)畫

    C#調(diào)用Windows的API實(shí)現(xiàn)窗體動(dòng)畫

    在VF、VB、PB的應(yīng)用中,有些無(wú)法通過(guò)語(yǔ)言工具本身來(lái)完成的或者做得不理想的功能,我們會(huì)考慮通過(guò)Windows的API來(lái)完成。本文就來(lái)通過(guò)調(diào)用Windows的API實(shí)現(xiàn)窗體動(dòng)畫,感興趣的可以嘗試一下
    2022-11-11
  • 基于C#實(shí)現(xiàn)的敏感字檢測(cè)示例

    基于C#實(shí)現(xiàn)的敏感字檢測(cè)示例

    這篇文章主要介紹了基于C#實(shí)現(xiàn)的敏感字檢測(cè)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • C#實(shí)現(xiàn)顯示CPU使用率與內(nèi)存使用率

    C#實(shí)現(xiàn)顯示CPU使用率與內(nèi)存使用率

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)顯示CPU使用率與內(nèi)存使用率,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以了解一下
    2022-12-12

最新評(píng)論