2016-11-02 8 views
2

私はプレーヤーがトップダウンの観点から船をコントロールするための小さなプロジェクトを開始しました。物理学に基づいた動きを全部使いたい。トップダウン宇宙飛行物理 - AddForce - オブジェクトが中心から離れて移動するより速く進む

私の問題は、剛体に力を加えると、それが取り付けられているオブジェクトがその位置から離れるように見えることです。しかし、transform.positionsは問題ないようです。

this little unity packageをまとめました。 Wを押すと、船は上方向に移動し、中央から外れます.Wを押すと長くなります。Sは反対方向に移動します。

コードはかなり単純です:

using UnityEngine; 
using System.Collections; 

public class TestController : MonoBehaviour { 
    public float mainThrust = 100; 
    private Vector3 cameraOffset = new Vector3(0f, 0f, 150f); 
    private new Rigidbody rigidbody; 

    void Start() { 
    rigidbody = GetComponent<Rigidbody>(); 
    } 

    void FixedUpdate() { 
    float axisVertical = Input.GetAxis("Vertical"); 
    Vector2 force = new Vector2(0f, axisVertical) * mainThrust * Time.fixedDeltaTime; 
    rigidbody.AddRelativeForce(force, ForceMode.Impulse); 
    Camera.main.transform.position = rigidbody.transform.position - cameraOffset; 
    Debug.Log("camPos: " + Camera.main.transform.position 
     + " - rbPos: " + rigidbody.transform.position); 
    } 
} 

すべてのヘルプは大歓迎します。

おかげで、 ニコ

+0

あなたがのスクリーンショット/ビデオを提供することができればそれが役立つだろうこれはあなたの問題が何であるかを100%確信しているわけではありません。しかし、私はあなたのスクリプトの実行順序のために、あなたのカメラがゲームオブジェクトの後ろにたどり着いていると思っています。 –

+0

btw、カメラを船の子供にすることができ、それは自動的にそれに従います。 – code11

+0

[動画](https://youtu.be/12z526xrUpM)が届きます。カメラは問題ではないようです。オブジェクトにカメラを接続すると、同じ動作になります。 –

答えて

1

は単にLateUpdate MonoBehaviour方法であなたのCamera.main.transform.position = rigidbody.transform.position - cameraOffset;ラインを入れて、(私が正しく問題を理解している場合)あなたは私が考えていいでしょう。詳しい説明が必要な場合はthisをご覧ください。

EDIT:

は、ここで私は(あなたのパッケージにあるいずれかに基づいて)望ましい結果を得るために使用するスクリプトです:

using UnityEngine; 
using System.Collections; 

public class TestController : MonoBehaviour 
{ 
    public float mainThrust = 100; 
    private Vector3 cameraOffset = new Vector3(0f, 0f, 150f); 
    private new Rigidbody rigidbody; 

    private Vector3 tmpV1 = new Vector3(0f, 0f, 0f); 
    private Vector3 tmpV2 = new Vector3(0f, 0f, 0f); 

    // Draw debug cross at camera position 
    private void drawX() 
    { 
     tmpV1.x = Camera.main.transform.position.x - 10f; 
     tmpV1.y = Camera.main.transform.position.y; 
     tmpV2.x = Camera.main.transform.position.x + 10f; 
     tmpV2.y = Camera.main.transform.position.y; 
     Debug.DrawLine(tmpV1, tmpV2, Color.red); 
     tmpV1.x = Camera.main.transform.position.x; 
     tmpV1.y = Camera.main.transform.position.y - 10f; 
     tmpV2.x = Camera.main.transform.position.x; 
     tmpV2.y = Camera.main.transform.position.y + 10f; 
     Debug.DrawLine(tmpV1, tmpV2, Color.red); 
    } 

    void Start() 
    { 
     rigidbody = GetComponent<Rigidbody>(); 
    } 

    void FixedUpdate() 
    { 
     float axisVertical = Input.GetAxis("Vertical"); 
     // impulse force in Newton 
     Vector2 force = new Vector2(0f, axisVertical) * mainThrust * Time.fixedDeltaTime; 
     rigidbody.AddRelativeForce(force, ForceMode.Impulse); 
    } 

    void LateUpdate() 
    { 
     Camera.main.transform.position = rigidbody.transform.position - cameraOffset; 
     drawX(); 
     Debug.Log("camPos: " + Camera.main.transform.position + " - rbPos: " + rigidbody.transform.position); 
    } 
} 
+0

申し訳ありませんが、助けになりません。 :( –

+0

@NicoBüttnerまあ、私は空のプロジェクトとあなたが提供したパッケージでそれを試してみましたが、うまくいきました...あなたは 'LateUpdate()'にタイプミスをしていないと確信していますか? – Kardux

+0

あなたが本当にあなたのために働いていることは確かですか?私は今、2つのシステムでテストして、同じ動作をしています。赤い十字の上で画面の中央に留まるキューブ。そして、コンソールを見てください:Camera.main.positionとrigidbody.positionは同じです... –

関連する問題