Unity导弹自动追踪算法

2023-11-08 04:08

本文主要是介绍Unity导弹自动追踪算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

网上找了很久,没有找到满意的追踪算法,要么是2D的,要么就不逼真,只好自己硬憋了1天,终于硬憋出来了,效果图:

这个图是最初版本的效果,完善后的项目请见下方链接

视频演示

导弹追踪算法演示

核心代码:

using UnityEngine;[RequireComponent(typeof(Collider),typeof(AudioSource))]
public class Missile : MonoBehaviour
{[SerializeField, Tooltip("最大转弯速度")]private float MaximumRotationSpeed = 120.0f;[SerializeField, Tooltip("加速度")]private float AcceleratedVeocity = 12.8f;[SerializeField, Tooltip("最高速度")]private float MaximumVelocity = 30.0f;[SerializeField, Tooltip("生命周期")]private float MaximumLifeTime = 8.0f;[SerializeField, Tooltip("上升期时间")]private float AccelerationPeriod = 0.5f;[SerializeField, Tooltip("爆炸特效预制体")]private Explosion[] ExplosionPrefabs = null;[SerializeField, Tooltip("导弹渲染体组件")]private Renderer MissileRenderer = null;[SerializeField, Tooltip("尾焰及烟雾粒子特效")]private ParticleSystem[] MissileEffects = null;[HideInInspector]public Transform Target = null;        // 目标[HideInInspector]public float CurrentVelocity = 0.0f;   // 当前速度private AudioSource audioSource = null;   // 音效组件private float lifeTime = 0.0f;            // 生命期private void Start(){audioSource = GetComponent<AudioSource>();audioSource.loop = true;if (!audioSource.isPlaying)audioSource.Play();}// 爆炸private void Explode(){// 之所以爆炸时不直接删除物体,而是先禁用一系列组件,// 是因为导弹产生的烟雾等效果不应该立即消失// 禁止所有碰撞器foreach( Collider col in GetComponents<Collider>()){col.enabled = false;}// 禁止所有粒子系统foreach( ParticleSystem ps in MissileEffects){ps.Stop();}// 停止播放音效if (audioSource.isPlaying)audioSource.Stop();// 停止渲染,停止本脚本,随机实例化爆炸特效,删除本物体MissileRenderer.enabled = false;enabled = false;Instantiate(ExplosionPrefabs[Random.Range(0, ExplosionPrefabs.Length)], transform.position, Random.rotation);// 三秒后删除导弹物体,这时候烟雾已经散去,可以删掉物体了Destroy(gameObject, 3.0f);}private void Update(){float deltaTime = Time.deltaTime;lifeTime += deltaTime;// 如果超出生命周期,则直接爆炸。if( lifeTime > MaximumLifeTime ){Explode();return;}// 计算朝向目标的方向偏移量,如果处于上升期,则忽略目标Vector3 offset =((lifeTime < AccelerationPeriod) && (Target != null))? Vector3.up: (Target.position - transform.position).normalized;// 计算当前方向与目标方向的角度差float angle = Vector3.Angle(transform.forward, offset);// 根据最大旋转速度,计算转向目标共计需要的时间float needTime = angle / ( MaximumRotationSpeed * ( CurrentVelocity / MaximumVelocity ));// 如果角度很小,就直接对准目标if (needTime < 0.001f){transform.forward = offset;}else{// 当前帧间隔时间除以需要的时间,获取本次应该旋转的比例。transform.forward = Vector3.Slerp(transform.forward, offset, deltaTime / needTime).normalized;}// 如果当前速度小于最高速度,则进行加速if (CurrentVelocity < MaximumVelocity )CurrentVelocity += deltaTime * AcceleratedVeocity;// 朝自己的前方位移transform.position += transform.forward * CurrentVelocity * deltaTime;}private void OnTriggerEnter(Collider other){// 当发生碰撞,爆炸Explode();}
}

 

最新版本:

猛击此处,点击查看视频演示。

猛击此处,下载演示升级版(带导弹各种参数调整UI)。

猛击此处下载工程源代码

这篇关于Unity导弹自动追踪算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/367771

相关文章

IDEA如何让控制台自动换行

《IDEA如何让控制台自动换行》本文介绍了如何在IDEA中设置控制台自动换行,具体步骤为:File-Settings-Editor-General-Console,然后勾选Usesoftwrapsin... 目录IDEA如何让控制台自http://www.chinasem.cn动换行操作流http://www

vscode保存代码时自动eslint格式化图文教程

《vscode保存代码时自动eslint格式化图文教程》:本文主要介绍vscode保存代码时自动eslint格式化的相关资料,包括打开设置文件并复制特定内容,文中通过代码介绍的非常详细,需要的朋友... 目录1、点击设置2、选择远程--->点击右上角打开设置3、会弹出settings.json文件,将以下内

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

SpringBoot如何使用TraceId日志链路追踪

《SpringBoot如何使用TraceId日志链路追踪》文章介绍了如何使用TraceId进行日志链路追踪,通过在日志中添加TraceId关键字,可以将同一次业务调用链上的日志串起来,本文通过实例代码... 目录项目场景:实现步骤1、pom.XML 依赖2、整合logback,打印日志,logback-sp

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

SpringBoot项目启动后自动加载系统配置的多种实现方式

《SpringBoot项目启动后自动加载系统配置的多种实现方式》:本文主要介绍SpringBoot项目启动后自动加载系统配置的多种实现方式,并通过代码示例讲解的非常详细,对大家的学习或工作有一定的... 目录1. 使用 CommandLineRunner实现方式:2. 使用 ApplicationRunne

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur

Spring使用@Retryable实现自动重试机制

《Spring使用@Retryable实现自动重试机制》在微服务架构中,服务之间的调用可能会因为一些暂时性的错误而失败,例如网络波动、数据库连接超时或第三方服务不可用等,在本文中,我们将介绍如何在Sp... 目录引言1. 什么是 @Retryable?2. 如何在 Spring 中使用 @Retryable

使用 Python 和 LabelMe 实现图片验证码的自动标注功能

《使用Python和LabelMe实现图片验证码的自动标注功能》文章介绍了如何使用Python和LabelMe自动标注图片验证码,主要步骤包括图像预处理、OCR识别和生成标注文件,通过结合Pa... 目录使用 python 和 LabelMe 实现图片验证码的自动标注环境准备必备工具安装依赖实现自动标注核心