c# - 让敌人在 Unity 中向玩家加速
问题描述
我有一个脚本让敌人以相同的速度向玩家移动,但我试图让敌人在切换方向时减速然后加速。敌人当前只是向左移动并写向玩家的位置。这是我老板在更新函数中附加的脚本中的代码:
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 会变慢,而当玩家更快时,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");
}
}
解决方案
为了获得位置(米/秒),您将速度 * Time.deltatime 相乘,从而获得米。要处理加速度,您需要处理可变速度。加速度是 m/s2,乘以 * Time.deltatime 您将获得即时速度,而该速度 * Time.deltaTime 将为您提供位置。
这里有一些伪代码(步长和速度应该是类变量,并且在更新中进行了修改。加速是恒定的加速度,为了简单起见应该是常数,我猜你需要均匀加速的运动):
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);
}
}
编辑器中附加的脚本截图:
将脚本附加到要移动的游戏对象上,并在公共字段中附加目标的变换。选择你的加速度,正向加速,负向加速,然后你就明白了。
推荐阅读
- python - 在 Anaconda 中安装“time”包时出错
- javascript - 灯箱画廊有什么问题?
- python-3.x - 通过 PyInstaller 构建后,键盘库停止侦听键盘快捷键
- python - Python ConfigParser 检查选项是否为空的有效方法
- docker - docker 容器中的应用程序如何访问 Windows 中的数据库?
- php - Ci 在不同的项目中使用相同的会话
- node.js - 如何在 Node.js 中设置变量值以获取请求的正文数据
- javascript - 如何在对象数组上使用javascript reduce
- objective-c - 如何向我的 Xcode 项目添加 GZIP 支持
- android - 无法在动态功能中访问 android.support.v4.view.KeyEventDispatcher.Component