2016-11-02 5 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

Кстати, вы можете сделать камеру ребенком корабля, и она будет следовать за ней автоматом. – code11

+0

[Видео] (https://youtu.be/12z526xrUpM). Камера, похоже, не проблема. Присоединение камеры к объекту приводит к такому же поведению. –

ответ

1

Просто поставить Camera.main.transform.position = rigidbody.transform.position - cameraOffset; линии в LateUpdate метода MonoBehaviour и вы будете хорошо, что я думаю, что (если я правильно понял проблему). Вы можете найти 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()'? Удалили ли вы скопированную строку to LateUpdate? – Kardux

+0

Вы уверены, что он работает для вас? Я тестировал на двух системах сейчас, и все одинаково. Чтобы уточнить, что я загрузил видео (https://youtu.be/12z526xrUpM) на youtube. куб остался посередине экрана на красном кресте. Посмотрите на консоль: Camera.main.position и rigidbody.position одинаковы ... –