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.pswp.cn/web/10603.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10603.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10603.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數字生態系統的演進與企業API管理的關鍵之路

數字生態系統的演進與企業API管理的關鍵之路 在數字化時代&#xff0c;企業正經歷著一場轉型的浪潮&#xff0c;而API&#xff08;應用程序編程接口&#xff09;扮演著至關重要的角色。API如同一座橋梁&#xff0c;將組織內部的價值轉化為可市場化的產品&#xff0c;從而增強企…

韓國站群服務器在全球網絡架構中的重要作用?

韓國站群服務器在全球網絡架構中的重要作用? 在全球互聯網的蓬勃發展中&#xff0c;站群服務器作為網絡架構的核心組成部分之一&#xff0c;扮演著至關重要的角色。韓國站群服務器以其卓越的技術實力、優越的地理位置、穩定的網絡基礎設施和強大的安全保障能力&#xff0c;成…

LeetCode 題目 118:楊輝三角

題目描述 給定一個非負整數 numRows&#xff0c;生成楊輝三角的前 numRows 行。在楊輝三角中&#xff0c;每個數是它左上方和右上方的數的和。 楊輝三角解析 在這個詳解中&#xff0c;我們將使用 ASCII 圖形來說明楊輝三角的構建過程&#xff0c;包括逐行添加新的行的過程。…

