Ошибка в тире с Rigidbody2D.Velocity

Итак, я делаю игру в единстве, в которой объект будет двигаться в направлении (единичном векторе) щелчка мыши игрока. Основываясь на переменных скорости рывка и времени рывка, которые я сделал и установил в инспекторе, это обычно будет работать, так как расстояние, пройденное объектом, и его скорость обычно постоянны. Однако иногда расстояние рывка до объекта будет отключено. Я попытался устранить проблему, записав расстояние рывка и скорость объекта, и обнаружил, что иногда одна или обе переменные имеют какое-то случайное значение по какой-то причине, которое я пропускаю. В большинстве кликов переменные имеют одно и то же число. Вот мой код:

[RequireComponent(typeof(Rigidbody2D))]
public class DashController : MonoBehaviour
{
Rigidbody2D rigidbody;
public float dashSpeed;
public float dashTime; //dash time for inspector use
float codeDashTime; //dash time for code use
bool dashing;
Vector2 direction;
Vector2 startPosition;
Vector2 endPosition;
float distance;

private void Start()
{
    rigidbody = GetComponent<Rigidbody2D>();
    codeDashTime = dashTime;
    dashing = false;
}

private void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        //need to subtract the current postion from the target postion
        direction = (Camera.main.ScreenToWorldPoint(Input.mousePosition) - this.transform.localPosition);
        startPosition = this.transform.localPosition; // used to see the distance player dashes
        dashing = true;
    }

    if (dashing)
    {
        Dash();
    }
}

void Dash()
{
    if (codeDashTime > 0)
    {
        rigidbody.velocity = direction.normalized * dashSpeed;
        codeDashTime -= Time.deltaTime;
    }
    else
    {
        Debug.Log(rigidbody.velocity.magnitude);// used to see the velocity the player travels at
        Debug.Log(direction.normalized.magnitude);
        rigidbody.velocity = Vector2.zero;
        endPosition = this.transform.localPosition; // used to see the distance player dashes
        distance = Vector2.Distance(startPosition, endPosition);// used to see the distance player dashes
        Debug.Log(distance); // used to see the distance player dashes
        dashing = false;
        codeDashTime = dashTime;
    }
}

}

Извините, если мой код немного перепутан. Я много перемещал вещи, тестируя разные решения, но ничего не сработало. Мое лучшее предположение состоит в том, что, возможно, что-то с фреймами испортило codeDashTime, но я слишком новичок в единстве и C #, чтобы знать. Любая помощь приветствуется, спасибо.


person bob look    schedule 27.05.2018    source источник


Ответы (1)


Вся физика должна работать в FixedUpdate, а входные данные обычно используются в Update, попробуйте разделить их, чтобы получить лучшее поведение Rigidbody.

person Horothenic    schedule 27.05.2018
comment
Ух ты. Спасибо за быстрый ответ. Определенно попробую это. - person bob look; 28.05.2018
comment
Благослови вас, это сработало. Хороший совет, чтобы знать тоже спасибо. - person bob look; 28.05.2018