Вращение персонажа третьего лица программно из стандартных активов Unity - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь автоматизировать случайное вращение персонажа от третьего лица в Unity, и я хотел бы, чтобы вращение было анимированным , как если бы я сам поворачивал плеер, используя нестандартный контроллер иWASD ключи.Цель - NPC, который случайно вращается, ища кого-то в толпе.

Вот что я пытался сделать в сопрограмме в обновлении.

float xDegress = Random.Range(10f, 75f);
float yDegress = Random.Range(10f, 75f);
float zDegress = Random.Range(10f, 75f);

// Works but immediate
this.transform.Rotate(0f, yDegress, 0f);

// Works but immediate
this.transform.LookAt(new Vector3(xDegress, 0f, zDegress));

// Doesn't work 
rB.rotation = Quaternion.Lerp(transform.rotation, new Quaternion(0, yDegress, 0, 0), 0.5f);

// Doesn't work 
rB.MoveRotation(new Quaternion(0, yDegress, 0, 1).normalized);

// Works but immediate
Vector3 newPosition = new Vector3(xDegress, 0f, zDegress);
transform.rotation = Quaternion.Lerp(
    transform.rotation,
    Quaternion.LookRotation(newPosition, Vector3.up),
    0.5f);

yield return new WaitForSeconds(_pauseSeconds);

Вот инспектор для NPC, который является Итаном из стандартных активов.

enter image description here

1 Ответ

0 голосов
/ 04 февраля 2019

Прежде всего, поскольку это RigidBody, вы не должны использовать transform.rotation = или какой-либо transform. метод вообще, но придерживайтесь rb.MoveRotation или rb.rotation.

, чем вы использовали Lerp "неправильным" образом.То, что вы хотите, это значение, которое увеличивается от 0 до 1.Вызов его только один раз с фиксированным коэффициентом 0.5f всегда приводит к повороту на полпути между первым и вторым - немедленно.


Сначала вам нужна желаемая продолжительность вращения.

// How long in seconds should the rotation take? 
// might be a constant or set via the inspector
public float rotationDuration = 1.0f;

Чем раньше вы начали вращение, получите начальное и конечное вращение

float xDegress = Random.Range(10f, 75f);
float yDegress = Random.Range(10f, 75f);
float zDegress = Random.Range(10f, 75f);

var currentRotation = transform.rotation;

var targetRotation = currentRotation * Quaternion.Euler(xDegress, yDegress, zDegress);
// or
Vector3 newPosition = new Vector3(xDegress, 0f, zDegress);
var targetRotation = Quaternion.LookRotation(newPosition, Vector3.up);
// or whatever your target rotation shall be

Теперь, так как вы уже находитесь в сопрограмме, вы можете просто добавить цикл while, выполняющий вращение в течение требуемой продолжительности(не забывайте, хотя yield)

var passedTime = 1.0f;
while(passedTime < rotationDuration)
{
    // interpolate the rotation between the original and the targetRotation
    // factor is a value between 0 and 1
    rb.MoveRotation = Quaternion.Lerp(currentRotation, targetRotation, passedTime / rotationDuration);

    // add time passed since last frame
    passedtime += Time.deltaTime;
    yield return null;
}

// to avoid overshooting set the target rotation fix when done
transform.rotation = targetRotation;

yield return new WaitForSeconds(_pauseSeconds);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...