1. 程式人生 > >Unity中炮彈拋物線運動

Unity中炮彈拋物線運動

比如迫擊炮發射的子彈是拋物線執行的,並且在垂直方向上子彈做自由落體運動,如果垂直方向上不做自由落體(僅僅是一個勻速的拋物線),有很多簡便的方法可以實現,比如設定一個起始點,一個最高點,一個目標點,讓物體按照這三個點移動就可以,稍微複雜點的用dotween,itween設定個路徑點,按照路徑點移動. 下面開始邏輯: 迫擊炮拋物線擊中目標單位,需要的引數是:1.目標單位; 2.炮彈的水平速度. 按照初中的物理知識,拋物線運動在水平方向是勻速的,垂直方向上是v=a*t(v是速度,a是加速度,t是時間).
也就是說只要得到垂直方向初始化速度,讓水平方向和垂直方向各自執行就可以了. 如果知道目標(距離)和水平速度,就能得到飛行的時間.time=distance/speed; 在time這段時間內,炮彈用1/2的時間上升,1/2的時間下降.炮彈發出時在垂直方向上的速度是多少呢?我們可以反過來看,在最頂點時炮彈速度是0,經過1/2的時間下落到平面,根據v=a*t(也就是speed=重力加速度*1/2*時間),這樣就得到了垂直方向的初始化速度. 然後用邏輯控制垂直方向和水平方向各自執行就可以了.
public class Test : MonoBehaviour
{
    public const float g = 9.8f;
 
    public GameObject target;
    public float speed = 10;
    private float verticalSpeed;
    void Start()
    {
        float tmepDistance = Vector3.Distance(transform.position, target.transform.position);
        float tempTime = tmepDistance / speed;
        float riseTime, downTime;
        riseTime = downTime = tempTime / 2;
        verticalSpeed = g * riseTime;
 
        transform.LookAt(target.transform.position);
    }
    private float time;
    void Update()
    {
        if (transform.position.y < target.transform.position.y)
        {
            //finish
            return;
        }
        time += Time.deltaTime;
        float test = verticalSpeed - g*time;
        transform.Translate(transform.forward * speed * Time.deltaTime, Space.World);
        transform.Translate(transform.up * test * Time.deltaTime, Space.World);
    }
}

實現的效果如下:
從上面的邏輯中看出炮彈只有水平和垂直方向的位移,沒有旋轉:現實生活中炮彈發出時朝向天空,在最高點時炮彈旋轉是水平的,在下落過程中炮彈朝向要轟炸的單位.下面為炮彈新增旋轉邏輯: 首先根據上文水平方向速度和垂直方向的速度,能得到tan值,然後計算出呼叫系統math.atan的到弧度,然後弧度轉換為角度.這個角度就是炮彈發出時與地面(水平方向)的夾角.然後在各角度在time/2的時間裡變為0(最頂點角度為0)然後在下落的過程中角度在繼續增大.最終邏輯如下:
public class Bullet : MonoBehaviour
{
    public const float g = 9.8f;
 
    public GameObject target;
    public float speed = 10;
    private float verticalSpeed;
    private Vector3 moveDirection;
 
    private float angleSpeed;
    private float angle;
    void Start()
    {
       float tmepDistance = Vector3.Distance(transform.position, target.transform.position);
        float tempTime = tmepDistance / speed;
        float riseTime, downTime;
        riseTime = downTime = tempTime / 2;
         verticalSpeed = g * riseTime;
        transform.LookAt(target.transform.position);
 
        float tempTan = verticalSpeed / speed;
        double hu = Math.Atan(tempTan);
        angle = (float)(180 / Math.PI * hu);
        transform.eulerAngles = new Vector3(-angle, transform.eulerAngles.y, transform.eulerAngles.z);
        angleSpeed = angle / riseTime;
 
        moveDirection = target.transform.position - transform.position;
    }
    private float time;
    void Update()
    {
        if (transform.position.y < target.transform.position.y)
        {
            //finish
            return;
        }
        time += Time.deltaTime;
        float test = verticalSpeed - g * time;
        transform.Translate(moveDirection.normalized * speed * Time.deltaTime, Space.World);
        transform.Translate(Vector3.up * test * Time.deltaTime,Space.World);
        float testAngle = -angle + angleSpeed * time;
        transform.eulerAngles = new Vector3(testAngle, transform.eulerAngles.y, transform.eulerAngles.z);
    }
}
把上面的程式碼掛到子彈身上,配置一個目標物件,一個水平速度就可以運行了.效果如下所示:

support: [email protected] qq群: 83596104

相關推薦

Unity炮彈拋物線運動

比如迫擊炮發射的子彈是拋物線執行的,並且在垂直方向上子彈做自由落體運動,如果垂直方向上不做自由落體(僅僅是一個勻速的拋物線),有很多簡便的方法可以實現,比如設定一個起始點,一個最高點,一個目標點,讓物體按照這三個點移動就可以,稍微複雜點的用dotween,itween設定個

Unity利用貝塞爾曲線來實現3D的曲線運動

下面是在理解後寫的2階三階曲線 using UnityEngine; using System.Collections; using System.Collections.Generic; public class TestCurve : MonoBehaviour

