Unity3D (塔防遊戲)射擊 之 拋物線運動(模擬炮彈)
阿新 • • 發佈:2019-01-26
相信很多人都玩過憤怒的小鳥,也玩過王國保衛戰,皇家守衛軍,等等一系列優秀的TD,而裡面的箭塔的射擊 都是使用了 拋物線 的運動 先上程式碼,然後看下解釋
using UnityEngine; using System.Collections; public class Radar: MonoBehaviour { public GameObject target; public float speed = 10; private float distanceToTarget; private bool move = true; void Start () { distanceToTarget = Vector3.Distance (this.transform.position, target.transform.position); StartCoroutine (Shoot ()); } IEnumerator Shoot () { while (move) { Vector3 targetPos = target.transform.position; //朝向目標 (Z軸朝向目標) this.transform.LookAt (targetPos); //根據距離衰減 角度 float angle = Mathf.Min (1, Vector3.Distance (this.transform.position, targetPos) / distanceToTarget) * 45; //旋轉對應的角度(線性插值一定角度,然後每幀繞X軸旋轉) this.transform.rotation = this.transform.rotation * Quaternion.Euler (Mathf.Clamp (-angle, -42, 42), 0, 0); //當前距離目標點 float currentDist = Vector3.Distance (this.transform.position, target.transform.position); if (currentDist < 0.5f) { move = false; } //平移 (朝向Z軸移動) this.transform.Translate (Vector3.forward * Mathf.Min (speed * Time.deltaTime, currentDist)); yield return null; } } }
左邊的cube為我們要攻擊的目標,右邊的箭為我們的主角
首先 this.transform.LookAt (targetPos); 這一句 就表示了z軸朝向目標了,這個時候注意x軸是朝向裡面的
然後 this.transform.rotation = this.transform.rotation * Quaternion.Euler (Mathf.Clamp (-angle, -42, 42), 0, 0); 這一句表示繞X軸旋轉,也就是拋物線的平面為YZ平面
最後 this.transform.Translate (Vector3.forward * Mathf.Min (speed * Time.deltaTime, currentDist)); 這一句表示的是向前移動
其實最後有兩個分運動 : 一個是向Z軸的平移運動,一個是繞X軸的旋轉運動,組合起來會是一個什麼運動呢。咳咳。。。想想一下,應該是一個畫圓的