Unity开发中导弹路径散射的原理与实现

Unity开发中导弹路径散射的原理与实现

  • 前言
  • 逻辑原理
  • 代码实现
    • 导弹自身脚本
    • 外部控制脚本
  • 应用效果
  • 结语

前言

前面我们学习了导弹的追踪的效果,但是在动画或游戏中,我们经常可以看到导弹发射后的弹道是不规则的,扭扭曲曲的飞行,然后击中目标。
这期我们就讲一下不规则路径飞行的逻辑,在游戏中是如何实现的。

请添加图片描述

逻辑原理

首先迎面走来的是初级的散射效果原理图,在发射点和目标点之间有一个散射经过点,重点来了:**利用三维空间中球形公式,给定球心,随机返回球面上一点。**然后让导弹经过随机点再击打目标,就会形成随机散射的效果。
在这里插入图片描述
多点也是一样的道理,把路径点经过换算之后再赋值导弹路径点,然后形成不规则散射的效果。
在这里插入图片描述
这里可以发现,导弹的路径是折线效果,按标准应该是曲线效果。两者的区别就在于导弹在两点之间的过渡函数,折线是平滑过渡,曲线是贝塞尔曲线过渡,选的过渡函数不同实现的效果也不一样。由于贝塞尔曲线过渡较为复杂,这里就用平滑过渡演示原理

代码实现

导弹自身脚本

