自上而下的太空飞行物理 - AddForce - 物体偏离中心越快越快

问题描述:

我刚开始一个小项目,我希望玩家能够从自上而下的角度控制船只。我希望整个事情都用基于物理的运动。自上而下的太空飞行物理 - 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

顺便说一句,你可以使相机成为船的孩子,它会自动跟随它。 – code11

+0

[视频](https://youtu.be/12z526xrUpM)即将到来。相机似乎不是问题。将相机连接到对象导致相同的行为。 –

简单地把你的Camera.main.transform.position = rigidbody.transform.position - cameraOffset;线LateUpdate MonoBehaviour方法,你会好的,我认为(如果我理解正确的问题)。如果您需要进一步解释,您可以查找this

编辑:

这是我用来获取期望的结果(基于一个在你的包中找到)脚本:

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()'上输入错字吗?你删除了你复制的行吗到LateUpdate? – Kardux

+0

你确定它适合你吗?我现在在两个系统上测试过,行为是一样的。为了澄清事情,我上传了一个视频(https://youtu.be/12z526xrUpM)给youtube。立方体留在屏幕上的红十字中央,然后看看控制台:Camera.main.position和rigidbody.position是一样的... –