Unity3D实现攻击范围检测
作者:BattleTiger 发布时间:2023-07-02 12:12:39
标签:Unity3D,检测
本文实例为大家分享了Unity3D实现攻击范围检测的具体代码,供大家参考,具体内容如下
一、扇形攻击范围检测
using UnityEngine;
using System.Collections;
public class AttackCHeck : MonoBehaviour
{
//要攻击的目标
public Transform Target;
//扇形距离 攻击距离 扇形的半径
private float SkillDistance = 5;
//扇形的角度 也就是攻击的角度
private float SkillJiaodu = 60;
private void Update()
{
//与敌人的距离
float distance = Vector3.Distance(transform.position, Target.position);
//玩家正前方的向量
Vector3 norVec = transform.rotation * Vector3.forward;
//玩家与敌人的方向向量
Vector3 temVec = Target.position - transform.position;
//求两个向量的夹角
float jiajiao = Mathf.Acos(Vector3.Dot(norVec.normalized, temVec.normalized)) * Mathf.Rad2Deg;
if (distance < SkillDistance)
{
if (jiajiao <= SkillJiaodu * 0.5f)
{
Debug.Log("在扇形范围内");
}
}
}
}
二、长方形范围攻击检测
using UnityEngine;
using System.Collections;
public class AttackCHeck : MonoBehaviour
{
//要攻击的目标
public Transform Target;
private void Update()
{
//计算玩家与敌人的距离
float distance = Vector3.Distance(transform.position, Target.position);
//玩家与敌人的方向向量
Vector3 temVec = Target.position - transform.position;
//与玩家正前方做点积
float forwardDistance = Vector3.Dot(temVec, transform.forward.normalized);
if (forwardDistance > 0 && forwardDistance <= 10)
{
float rightDistance = Vector3.Dot(temVec, transform.right.normalized);
if (Mathf.Abs(rightDistance) <= 3)
{
Debug.Log("进入攻击范围");
}
}
}
}
三、半圆形攻击范围检测
using UnityEngine;
using System.Collections;
public class AttackCHeck : MonoBehaviour
{
//要攻击的目标
public Transform Target;
private void Update()
{
//计算玩家与敌人的距离
float distance = Vector3.Distance(transform.position, Target.position);
//玩家与敌人的方向向量
Vector3 temVec = Target.position - transform.position;
//与玩家正前方做点积
float forwardDistance = Vector3.Dot(temVec, transform.forward.normalized);
if (forwardDistance > 0 && forwardDistance <= 10)
{
if (distance <= 5)
{
Debug.Log("进入攻击范围");
}
}
}
}
暂时就写三种吧!目前就遇到三种,以后遇到再更新.接下来介绍一下算法的核心知识点吧
其实这些小算法基本上用的全是向量的计算,向量的计算有两种
1.向量的点乘
–>A . B = |A| * |B| * cos θ
–>点乘应用
1).如果 让 A 等于单位向量 |A| ==1 c点积 等于 B 在 A 上的投影
2).如果 让 A B等于单位向量 arccos(a.b) == 夹角
2.向量的叉乘
–>A* B = C C就是A和B的法向量
–>叉乘应用
1).c 是有方向 。 通过 左手 定则 可以知道 C 的方向
2).所以叉乘一般是用来计算方向的
3).A 和 B 都是单位向量 arcsin(|A*B|) 等于 夹角
来源:https://blog.csdn.net/BattleTiger/article/details/77853675


猜你喜欢
- 前面有文章曾经地介绍过MediaPlayer的基本用法,这里就更加深入地讲解MediaPlayer的在线播放功能。本文主要实现MediaPl
- 实现的效果图:自定义Fragment继承BottomSheetDialogFragment重写它的三个方法:onCreateDialog()
- 在java 编程中,我们常常有这样的需求:需要将一段字符串内的特定字符串,按照一定规则查找出来或替换,比如匹配文本开头规则和结束规则。以下就
- AsyncTask不仅方便我们在子线程中对UI进行更新操作,还可以借助其本身的线程池来实现多线程任务。下面是一个使用AsyncTask来实现
- 最近碰到个需要下载zip压缩包的需求,于是我在网上找了下别人写好的zip工具类。但找了好多篇博客,总是发现有bug。因此就自己来写了个工具类
- 本文实例为大家分享了java实现文件下载的具体代码,供大家参考,具体内容如下public HttpServletResponse downl
- 上一篇文章:Android 10 启动分析之Init篇 (一)在前文提到,init进程会在在Trigger 为init的Action中,启动
- 一、maven * 搭建使用Nexus进行搭建,网上教程很多,不多赘述了。二、gradle配置在build.gradle文件的根节点中添加以下
- idea切换分支时,修改过的代码文件全部不见了找了一下问题,切换分支时,idea自动会创建暂存文件,点开,右边View --> 即可显
- 目录第一点——加载网页结构第二点——解析网页结构,转变为符合需求的数据实体第三点——保存数据实体,转变为符合需求的数据实体第四点——main
- 模式虽然精妙,却难完美,比如观察者模式中观察者生命周期的问题;比如访问者模式中循环依赖的问题等等;其它很多模式也存在这样那样的一些不足之处,
- Java如何实现线程中断?通过调用Thread类的实例方法interrupt。如下:Thread thread = new Thread()
- 使用IDEA开发微服务项目,需要启动多个微服务,可以开启IDEA的Run DashBoard窗口,需要对IDEA中指定工程的父工程进行配置进
- 场景女朋友最近被安排了一个企业微信添加客户的沙雕活,然后跟我吐槽说,每天都要加,都想离职了,为了不让女朋友那么难受,突然想到可以使用Robo
- volatile变量volatile是Java的关键词,我们可以用它来修饰变量或者方法。为什么要使用volatilevolatile的典型用
- 前言如果你玩过三国志这种类型的战旗游戏或者模拟城市、部落冲突、海岛奇兵这种模拟经营类的游戏,那么你对网格地图一定不会陌生。在这些游戏中,所有
- 最近遇到一个需求需要圆形listview作为悬浮窗,费了九牛二虎之力终于开发出来了,特别有成就感,下面分享下案例,项目原因,只能分享一部分供
- IO流Java中IO流分为两种,字节流和字符流,顾名思义字节流就是按照字节来读取和写入的,字符刘是按照字符来存取的;常用的文件读取用的就是字
- 目录安装 BenchmarkDotNet什么是基准测试创建基准测试代码运行 benchmarkBenchmarkDotNet 是一个轻量级,
- 前言作为 Android 开发者,想必多多少少要接触启动速度优化相关的事情,当用户越来越多,产品的功能也随着迭代越来越多,App 逐渐变得臃