Unity实现攻击范围检测并绘制检测区域

本文实例为大家分享了Unity实现攻击范围检测并绘制检测区域的具体代码,供大家参考,具体内容如下

一、圆形检测

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 圆形检测,并绘制出运行的攻击范围
/// </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;
    }
  }

  //生成网格
  public 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 * 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");
    }
    //分配一个新的顶点位置数组
    mesh.vertices = vertices.ToArray();
    //包含网格中所有三角形的数组
    mesh.triangles = triangles;
    mf.mesh = mesh;
    mr.material.shader = shader;
    mr.material.color = Color.red;
    return go;

  }

  /// <summary>
  /// 绘制实心圆形
  /// </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>
/// 矩形型攻击检测,并绘制检测区域
/// </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;
  }

  //制作网格
  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>
  /// 绘制实心长方形
  /// </summary>
  /// <param name="t">矩形参考物</param>
  /// <param name="bottomMiddle">矩形的中心点</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>
/// 扇型攻击检测,并绘制检测区域
/// </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 : 弧度值到度转换常度
    //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;
    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];

    //根据三角形的个数,来计算绘制三角形的顶点顺序
    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;
  }
}

效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Unity3D实现攻击范围检测

    本文实例为大家分享了Unity3D实现攻击范围检测的具体代码,供大家参考,具体内容如下 一.扇形攻击范围检测 using UnityEngine; using System.Collections; public class AttackCHeck : MonoBehaviour { //要攻击的目标 public Transform Target; //扇形距离 攻击距离 扇形的半径 private float SkillDistance = 5; //扇形的角度 也就是攻击的角度 priva

  • Unity实现攻击范围检测并绘制检测区域

    本文实例为大家分享了Unity实现攻击范围检测并绘制检测区域的具体代码,供大家参考,具体内容如下 一.圆形检测 using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// 圆形检测,并绘制出运行的攻击范围 /// </summary> public class CircleDetect : MonoBehaviour { GameObject go;

  • Python实现笑脸检测+人脸口罩检测功能

    目录 一.人脸图像特征提取方法 二.对笑脸数据集genki4k进行训练和测试(包括SVM.CNN),输出模型训练精度和测试精度(F1-score和ROC),实现检测图片笑脸和实时视频笑脸检测 (一)环境.数据集准备 (二)训练笑脸数据集genki4k (三)图片笑脸检测 (四)实时视频笑脸检测 三.将笑脸数据集换成人脸口罩数据集,并对口罩数据集进行训练,编写程序实现人脸口罩检测 (一)训练人脸口罩数据集 (二)编程实现人脸口罩检测 一.人脸图像特征提取方法 https://www.jb51.ne

  • JavaScript+html5 canvas绘制渐变区域完整实例

    本文实例讲述了JavaScript+html5 canvas绘制渐变区域的方法.分享给大家供大家参考,具体如下: 运行效果截图如下: 具体代码如下: <!DOCTYPE html> <html> <head> <title>demo</title> <style type="text/css"> #canvas { border:3px solid gray; } </style> </head&

  • Vue结合openlayers按照经纬度坐标实现锚地标记及绘制多边形区域

    目录 前言 1.安装openlayers 2.引入模块 3.地图与弹窗html样式 4.data数据定义 5.methods方法 6.mounted数据加载 7.锚地数据获取 前言 本文介绍vue结合openlayers实现根据返回的经纬度坐标完成锚地标记.绘制多边形区域: 注意点: 1.根据返回的经纬度取第一个坐标作为锚地图标位置: 2.根据返回的经纬度坐标数据,这里的后台数据需要处理(根据返回的数据处理成需要的格式),得到坐标数组渲染绘制区域画图显示在航道图层上. 3.关于数据渲染的问题:

  • opencv python 图像轮廓/检测轮廓/绘制轮廓的方法

    图像的轮廓检测,如计算多边形外界.形状毕竟.计算感兴趣区域等. Contours : Getting Started 轮廓 简单地解释为连接所有连续点(沿着边界)的曲线,具有相同的颜色或强度. 轮廓是形状分析和物体检测和识别的有用工具 NOTE 为获得更好的准确性,请使用二值图,在找到轮廓之前,应用阈值法或canny边缘检测 从OpenCV 3.2开始,findContours()不再修改源图像,而是将修改后的图像作为三个返回参数中的第一个返回 在OpenCV中,查找轮廓是从黑色背景中查找白色对

  • OpenCV实现轮廓检测与绘制

    图像的轮廓不仅能够提供物体的边缘,而且还能提供物体边缘之间的层次关系以及拓扑关系. 带有结构关系的边缘检测,这种结构关系可以表明图像中连通域或者某些区域之间的关系. 图为一个具有4个不连通边缘的二值化图像,由外到内依次为0号.1号.2号.3号条边缘.为了描述不同轮廓之间的结构关系,定义由外到内的轮廓级别越来越低,也就是高一层级的轮廓包围着较低层级的轮廓,被同一个轮廓包围的多个不互相包含的轮廓是同一层级轮廓.例如在图中,0号轮廓层级比1号和第2号轮廓的层及都要高,2号轮廓包围着3号轮廓,因此2号轮

  • Python Opencv任意形状目标检测并绘制框图

    opencv 进行任意形状目标识别,供大家参考,具体内容如下 工作中有一次需要在简单的图上进行目标识别,目标的形状不固定,并且存在一定程度上的噪声影响,但是噪声影响不确定.这是一个简单的事情,因为图像并不复杂,现在将代码公布如下: import cv2 def otsu_seg(img): ret_th, bin_img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU) return ret_th, bin_img d

  • javascript 特性检测并非浏览器检测

    我大致翻译了部分文章,可能有理解错误的地方,敬请指正.值得一提的是,评论部分的争论亦值得一看. 特性检测 起初前端工程师们就极力反对浏览器检测,他们认为类似user-agent嗅探的方法是很不好的,理由是它并不是一种面向未来的代码,无法适应新版的浏览器.更好的做法是使用特性检测,就像这样: 复制代码 代码如下: if (navigator.userAgent.indexOf("MSIE 7") > -1){ //do something } 而更好的做法是这样: 复制代码 代码如

  • opencv基于Haar人脸检测和眼睛检测

    在这里,我们将进行人脸检测.最初,该算法需要大量正图像(面部图像)和负图像(无面部图像)来训练分类器.然后,我们需要从中提取特征.为此,使用下图所示的Haar功能.它们就像我们的卷积核.每个特征都是通过从黑色矩形下的像素总和中减去白色矩形下的像素总和而获得的单个值. 现在,每个内核的所有可能大小和位置都用于计算许多功能.(试想一下它需要多少计算?即使是一个24x24的窗口也会产生超过160000个特征).对于每个特征计算,我们需要找到白色和黑色矩形下的像素总和.为了解决这个问题,他们引入了整体形

  • Android实现扫一扫功能之绘制指定区域透明区域

    一.概述 在实现扫一扫的功能的时候,我们需要绘制一个中间为透明的扫码框,其余部分为半透明.通常情况下,例如微信或者支付宝的扫码框都是矩形的,如果中间的扫码框是一个矩形,那么布局是很简单的,可是如果扫码框是一个圆角矩形,或者圆形等情况怎么办呢?这篇文章主要是记录绘制一个中间透明带圆角的矩形. 按照惯例,我们先来看看效果图 : 二.按照流程我们就开始来看看代码啦 1.CustomDrawable,支持中间出现透明区域的drawable package per.juan.scandome; impor

随机推荐