Unity中炮彈拋物線運動
也就是說只要得到垂直方向初始化速度,讓水平方向和垂直方向各自執行就可以了. 如果知道目標(距離)和水平速度,就能得到飛行的時間.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 如何調用Unity中C#方法
都差不多 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. 隱藏文件夾 以.開頭的文件夾會被忽略。在這種文件夾中的資源不會被導入,腳本不會被編譯。也不會出現
關於Unity中RawImage和Button
clam 屬性 尋址 lam etc 1.2 public 遊戲場景 像素 1.貼圖的Texture Type屬性值 Texture:會把貼圖的大小轉換為最相近的2的n次方,比如400X1369會轉換為512X1024。 Sprite 2D:是貼圖的原始大小。 2.
關於Unity中UI中的Button節點
pda initial debug.log 禁用 修飾 不能 重復 綁定 etc Button是最常用的UI節點,包含的組件有 1.Image組件 顯示Button的紋理,把Image貼圖拖進Image組件中後,記得點擊Set Native Size,顯示貼圖原始大小
關於Unity中stretch的分開使用、預制體、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
關於Unity中NGUI圖片精靈響應鼠標的方法
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是一個非常棒的教程網站,包含了多媒體領域很多方面的資料,非常酷!除此之外,還
Unity中OnTriggerEnter條件以及isTrigger的一個問題
兩個 才會 har 產生 collider 檢測 自由 net 人物 該函數觸發的條件: 1、兩個物體都必須有碰撞器(Collider)組件; 2、其中一個物體的碰撞器(Collider)的IsTrigger屬性必須勾上; 3、最重要的一點,其中一個物體必須有剛體(Rigi
Unity中做放大鏡 效果
post tran 技術 rec system watermark 技術分享 center 小地圖 孫廣東 2015.8.16 事實上和 小地圖都幾乎相同了。 還是要借助 還有一個相機目的: 這篇文章的主要目的是 要給你一個想法 怎樣做放大境效果 。在unit
關於Unity中RectTransform和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