Как я могу переместить персонажей на определенные позиции с помощью анимации ходьбы? - PullRequest
0 голосов
/ 22 декабря 2018

Я использую Аниматор для прогулок.Но я также хочу, чтобы персонажи шли по определенным позициям, а не просто шли прямо с анимацией.

Original position start

И отсюда они начинают идти вперед.Затем я проверяю расстояние от цели и заставляю их останавливаться близко к цели.

Это цель: ShieldFX.

Target

Как только они оказываются достаточно близко, они перестают ходить и солдаты вращаются, но проблема в том, что они не находятся перед серединой ShieldFX:

Два солдата, левый из которых находится вне области ShieldFX,право слишком внутри женского персонажа и слишком много слева.Я хочу, чтобы они оказались в конце, когда они остановятся перед ShieldFX, где оба солдата с обеих сторон ShieldFX и женщина будут посередине.

Positions in the end of walking

Так что либо в начале, чтобы как-то расположить их прямо перед ShieldFX, но это трудно сделать точным, либо, возможно, используя что-то в скрипте, чтобы переместить их в нужные мне позиции.

Скриптприкреплен к пустому GameObject:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AnimatorController : MonoBehaviour
{
    public Animator[] animators;
    public Transform target;
    public float speed = 1f;
    public float rotationSpeed;
    public bool slowDown = false;

    private bool endRot = false;

    // Use this for initialization
    void Start()
    {
        for (int i = 0; i < animators.Length; i++)
        {
            animators[i].SetFloat("Walking Speed", speed);
        }
    }

    // Update is called once per frame
    void Update()
    {
        float distanceFromTarget = Vector3.Distance(animators[2].transform.position, target.position);

        if (slowDown)
        {
            if (distanceFromTarget < 15)
            {
                float speed = (distanceFromTarget / 15) / 1;
                for (int i = 0; i < animators.Length; i++)
                {
                    animators[i].SetFloat("Walking Speed", speed);
                }
            }
        }

        if (distanceFromTarget < 2f)
        {
            for (int i = 0; i < animators.Length; i++)
            {
                animators[i].SetFloat("Walking Speed", 0);
            }

            if (!endRot)
            {
                Quaternion goalRotation = Quaternion.Euler(0f, 0f, 0f);
                float angleToGoal = Quaternion.Angle(
                        goalRotation,
                        animators[0].transform.localRotation);
                float angleThisFrame = Mathf.Min(angleToGoal, rotationSpeed * Time.deltaTime);

                // use axis of Vector3.down to keep angles positive for ease of use
                animators[0].transform.Rotate(Vector3.up, angleThisFrame);
                animators[1].transform.Rotate(Vector3.down, angleThisFrame);

                // We end if we rotated the remaining amount.
                endRot = (angleThisFrame == angleToGoal);
            }
        }
    }
}

Я пытался в Обновлении добавить эту часть:

for(int i = 0; i < animators.Length; i++)
        {
            animators[i].transform.position = Vector3.MoveTowards(animators[i].transform.position, target.position, speed * Time.deltaTime);
        }

Но затем он заставляет их всех идти к одной точке, и они не останавливаютрасстояние, которое они делали раньше:

Positions in the end when using Vector3.MoveTowards

В конце я хочу, чтобы они заняли позицию в конце: я переместил родительский объект, символы которогоДитя пока игра работает только для того, чтобы показать, как это должно быть в конце.

Positions it should be in the end

Идея состоит в том, что где бы я ни положилперсонаж в позициях, но в конце они шоположение будет как на последнем скриншоте.

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