Как меч мечника может быть направлен на цель и следовать за ней при использовании гравитации планеты в единстве 3d? - PullRequest
0 голосов
/ 05 октября 2019

Мне было интересно, может ли кто-нибудь помочь мне с этим. Я пытаюсь заставить вражеского фехтовальщика следовать за моим игроком и нацелить меч на меня, но я не могу понять, почему это не сработает, и разгоняется (это работает без кода, указывающего на оружие)

    private void FixedUpdate()
    {
        Follow(target);
        rb.MovePosition(rb.position + transform.TransformDirection(moveDir) * walkSpeed * Time.deltaTime);
        AimTowards();
    }

    public void Follow(Transform target)
    {
        Vector3 targetVector = target.position - transform.position;
        float speed = (targetVector.magnitude) * 5;
        Vector3 directionVector = targetVector.normalized * speed;

        directionVector = Quaternion.Inverse(transform.rotation) * directionVector;
        moveDir = new Vector3(directionVector.x, directionVector.y, directionVector.z).normalized;
    }
    void AimTowards()
    {
        float angle = Mathf.Atan2(moveDir.y, moveDir.x) * Mathf.Rad2Deg;

        pivot.localRotation = Quaternion.AngleAxis(angle - 90, Vector3.down);
    }

ScreenShot

Вот его видео https://vimeo.com/364530113

Вот его видео без прицеливания https://vimeo.com/364530129

Здесьэто видео при использовании lookat (это странно) https://vimeo.com/364530148

1 Ответ

1 голос
/ 06 октября 2019

Lookat() является идеальным решением этой проблемы.


Учитывая, что в следующем случае меч имеет опору и родителя , который способен двигаться независимо и 1012 * цель *. См. Пример:

Example

В сводную таблицу добавьте очень простой скрипт, который будет гарантировать, что сводная точка будет смотреть на цель. Также убедитесь, что меч движется вперед по оси + Z :

Positive Z


В сценарии на разворотенапишите следующее:

//Target object
public Transform target;
//Pivot object (in this case the object the script is attached to)
public Transform pivot;

//Might want to use Update() instead
private void FixedUpdate()
{
    //Simply look at the target
    pivot.LookAt(target);
}

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


Кроме того, в вашем сценарии:

Vector3 targetVector = target.position - transform.position;
float speed = (targetVector.magnitude) * 5;
Vector3 directionVector = targetVector.normalized * speed;

Можно упростить до:

Vector3 targetVector = target.position - transform.position;
float speed = 5.0f;
Vector3 directionVector = targetVector * speed;

Поскольку нормализация изменяет величину вектора на 1, следовательно, умножение на истинную величину сделает его таким, чтобы оно никогда не нормализовалось. Как говорит @ Draco18s, он не обеспечит постоянного движения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...