250 基于matlab的5種時頻分析方法((短時傅里葉變換)STFT

基于matlab的5種時頻分析方法&#xff08;(短時傅里葉變換)STFT,Gabor展開和小波變換,Wigner-Ville&#xff08;WVD&#xff09;,偽Wigner-Ville分布(PWVD),平滑偽Wigner-Ville分布&#xff08;SPWVD&#xff09;,每條程序都有詳細的說明&#xff0c;設置仿真信號進行時頻輸出。…

Parted分區大容量磁盤

創建了新的虛擬磁盤10T , 掛載后分區格式化一.fdisk無法創建大容量的分區 Fileserver:~ # fdisk /dev/sdb Welcome to fdisk (util-linux 2.29.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device …

使用html和css實現個人簡歷表單的制作

根據下列要求&#xff0c;做出下圖所示的個人簡歷&#xff08;表單&#xff09; 表單要求 Ⅰ、表格整體的邊框為1像素&#xff0c;單元格間距為0&#xff0c;表格中前六列列寬均為100像素&#xff0c;第七列 為200像素&#xff0c;表格整體在頁面上居中顯示&#xff1b; Ⅱ、前…

git提交代碼異常報錯error:bad signature 0x00000000

報錯信息 error:bad signature 0x00000000 異常原因 git 提交過程中異常關機或重啟&#xff0c;造成當前項目工程中的.git/index 文件損壞&#xff0c;無法提交 解決步驟 刪除.git/index文件 rm -f .git/index 重啟git git reset

Java 【數據結構】 哈希(Hash超詳解)HashSetHashMap【神裝】

登神長階 第十神裝 HashSet 第十一神裝 HashMap 目錄 &#x1f454;一.哈希 &#x1f9e5;1.概念 &#x1fa73;2.Object類的hashCode()方法: &#x1f45a;3.String類的哈希碼: &#x1f460;4.注意事項: &#x1f3b7;二.哈希桶 &#x1fa97;1.哈希桶原理 &#x…

Bert基礎(二十二)--Bert實戰:對話機器人

一 、概念簡介 1.1 生成式對話機器人 1.1.1什么是生成式對話機器人? 生成式對話機器人是一種能夠通過自然語言交互來理解和生成響應的人工智能系統。它們能夠進行開放域的對話,即在對話過程中,機器人可以根據用戶的需求和上下文信息,自主地生成新的、連貫的回復,而不僅…

如何使用CertCrunchy從SSL證書中發現和識別潛在的主機名稱

關于CertCrunchy CertCrunchy是一款功能強大的網絡偵查工具&#xff0c;該工具基于純Python開發&#xff0c;廣大研究人員可以利用該工具輕松從SSL證書中發現和識別潛在的主機信息。 支持的在線源 該工具支持從在線源或給定IP地址范圍獲取SSL證書的相關數據&#xff0c;并檢索…

大數據測試

1、前言 大數據測試是對大數據應用程序的測試過程&#xff0c;以確保大數據應用程序的所有功能按預期工作。大數據測試的目標是確保大數據系統在保持性能和安全性的同時&#xff0c;平穩無差錯地運行。 大數據是無法使用傳統計算技術處理的大型數據集的集合。這些數據集的測試涉…

Foxmail使用經驗總結

本篇博客將詳盡講解如何利用Foxmail進行高效的郵件管理&#xff0c;以及一些實用的使用技巧&#xff0c;讓郵件管理變得更為高效和有序。 1. 賬戶設置與管理 多賬戶整合&#xff1a;Foxmail支持多個郵件賬戶同時管理&#xff0c;用戶可以將個人和工作郵箱整合在同一個界面&am…

實戰中使用 QEMU 進行內網穿透

前言 閱讀 https://xz.aliyun.com/t/14052 《使用 QEMU 進行內網穿透&#xff1f;》 https://securelist.com/network-tunneling-with-qemu/111803/ 《Network tunneling with… QEMU?》 我將此項技術應用到實戰中&#xff0c;取得不錯的效果&#xff0c;但是也遇到很多坑&am…

機器學習算法應用——樸素貝葉斯分類器

樸素貝葉斯分類器 樸素貝葉斯分類器&#xff08;Naive Bayes Classifier&#xff09;是一種基于貝葉斯定理和特征條件獨立假設的分類方法。它適用于分類任務&#xff0c;特別是文本分類、垃圾郵件識別等領域。 原理 樸素貝葉斯分類器基于以下兩個主要假設&#xff1a; 特征條…

JS_ES6(1)

作用域鏈&#xff1a; 作用域鏈是底層變量查找的機制&#xff1a;當函數執行時&#xff0c;優先查找當前函數作用域中有無需要用到的變量&#xff0c;如果找不到&#xff0c;逐級查找父級&#xff0c;直到全局 > 嵌套關系形成作用域鏈&#xff0c;同一作用域鏈從小到大查找…

taro3兼容支付寶/微信小程序的自定義拖拽排序組件

描述&#xff1a;列表可以完成拖拽排序 此組件是根據支付寶原生文檔改編成taro-vue3的形式&#xff0c;只保留了拖拽的部分&#xff0c;其他功能都去除了&#xff0c;測試下來可以兼容支付寶和微信小程序。 支付寶原生文檔&#xff1a; https://opendocs.alipay.com/support/…

BGP(border gateway protocol)邊界網關協議初識篇

BGP它是一種路徑矢量協議&#xff0c;用于決定數據包在互聯網中的最佳路徑。 1、工作原理&#xff1a; 自治系統&#xff08;AS&#xff09;間路由: BGP主要用于連接不同自治系統之間的路由器&#xff0c;其中每個自治系統&#xff08;AS&#xff09;代表一組具有共同路由的網…

編譯 fdk-aac

文章目錄 關于 fdk-aac編譯 fdk-aac在 FFMpeg 編譯中啟用 關于 fdk-aac A standalone library of the Fraunhofer FDK AAC code from Android. github &#xff1a; https://github.com/mstorsjo/fdk-aac代碼托管 &#xff1a; https://sourceforge.net/projects/opencore-am…

最新巨量X-Bogus、_signature參數逆向分析與算法還原

文章目錄 1. 寫在前面2. 接口分析3. 斷點分析4. 扣代碼補環境5. 數據解密 【&#x1f3e0;作者主頁】&#xff1a;吳秋霖 【&#x1f4bc;作者介紹】&#xff1a;擅長爬蟲與JS加密逆向分析&#xff01;Python領域優質創作者、CSDN博客專家、阿里云博客專家、華為云享專家。一路…

# 從淺入深 學習 SpringCloud 微服務架構(十六)

從淺入深 學習 SpringCloud 微服務架構&#xff08;十六&#xff09; 一、SpringCloudStream&#xff1a;自定義消息通道 1、在子工程 stream_product &#xff08;子模塊&#xff09;中,創建 自定義的消息通道類 MyProcessor.java /*** spring_cloud_demo\stream_product…