这里将散射的范围用变量表示,实现可控的效果,想大范围就大范围、想小范围就小范围。将脚本挂载到导弹的预制体上之后给相应的变量赋值,例如:散射半径、爆炸特效、子弹移动速度,其他变量通过外部脚本赋值。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class SpherePoint : MonoBehaviour
{[Header("散射半径")]public float radius;public GameObject FX;//爆炸特效public Transform endPoint;   // 目标点  public List<Transform> wayPoints; // 中间点列表  public float speed = 10f;         // 子弹移动速度  public int currentWaypointIndex = 0; // 当前处理的中间点索引  public Vector3 currentTargetPosition; // 当前目标位置  // Start is called before the first frame updatevoid Start(){if (wayPoints.Count > 0){currentTargetPosition = GetRandomPointOnSphere(wayPoints[0].position, radius);}else{currentTargetPosition = endPoint.position;}}// Update is called once per framevoid Update(){BulletMovement(transform);}/// <summary>/// 随机获取中间点周围的散射经过点/// </summary>/// <param name="center">中间点坐标</param>/// <param name="r">散射半径</param>/// <returns></returns>public static Vector3 GetRandomPointOnSphere(Vector3 center, float r){// 生成随机的经度和纬度  float u = UnityEngine.Random.value * 2 * Mathf.PI; // 经度 [0, 2*PI]  float v = UnityEngine.Random.value * Mathf.PI; // 纬度 [0, PI]  // 将球坐标转换为笛卡尔坐标  float x = center.x + r * Mathf.Sin(v) * Mathf.Cos(u);float y = center.y + r * Mathf.Sin(v) * Mathf.Sin(u);float z = center.z + r * Mathf.Cos(v);//返回指定球心的球面上随机一点return new Vector3(x, y, z);}private void BulletMovement(Transform bulletTran){// 子弹朝向当前目标位置  bulletTran.LookAt(currentTargetPosition);bulletTran.position += bulletTran.forward * speed * Time.deltaTime;      //向前移动// 检查子弹是否到达当前目标位置  if (Vector3.Distance(bulletTran.position, currentTargetPosition) < 0.1f){// 如果当前点不是最后一个中间点,则更新下一个目标位置为下一个中间点  if (currentWaypointIndex < wayPoints.Count){currentWaypointIndex++;if (currentWaypointIndex < wayPoints.Count){currentTargetPosition = GetRandomPointOnSphere(wayPoints[currentWaypointIndex].position, radius);}else{currentTargetPosition = endPoint.position; // 最后一个中间点后,目标位置是终点  }}// 如果已经到达终点,可以选择销毁子弹或其他操作  else if (currentTargetPosition == endPoint.position){GameObject tempFX = Instantiate(FX, bulletTran.position, bulletTran.rotation);  //生成一个爆炸特效 并给予位置和旋转信息Destroy(gameObject);//销毁自己Destroy(tempFX, 0.3f);//销毁爆炸效果currentWaypointIndex = 0;//重置路径索引}}}}

在这里插入图片描述

外部控制脚本

将导弹的击打目标和散射路径点通过脚本告诉导弹。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class InstantiateBullet : MonoBehaviour
{public GameObject bullet;//导弹预制体public Vector3 startPoint; // 导弹出生发射点  public Quaternion missileRotation;//导弹出生时方向public Transform endPoint;   // 目标点  public List<Transform> wayPoints; // 中间点列表  // Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){//鼠标点击左键发射导弹if (Input.GetMouseButtonDown(0)){GameObject bu = Instantiate(bullet, startPoint, missileRotation);bu.GetComponent<SpherePoint>().endPoint = endPoint;bu.GetComponent<SpherePoint>().wayPoints = wayPoints;}}
}

外部脚本我挂载到了Main Camera相机上。

在这里插入图片描述

应用效果

先看个正面的:

请添加图片描述

再来个侧面的:

请添加图片描述

好了,结束。

结语

学会后要多尝试,变成自己的东西,为己所用,赶快自己尝试下吧。有什么问题可以评论区或私信留言,下期见,拜拜。

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/690987.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Reactor Netty 其他-响应式编程-018

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace The Nex…

vue3点击添加小狗图片,vue3拆分脚本

我悄悄蒙上你的眼睛 模板和样式 <template><div class"XueXi_Hooks"><img v-for"(dog, index) in dog1List" :src"dog" :key"index" /><button click"addDog1">点我添加狗1</button><hr …

每日一题9:Pandas-填充缺失值

一、每日一题 DataFrame products --------------------- | Column Name | Type | --------------------- | name | object | | quantity | int | | price | int | ---------------------编写一个解决方案&#xff0c;在 quantity 列中将缺失的值 编…

Leetcode 剑指 Offer II 077.排序链表

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排…

Xilinx 千兆以太网TEMAC IP核 MDIO 配置及物理接口

基于AXI4-Lite接口可以访问MDIO(Management Data Input/Output)接口&#xff0c;而MDIO接口连接MAC外部的PHY芯片&#xff0c;用户可通过AXI4-Lite接口实现对PHY芯片的配置。 1 MDIO接口简介 开放系统互连模型OSI的最低两层分别是数据链路层和物理层&#xff0c;数据链路层的…

音视频入门基础:像素格式专题(2)——不通过第三方库将RGB24格式视频转换为BMP格式图片

音视频入门基础&#xff1a;像素格式专题系列文章&#xff1a; 音视频入门基础&#xff1a;像素格式专题&#xff08;1&#xff09;——RGB简介 音视频入门基础&#xff1a;像素格式专题&#xff08;2&#xff09;——不通过第三方库将RGB24格式视频转换为BMP格式图片 一、引…

xilinx xdma drive 传输8MB以上数据受限的问题

当传输超过8 MB数据时报错error code1359&#xff0c; #define XDMA_MAX_TRANSFER_SIZE (8UL * 1024UL * 1024UL) 可以修改成&#xff1a; #define XDMA_MAX_TRANSFER_SIZE (80UL * 1024UL * 1024UL) VS2019 WDK环境的搭建 先准备好VS WDK的驱动开发环境。需要下载VS、SD…

5 个遥遥领先的大模型 RAG 工具

想象一下拥有一种超能力&#xff0c;让你能够对任何问题或提示生成类似人类的回答&#xff0c;同时还能够利用庞大的外部知识库确保准确性和相关性。这不是科幻小说&#xff0c;这就是检索增强生成&#xff08;RAG&#xff09;的力量。 在本文中&#xff0c;我们将介绍五大遥遥…

NASA数据集——2002-2011年全球18.7 至 89.0 千兆赫的亮度温度、海冰浓度和海冰积雪深度三级网格产品(AE_SI12)数据

AMSR-E/Aqua Daily L3 12.5 km Brightness Temperature, Sea Ice Concentration, & Snow Depth Polar Grids V003 三级网格产品&#xff08;AE_SI12&#xff09;包括 18.7 至 89.0 千兆赫的亮度温度、海冰浓度和海冰积雪深度。 简介 美国国家航空航天局地球观测系统 Aqu…

几个Python处理Excel实际应用

下面介绍四个不同类型的Python处理Excel的经典应用案例&#xff0c;以帮助读者更好地掌握Python处理Excel的技能。 一、读取Excel数据 Python通过pandas库可以轻松地读取Excel数据。pandas库是一个专门用于数据分析和处理的库&#xff0c;它可以将Excel中的数据读取为DataFra…

HIVE调优MapJoin

HIVE调优MapJoin 目录 HIVE调优MapJoin 1.mapjoin &#xff08;1.2以后自动默认启动mapjoin&#xff09; 2.创建表格 3.查询建表 4.通过 explain 展示执行计划 5.Map JOIN 相关设置&#xff1a; 1.mapjoin &#xff08;1.2以后自动默认启动mapjoin&#xff09;…

08.3.grafana自定义图形

grafana自定义图形 找插件里面的zabbix 点击update 数据源—zabbix数据源,添加zabbix数据源 选择zabbix类型 我这里配置的是本地&#xff0c;所以URL直接localhost 这里配置zabbix登录账号密码Admin/zabbix 然后点击保存并测试&#xff0c;会直接显示版本 导入模板&…