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