自顶向下的太空飞行物理- AddForce -物体移动的速度越快

本文关键字:移动 速度 AddForce 太空飞行 飞行物 自顶向下 太空 | 更新日期: 2023-09-27 18:16:07

我刚刚开始了一个小项目,我希望玩家从自上而下的角度控制一艘船。我希望整个东西都使用基于物理的运动。

我的问题是,当我向刚体添加力时,它所附着的对象似乎越快越偏离其位置。然而,变换。位置似乎没问题。

我把这个小统一包放在一起。如果你按W键,你按W键的时间越长,船就会向上移动并偏离中心。

代码相当简单:

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);
  }
}

感谢您的帮助。

谢谢,尼科

自顶向下的太空飞行物理- AddForce -物体移动的速度越快

只需将您的Camera.main.transform.position = rigidbody.transform.position - cameraOffset;行放在LateUpdate MonoBehaviour方法中,我认为您会很好(如果我正确理解了问题)。如果你需要进一步的解释,你可以找这个。

编辑:

下面是我用来获得所需结果的脚本(基于在包中找到的脚本):
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);
    }
}