Как сделать так, чтобы персонаж смотрел в направлении движения? - PullRequest
1 голос
/ 20 сентября 2019

Кто-нибудь знает, как я мог адаптировать свой код так, чтобы персонаж смотрел в том направлении, в котором он перемещается?Я понимаю, что этот вопрос может показаться дубликатом существующих вопросов, но я не уверен, где / как применить правильный код поворота в моем коде:

coroutineAllowed = false;
Vector2 p0 = routelist[routeIndex].routes[routeNumber].GetChild(0).position;
Vector2 p1 = routelist[routeIndex].routes[routeNumber].GetChild(1).position;
Vector2 p2 = routelist[routeIndex].routes[routeNumber].GetChild(2).position;
Vector2 p3 = routelist[routeIndex].routes[routeNumber].GetChild(3).position;

while (tParam < 1)
{
    tParam += Time.deltaTime * speedModifier;
    characterPosition = Mathf.Pow(1 - tParam, 3) * p0 +
        3 * Mathf.Pow(1 - tParam, 2) * tParam * p1 +
        3 * (1 - tParam) * Mathf.Pow(tParam, 2) * p2 +
        Mathf.Pow(tParam, 3) * p3;
    transform.position = characterPosition;
    yield return new WaitForEndOfFrame();
}

Ответы [ 4 ]

1 голос
/ 23 сентября 2019

Спрайты в Unity являются (обычно, если не всегда) нормальными к их локальному направлению forward.Вот почему установка их локального направления вперед в направлении, перпендикулярном направлению орфографической камеры, приводит к тому, что они становятся невидимыми.

Из изображений, которыми вы поделились в других ответах, кажется, что вам нужно повернуть локальное положение персонажа.«вверх» в противоположном направлении, в котором они движутся, сохраняя при этом локальное «прямое» направление персонажа, указывающее в глобальном направлении вперед.

Вы можете использовать Quaternion.LookRotation, чтобы сделать это, хотя вам нужно быть немного креативным с параметрами, указав направление, с которым вы хотите отойти, как параметр upи глобальный forward в качестве прямого параметра.

coroutineAllowed = false;
Vector2 p0 = routelist[routeIndex].routes[routeNumber].GetChild(0).position;
Vector2 p1 = routelist[routeIndex].routes[routeNumber].GetChild(1).position;
Vector2 p2 = routelist[routeIndex].routes[routeNumber].GetChild(2).position;
Vector2 p3 = routelist[routeIndex].routes[routeNumber].GetChild(3).position;

while (tParam < 1)
{
    tParam += Time.deltaTime * speedModifier;
    Vector3 fromPosition = transform.position;

    characterPosition = Mathf.Pow(1 - tParam, 3) * p0 +
        3 * Mathf.Pow(1 - tParam, 2) * tParam * p1 +
        3 * (1 - tParam) * Mathf.Pow(tParam, 2) * p2 +
        Mathf.Pow(tParam, 3) * p3;
    transform.position = characterPosition;

    Vector3 newLocalUpDirection = fromPosition - transform.position;

    transform.rotation = Quaternion.LookRotation(Vector3.forward, newLocalUpDirection);

    yield return new WaitForEndOfFrame();
}
0 голосов
/ 22 сентября 2019

Попробуйте сделать это таким образом, сначала получите Lookvector, а затем направьте персонажа на него.

while (tParam < 1)
{
    tParam += Time.deltaTime * speedModifier;
    characterPosition = Mathf.Pow(1 - tParam, 3) * p0 +
        3 * Mathf.Pow(1 - tParam, 2) * tParam * p1 +
        3 * (1 - tParam) * Mathf.Pow(tParam, 2) * p2 +
        Mathf.Pow(tParam, 3) * p3;
    Vector3 v3 = characterPosition;
    Vector3 Lookvector = v3 - transform.position;
    Quaternion rotation = Quaternion.LookRotation(Lookvector);
    transform.rotation = rotation;
    transform.position = characterPosition;
    yield return new WaitForEndOfFrame();
}
0 голосов
/ 23 сентября 2019

Вы смотрели на это:

https://docs.unity3d.com/ScriptReference/Quaternion.LookRotation.html

это также может вращаться в пространстве x и z, но вы можете обойти это и сделать что-то вроде:

// Direction vector
Vector3 relativePos = target.position - transform.position;

// the second argument, upwards, defaults to Vector3.up
Quaternion rotation = Quaternion.LookRotation(relativePos, Vector3.up);

// fix rota so that only y rotation occures.
var vectorRota = rotation.EulerAngles;
Vector3 fixedYRotation =  new Vector(0f, vectorRota.y, 0f);

// create Quaternion back from Vector3
Quaternion finalRotation = Quaternion.Euler(fixedYRotation );

// assing rotation to GameObject
gameObject.transform.rotation = finalRotation;
0 голосов
/ 20 сентября 2019

Вы можете использовать transform.LookAt(Vector3) так:

characterPosition = Mathf.Pow(1 - tParam, 3) * p0 +
    3 * Mathf.Pow(1 - tParam, 2) * tParam * p1 +
    3 * (1 - tParam) * Mathf.Pow(tParam, 2) * p2 +
    Mathf.Pow(tParam, 3) * p3;
transform.LookAt(characterPosition);
transform.position = characterPosition;
...