Объект слишком быстр в Unity с использованием C#

#c# #unity3d

Вопрос:

Итак, я создал player, и вы можете управлять им с помощью мыши / пальца. Вы можете перемещать его влево / вправо, и он движется вперед сам по себе. Но проблема в том, что это слишком быстро. Вот мой код:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour{
    
    private SwerveInputSystem _swerveInputSystem;
    [SerializeField] private float swerveSpeed = 5f;
    [SerializeField] private float maxSwerveAmount = 1f;
    [SerializeField] private float verticalSpeed;

    void Start(){

        _swerveInputSystem = GetComponent<SwerveInputSystem>();
    }


    void Update(){
        float swerveAmount = Time.deltaTime * swerveSpeed * _swerveInputSystem.MoveFactorX;
        swerveAmount = Mathf.Clamp(swerveAmount, -maxSwerveAmount, maxSwerveAmount);
        transform.Translate(swerveAmount, 0, 0);
        float verticalDelta = verticalSpeed * Time.deltaTime;

        // Plug verticalDelta into Translate(). Whether you use it in the y or z component depends on your game.
        transform.Translate(swerveAmount, verticalDelta, 1);
    }
}
 

Комментарии:

1. Вы уменьшаете значение скорости поворота и проверяете его?

2. Никакой разницы. Та же скорость, ничего не изменилось

Ответ №1:

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

Это означает, что независимо от того, насколько быстрым или медленным является устройство, вы хотите, чтобы ваши объекты перемещались на одинаковое расстояние за одно и то же фактически прошедшее время.

Так же, как и в случае со значениями для компонентов X и Y, вы также должны умножить компонент Z на Time.deltaTime — время, прошедшее с момента последнего кадра, — чтобы преобразовать значение из a units / frame в units / second :

 // will now move forward one Unity unit per second
transform.Translate(swerveAmount, verticalDelta, 1f * Time.deltaTime);
 

Ответ №2:

Просто сделал это, и это работает:

 transform.Translate(swerveAmount, verticalDelta, 0.1f);