【问题标题】:Have enemy accelerate towards player in Unity让敌人在 Unity 中向玩家加速
【发布时间】:2020-06-17 05:32:37
【问题描述】:

我有一个脚本让敌人以相同的速度向玩家移动,但我试图让敌人在切换方向时减速然后加速。敌人目前只是向左移动并写向玩家的位置。 这是我老板在更新函数中附加的脚本中的代码:

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

我也尝试过使用 Lerp 并使用 transform.position 作为第一个参数,但是当玩家靠近时,boss 会变慢,当玩家远离时会变快。

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"); 
    }
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    要获得位置(米/秒),您需要乘以速度 * Time.deltatime,从而获得米。要处理加速度,您需要处理可变速度。加速度是 m/s2,乘以 * Time.deltatime 您将获得即时速度,而该速度 * Time.deltaTime 将为您提供位置。

    这里有一些伪代码(step 和 speed 应该是类变量,并且在更新中进行了修改。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);
      }
    }
    

    编辑器中附加的脚本屏幕截图:

    将脚本附加到要移动的游戏对象上,并在公共字段中附加目标的变换。选择你的加速度,正向加速,负向加速,然后你就明白了。

    【讨论】:

    • 您好,我不确定您所说的步骤是什么意思。
    • 每次调用移动当前的距离。它是您已在示例代码中使用的 MoveTowards 函数的第三个参数。它只是我给变量的名称,作为实体移动的距离步长。我认为它的 = 而不是 += 在步骤中。我在答案中纠正了这一点
    • 您好,我现在了解这 3 行代码,但您能否提供更多详细信息,因为我不确定如何在我的脚本中实现它。谢谢!
    • 张贴你的敌人剧本
    • 我发布了整个脚本。我一开始没有发布它,因为有很多代码与我想要实现的目标无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多