Я запустил новую игру, которая не требует мыши, оставляя движение до клавиатуры. Я попытался включить 8 направлений; вверх, влево, вправо, вверх-вправо и так далее. Однако, когда я нажимаю более одной клавиши со стрелкой, скорость движения увеличивается ( http://gfycat.com/CircularBewitchedBarebirdbat ). Как я мог противодействовать этому?
Вот соответствующая часть моего кода:
var speed : int = 5;
function Update () {
if (Input.GetKey(KeyCode.UpArrow)) {
transform.Translate(Vector3.forward * speed * Time.deltaTime);
} else if (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.RightArrow)) {
transform.Translate(Vector3.forward * speed * Time.deltaTime);
} else if (Input.GetKey(KeyCode.UpArrow) && Input.GetKey(KeyCode.LeftArrow)) {
transform.rotation = Quaternion.AngleAxis(315, Vector3.up);
}
if (Input.GetKey(KeyCode.DownArrow)) {
transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
}
unity
javascript
movement
eren_tetik
источник
источник
Ответы:
Отделите ваш код выбора направления от фактического кода движения.
Direction
, проверив, какие клавиши нажаты. Сохраните его как единичный (нормализованный) вектор.Direction
наSpeed
и сDeltaTime
.источник
Вам нужно взять сумму направлений, нормализовать ее, а затем умножить на скорость.
Я косвенно ответил на это как часть моего ответа на Предотвращение диагонального движения
В частности:
источник
«Нормализованный вектор направления» - это то, как обычно выполняется эта задача, и как я часто это делаю, но в последнее время я просто ограничивал результирующий вектор движения. Обычно он достигает того же конечного результата, а код намного проще:
Более простой код почти всегда лучше: E
источник
ClampMagnitude
разве это не тот же самый код, что иNormalize * Constant
в самом деле?moveSpeed
умножил с после зажима и, возможно, слил бы его с умножением наdeltaTime
.