1. 程式人生 > >Unity3D (塔防遊戲)射擊 之 拋物線運動(模擬炮彈)

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

相信很多人都玩過憤怒的小鳥,也玩過王國保衛戰,皇家守衛軍,等等一系列優秀的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軸的旋轉運動,組合起來會是一個什麼運動呢。咳咳。。。想想一下,應該是一個畫圓的