Unity3D (塔防遊戲)射擊 之 拋物線運動(模擬炮彈

相信很多人都玩過憤怒的小鳥,也玩過王國保衛戰,皇家守衛軍,等等一系列優秀的TD,而裡面的箭塔的射擊 都是使用了 拋物線 的運動 先上程式碼,然後看下解釋 using UnityEngine; using System.Collections; public class

unity畫線之模擬小球拋物線運動軌跡

模擬小球的拋物線運動,如圖所示: 這裡有點像打檯球遊戲,模擬在發射之前模擬其軌跡。 劃線用的是LineRenderer,不清楚的童鞋可以自行查閱咯。其實也很簡單就是掛個LineRenderer指令碼,設定它的座標點就行了,關鍵是這座標點如何計算的問題了。

關於Unity的新手編碼技巧

編輯器 展開 解決 編譯 出錯 怎麽辦 查看 代碼 寫代碼 寫代碼遇到報錯,問題怎麽辦?怎麽查看unity代碼的接口?函數參數不記得了怎麽辦? 解決方法: 1.選擇不懂的函數或類,按F12,跳轉到代碼的定義,自己去看就可知道了。 2.有的時候,選擇一個函數,按F12想跳轉去

Unity SLua 如何調用UnityC#方法

都差不多 public title 接口 如何 1.原理就是通常在Lua框架中所說的,開放一個C#的web接口,或者叫做在Slua框架中註冊函數。2.作用在Lua中調用C#中的方法,這個是在做熱更新中很常用的一種方法,無論是slua,還是lua,都差不多、這

關於Unity的幾何體

模式 mob 繪制 反射 mod 選擇 and tex 足球場 一、創建幾何體的類型 1: 創建平面 Plane;2: 創建立方體 Cube;3: 創建球體 Sphere;4: 創建膠囊體 Capsule;5: 創建圓柱體 Cylinder;6: 3D文字 3D text;

關於Unity的NGUI和UGUI

幫我 事件 視角 比例 設置 內置 作者 x64 spec 用Unity開發2D遊戲,有三套關系 1.GUI:Unity本身的對象 2.NGUI:以前在Unity中廣泛來做2D的,是第三方的包,需要安裝 3.UGUI:Unity5.X後,Unity找到NGUI的作者,開發了

【只怕沒有幾個人能說清楚】系列之二:Unity的特殊文件夾

物體 avi ebp time 編輯模式 tro hive 預覽 打包 參考:http://www.manew.com/thread-99292-1-1.html 1. 隱藏文件夾 以.開頭的文件夾會被忽略。在這種文件夾中的資源不會被導入,腳本不會被編譯。也不會出現

關於UnityRawImage和Button

clam 屬性 尋址 lam etc 1.2 public 遊戲場景 像素 1.貼圖的Texture Type屬性值 Texture:會把貼圖的大小轉換為最相近的2的n次方,比如400X1369會轉換為512X1024。 Sprite 2D:是貼圖的原始大小。 2.

關於UnityUI的Button節點

pda initial debug.log 禁用 修飾 不能 重復 綁定 etc Button是最常用的UI節點,包含的組件有 1.Image組件 顯示Button的紋理,把Image貼圖拖進Image組件中後,記得點擊Set Native Size,顯示貼圖原始大小

關於Unitystretch的分開使用、預制體、Scroll View的UI節點

pre 左右 類型 ane 不變 rac tor pos initial 一、上次講的菊花的四個花瓣,只講了四個花瓣和在一起的時候的作用,現在是分開的菊花的四個花瓣的作用 1.創建一個Canvas2.對Canvas進行初始化3.創建一個Image的UI節點作為Canvas的

關於Unity的Bmpfont的使用

resources unit resource 背景圖 bmp mage 設置 png 圖片 一、Bmpfont 1.把fnt文件和png文件拖進Resources文件夾下面 2.創建一個Canvas 3.對Canvas進行初始化,記得把Game視圖的分辨率調成和Canva

關於在將暴風SDK倒入unity運行程序出現報錯問題

分享 報錯 demo 它的 src 錯誤 .cn 發現 我們 我們將暴風SDK導入我們已經做好的項目中時,發現運行發生報錯問題。然後我在它的Demo示例中運行也發現錯誤。然後根據它的報錯我找到問題。 然後我發現。我的IntergrateInputManger中的Unity

關於UnityNGUI圖片精靈響應鼠標的方法

unity see hover 9.png pan 事件 實戰 方法 技術分享 我在Unity裏做NGUI的時候發現一個問題。 在Unity2D場景當中,一個精靈圖片只要加上了Box Collider或者Box Collider2D,就可以相應OnMouseEnter和On

Unity技巧】Unity的優化技術

移動設備 完整 物體 動態 多少 each blank screen text 寫在前面 這一篇是在Digital Tutors的一個系列教程的基礎上總結擴展而得的~Digital Tutors是一個非常棒的教程網站,包含了多媒體領域很多方面的資料,非常酷!除此之外,還

UnityOnTriggerEnter條件以及isTrigger的一個問題

兩個 才會 har 產生 collider 檢測 自由 net 人物 該函數觸發的條件: 1、兩個物體都必須有碰撞器(Collider)組件; 2、其中一個物體的碰撞器(Collider)的IsTrigger屬性必須勾上; 3、最重要的一點,其中一個物體必須有剛體(Rigi

Unity做放大鏡 效果

post tran 技術 rec system watermark 技術分享 center 小地圖 孫廣東 2015.8.16 事實上和 小地圖都幾乎相同了。 還是要借助 還有一個相機目的: 這篇文章的主要目的是 要給你一個想法 怎樣做放大境效果 。在unit

關於UnityRectTransform和Transform

unit 顯示 tor orm his bsp nsf 強制 rec 以前一直以為在Inspector面板上的是Transform,後來才發現原來是RectTransform 而我們平時用來聯系節點之間的Transform其實是隱藏的組件,不在面板上顯示,面板上顯示的是

關於Unity的剛體和碰撞器的相關用法

detection 坐標系 改變 sta n) 高速 節點 none 離散 1.創建一個3D工程 2.構造項目文件目錄 3.保存場景為game_scene到文件夾scenes中 4.創建一個Plane平面類型的GameObject節點和一個Sphere球體類型的GameOb