Заставьте врага ускориться к игроку в Unity - PullRequest
0 голосов
/ 17 июня 2020

У меня есть сценарий, в котором противник движется к игроку с той же скоростью, но я пытаюсь заставить врага замедляться, а затем ускоряться, когда он меняет направление. Враг в данный момент просто двигается влево и пишет в сторону позиции игрока. Вот мой код из скрипта, к которому мой босс прикреплен в функции обновления:

Vector2 targetPosition = new Vector2 (player.transform.position.x, transform.position.y); 
transform.position = Vector2.MoveTowards (transform.position, targetPosition, moveSpeed * Time.deltaTime);

Я также пробовал использовать Lerp и использовать transform.position в качестве первого параметра, но босс работает медленнее, когда игрок ближе и быстрее, когда игрок быстрее.

transform.position = Vector2.Lerp (transform.position, targetPosition, moveSpeed * Time.deltaTime);

Кто-нибудь знает, как заставить врага замедлиться, затем постепенно увеличивать его скорость, когда он меняет направление, а затем возвращаться к нормальной скорости после того, как он закончил менять направление

** РЕДАКТИРОВАТЬ : ** полный сценарий ниже

using UnityEngine;

public class Roll : StateMachineBehaviour
{
    [SerializeField] private float moveSpeed = 2.4f; 
    [SerializeField] private float rotateSpeed = 100f; 

    [SerializeField] private float minRollTime = 6f;
    [SerializeField] private float maxRollTime = 8f;
    private float rollTimer = 0f; 

    [SerializeField] private float rightBoundary = 5f;
    [SerializeField] private float leftBoundary = -5f;

    private Transform playerTransform = null;
    private BossHealth bossHealth = null;     
    private Transform bossTransform = null;
    private Transform bodyTransform = null;
    private Transform earsTransform = null; 

    private Vector2 targetPosition = Vector2.zero; 

    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        playerTransform = GameObject.FindWithTag("Player").transform; 

        bossHealth = animator.GetComponent<BossHealth>(); 

        Boss01 boss = FindObjectOfType<Boss01>(); 
        bossTransform = boss.bossTransform;  
        bodyTransform = boss.bodyTransform; 
        earsTransform = boss.earsTransform; 

        rollTimer = Random.Range (minRollTime, maxRollTime); 
    }

    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        if (bossTransform.position.x >= leftBoundary && bossTransform.position.x <= rightBoundary)
        {
            targetPosition = new Vector2(playerTransform.position.x, bossTransform.position.y);
            bossTransform.position = Vector2.MoveTowards(bossTransform.position, targetPosition, moveSpeed * Time.deltaTime);

            if (playerTransform.position.x > 0)
                bodyTransform.Rotate(0f, 0f, -rotateSpeed * Time.deltaTime); 
            else
                bodyTransform.Rotate(0f, 0f, rotateSpeed * Time.deltaTime); 
        }
        else if (bossTransform.position.x < leftBoundary) 
        {
            if (playerTransform.position.x > bossTransform.position.x) 
            {
                targetPosition = new Vector2(playerTransform.position.x, bossTransform.position.y);
                bossTransform.position = Vector2.MoveTowards(bossTransform.position, targetPosition, moveSpeed * Time.deltaTime);
            }
        }
        else
        {
            if (playerTransform.position.x < bossTransform.position.x) 
            {
                targetPosition = new Vector2(playerTransform.position.x, bossTransform.position.y);
                bossTransform.position = Vector2.MoveTowards(bossTransform.position, targetPosition, moveSpeed * Time.deltaTime);
            }
        }

        if (rollTimer <= 0f)
            animator.SetTrigger ("aim"); 
        else
            rollTimer -= Time.deltaTime; 

        if (bossHealth.CheckHealth())
            animator.SetTrigger ("transition"); 

        if (earsTransform.rotation != Quaternion.Euler (0f, 0f, 0f))
            earsTransform.rotation = Quaternion.Slerp(earsTransform.rotation, Quaternion.Euler(0f, 0f, 0f), 1f * Time.deltaTime); 
    }

    override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        animator.ResetTrigger ("aim"); 
        animator.ResetTrigger ("transition"); 
    }
}

1 Ответ

1 голос
/ 17 июня 2020

Чтобы достичь положения (метры в секунду), вы умножаете скорость на * Time.deltatime, чтобы получить метры. Чтобы справиться с ускорением, вам нужно управлять переменной скоростью. Ускорение составляет м / с2, умноженное на * Time.deltatime, вы получите мгновенную скорость, и эта скорость * Time.deltaTime даст вам положение.

Вот какой-то псевдокод (шаг и скорость должны быть переменными класса, и это изменено в обновлении. Accel - это постоянное ускорение, которое должно быть постоянным для простоты, я думаю, вам нужно равномерно ускоренное движение):

speed += accel * Time.deltaTime; // instant speed
step =  speed * Time.deltaTime; // calculate distance to move
transform.position = Vector3.MoveTowards(transform.position, target.position, step);

Знак ускорения + или - вы определите, увеличивается (ускоряется) или уменьшается (замедляется) скорость объектов.

Надеюсь, что это поможет

Изменить:

Полный скрипт:

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

public class MoveTowards : MonoBehaviour
{
  public Transform target;
  private float step = 0f;
  private float speed = 0f;
  public float accel = 0f;
  // Start is called before the first frame update
  void Start()
  {

  }

  // Update is called once per frame
  void Update()
  {
    speed += accel * Time.deltaTime; // instant speed
    step = speed * Time.deltaTime; // calculate distance to move
    transform.position = Vector3.MoveTowards(transform.position, target.position, step);
  }
}

Скриншот скрипта, прикрепленного в редакторе:

enter image description here

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

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