2017-06-23 8 views
0

ベースは赤い立方体です。 ゲームが始まると、宇宙船はすでに動いています。 Lボタンをクリックすると、宇宙船が回転してベースに向かって動き始めますが、ベースに近づくと予期せぬ動作をして、宇宙船がノンストップで回転し始めます。私はどのように宇宙船を陸上に自動着陸させることができますか?

私が望むのは、このブレンダーのYouTubeビデオのような着陸を自動化することです。 私はグラフィックスが欲しいのではなく、着陸する方法を望んでいます。

Blender landing spaceship

そして、これは、それが上陸を開始しますときに私の宇宙船を示す短いビデオクリップである:

Landing test

これは私が宇宙船と着陸の一部をすべき制御するために使用しているスクリプトです。自動にする。 スクリプトは宇宙船に添付されています。

using UnityEngine; 
using System.Collections; 

public class ControlShip : MonoBehaviour { 

    public int rotationSpeed = 75; 
    public int movementspeed = 10; 
    public int thrust = 10; 
    public float RotationSpeed = 5; 

    private bool isPKeyDown = false; 
    private float acceleration = .0f; 
    private Vector3 previousPosition = Vector3.zero; 
    private Rigidbody _rigidbody; 
    private bool landing = false; 
    private Vector3 originPosition; 
    private Vector3 lastPosition; 
    private const float minDistance = 0.2f; 
    private Transform baseTarget; 

    // Use this for initialization 
    void Start() { 
     baseTarget = GameObject.Find("Base").transform; 
     originPosition = transform.position; 
     _rigidbody = GetComponent<Rigidbody>(); 
     Debug.Log("Acc Speed: " + thrust); 
    } 

    // Update is called once per frame 
    void Update() 
    { 
     if (landing == false) 
     { 
      var v3 = new Vector3(Input.GetAxis("Vertical"), Input.GetAxis("Horizontal"), 0.0f); 
      transform.Rotate(v3 * rotationSpeed * Time.deltaTime); 
      transform.position += transform.forward * Time.deltaTime * movementspeed; 

      if (Input.GetKey(KeyCode.Z)) 
       transform.Rotate(Vector3.forward * rotationSpeed * Time.deltaTime); 

      if (Input.GetKey(KeyCode.R)) 
       transform.Rotate(Vector3.right * rotationSpeed * Time.deltaTime); 

      if (Input.GetKey(KeyCode.P)) 
      { 
       isPKeyDown = Input.GetKey(KeyCode.P); 
       float distance = Vector3.Distance(previousPosition, transform.position); 
       acceleration = distance/Mathf.Pow(Time.deltaTime, 2); 

       previousPosition = transform.position; 
       _rigidbody.AddRelativeForce(0f, 0f, thrust, ForceMode.Acceleration); 
      } 
     } 
     else 
     { 
      transform.position += transform.forward * Time.deltaTime * movementspeed; 
      var targetRotation = Quaternion.LookRotation(baseTarget.position - transform.position); 
      var str = Mathf.Min(.5f * Time.deltaTime, 1); 
      transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, str); 
     } 

     if (landed == true) 
      TakeOff(); 

     if (Input.GetKey(KeyCode.L)) 
     { 
      landing = true; 
      lastPosition = transform.position; 
     } 
    } 

    void OnTriggerEnter(Collider other) 
    { 
     if (landing == true && other.gameObject.name == "Base") 
     { 
      StartCoroutine(Landed()); 
     } 
    } 

    bool landed = false; 
    IEnumerator Landed() 
    { 
     yield return new WaitForSeconds(5); 
     Debug.Log("Landed"); 
     landed = true; 
    } 

    private void TakeOff() 
    { 
     if (transform.position != originPosition) 
     { 
      _rigidbody.AddForce(transform.up * 10); 
     } 

     if ((transform.position - originPosition).sqrMagnitude <= (1f * 1f)) 
     { 
      landed = false; 
      _rigidbody.useGravity = false; 
     } 
    } 

    void OnGUI() 
    { 
     if (isPKeyDown) 
     { 
      GUI.Label(new Rect(100, 100, 200, 200), "Acc Speed: " + acceleration); 
     } 
    } 
} 

これは着陸の一部であり、着陸の一部である必要があります:

transform.position += transform.forward * Time.deltaTime * movementspeed; 
var targetRotation = Quaternion.LookRotation(baseTarget.position - transform.position); 
var str = Mathf.Min(.5f * Time.deltaTime, 1); 
transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, str); 

宇宙船には、2つのコンポーネントがあります:剛体を、使用重力はtrueに設定します。そしてBox Collider。

ベースには、ボックスコライダーコンポーネントがあります。

答えて

0

車にボックスコライダーがあるように見え、コードが着陸の際に地形に衝突しているように見えます。トリガーになるようにコライダーを切り替えてみてください(コライダーコンポーネントのティックオプション)。

これで物理的な衝突が発生しないため、もう一度試してみてください。まったく異なる理由で機能しているか失敗している場合は、これが原因であるか、それとも原因であるかが分かります。

編集:この種の効果を達成しようとすると、物理ベースのコードでそれを達成しようとするよりも、アニメーションをトリガーする方がずっと簡単であることにも注意してください。 Unityには素晴らしいアニメーションコントローラーがいくつか用意されていますし、あなたが離れてプレイヤーから遠ざかっているので、着陸が必要なときにアニメーションを呼び出すことができます。

これを実行している間、あなたは奇妙な衝突を起こさないように、衝突者を止めることができますが、船が離陸する必要があるときには、もちろんそれが必要です。

希望します。

関連する問題