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.xdnf.cn/news/1420167.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Linux服务器常用巡检命令,查看日志

查看日志 3.1 通过journalctl命令查看系统日志 命令&#xff1a;journalctl 3.2 通过tail查看系统日志 查看日志文件多少行代码&#xff1a;tail -n [行数] [日志文件] 4. 服务状态 4.1 查看指定服务的状态 命令&#xff1a;systemctl status <service> 比如查看防火墙…

软考-软件工程

软件工程概述 软件工程指的是应用计算机科学、数学及管理科学等原理&#xff0c;以工程化的原则和方法来解决软件 问题的工程&#xff0c;目的是提高软件生产率、提高软件质量、降低软件成本。 概述&#xff1a; 软件开发模型&#xff1a;指导软件开发的体系 需求分析确定软件…

##15 探索高级数据增强技术以提高模型泛化能力

文章目录 前言数据增强的重要性常见的数据增强技术高级数据增强技术在PyTorch中实现数据增强结论 前言 在深度学习领域&#xff0c;数据增强是一种有效的技术&#xff0c;它可以通过在原始数据上应用一系列变换来生成新的训练样本&#xff0c;从而增加数据的多样性&#xff0c…

Remix Client/Server 架构

Remix 框架是服务端渲染架构&#xff0c;当路由请求时生成 HTML 并返回浏览器。这种 SSR 是如何实现的呢&#xff1f;如果不使用 Remix 这种框架&#xff0c;可以在服务器段启动一个无头浏览器进行页面渲染并返回&#xff0c;代价就是要在服务器上启动一个 Chrome 服务&#xf…

萤火虫优化算法(Firefly Algorithm)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 算法背景 萤火虫优化算法&#xff0c;是由剑桥大学的Xin-She Yang在2009年提出的一种基于群体智能的优化算法。它的灵感来源于萤火虫在夜晚闪烁…

[算法面试]_01_L1和L2正则化,为什么L1正则化更容易导致稀疏?

本人今年参加了很多面试&#xff0c;也有幸拿到了一些大厂的offer&#xff0c;整理了众多面试资料&#xff0c;后续还会分享众多面试资料。 整理成了面试系列&#xff0c;由于时间有限&#xff0c;每天整理一点&#xff0c;后续会陆续分享出来&#xff0c;感兴趣的朋友可关注收…

OBS插件--复合模糊

复合模糊 复合是一款滤镜插件&#xff0c;支持多种模糊类型和多种蒙版效果。支持模糊源的部分显示区域&#xff0c;可以反选区域进行模糊&#xff0c;这个功能对于场景部分区域需要遮盖非常实用。 下面截图演示下操作步骤&#xff1a; 首先&#xff0c;打开 OBS直播助手 在…

2024年数维杯数学建模

高质量原创论文已完成 需要的私我

MySQL性能优化:MySQL中的隐式转换造成的索引失效

目录 前言数据准备SQL测试分析和总结 前言 数据库优化是一个任重而道远的任务&#xff0c;想要做优化必须深入理解数据库的各种特性。在开发过程中我们经常会遇到一些原因很简单但造成的后果却很严重的疑难杂症&#xff0c;这类问题往往还不容易定位&#xff0c;排查费时费力最…

微服务下的技术栈架构解析

微服务是一种架构风格&#xff0c;它将一个复杂的应用拆分成多个独立自治的服务&#xff0c;每个服务负责应用程序中的一小部分功能。这些服务通过定义良好的API进行通信&#xff0c;通常是HTTP RESTful API或事件流。微服务架构的主要特点包括单一职责、自治性、可独立部署和扩…

力扣例题(用栈实现队列)

目录 链接. - 力扣&#xff08;LeetCode&#xff09; 描述 思路 push pop peek empty 代码 链接. - 力扣&#xff08;LeetCode&#xff09; 描述 思路 push 例如我们将10个元素放入栈中&#xff0c;假设最左边为栈顶&#xff0c;最右侧为栈底 则为10,9,8,7,6,5,4,3,…

PyCharm2024安装教程

PyCharm是一款功能强大的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;它提供了许多工具和功能来帮助开发者编写、调试和测试Python代码。以下是使用PyCharm的基本步骤&#xff1a; 安装PyCharm&#xff1a;首先&#xff0c;你需要从JetBrains官方网站下载并安装…

关于画图-一次性搞定各类高级论文作图及配色

关于画图-一次性搞定各类高级论文作图及配色 图&#xff08;Figure&#xff09;可以让各类论文的结果更加直观&#xff0c;有时候一张图片比一大段文字更有说服力。 但许多新手作者可能会有一连串的疑惑&#xff1a;数据这么多&#xff0c;什么时候该做什么类型的图&#xff…

事务的基础

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;面经 ⛺️稳中求进&#xff0c;晒太阳 事务的基础 1&#xff09;事务 事务是&#xff1a;一组操作的集合 &#xff0c;他是不可分割的工作单位。事务会把所有操作作为一个整体一起向系统提…

Linux:Figshare网站文件下载(非浏览器)

参考aws亚马逊云下载figshare内容 Linux wget -c 下载网页内容crul -C_figshare怎么下载数据-CSDN博客 尝试一下 mamba search awscli mamba install awscli2.15.48 aws --version通过网页获取下载链接 比如&#xff1a; https://s3-eu-west-1.amazonaws.com/pfigshare-u-…

关键点检测——面部情绪数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

重写muduo之TcpServer

目录 1、Callbacks.h 2、TcpServer.h 3、TcpServer.cc 1、Callbacks.h 回调操作 #pragma once#include <memory> #include <functional>class Buffer; class TcpConnection;using TcpConnectionPtrstd::shared_ptr<TcpConnection>; using ConnectionCall…

解锁Spring Boot数据映射新利器:深度探索MapperStruct

解锁Spring Boot数据映射新利器&#xff1a;深度探索MapperStruct MapperStruct 是一个强大的 Java 映射工具&#xff0c;它的主要作用是简化对象之间的映射操作。在 Spring Boot 应用程序中&#xff0c;MapperStruct 通常用于将领域模型对象&#xff08;Domain Model&#xff…

WPF之工具栏菜单栏功能区。

1&#xff0c;菜单栏&#xff0c;工具栏&#xff0c;状态栏。 1.1&#xff0c;Menu中可添加菜单分隔条<Separator></Separator>作为分割线&#xff0c;使用Separator可以通过改变其template来自定义&#xff0c;Separator是无焦点的&#xff0c;如果简单的在MenuIt…

App下载绑定新方式:Xinstall带来的革命性改变

在当今数字化时代&#xff0c;移动应用&#xff08;App&#xff09;已成为企业与用户之间互动的重要桥梁。然而&#xff0c;对于许多企业来说&#xff0c;App下载与用户关系绑定一直是一个令人头疼的问题。这时&#xff0c;Xinstall应运而生&#xff0c;为企业提供了一种全新的…