c# - 如何在两个位置之间连续移动 GameObject?

标签 c# unity3d

我正在编写我的游戏 Boss 行为代码,在战斗的最后阶段,Boss 应该向玩家冲锋,然后回到原来的位置。等待 5 秒,然后执行相同的操作。

我尝试使用协同程序和 Vector2.MoveTowards() 来实现这一点,但没有得到预期的效果,首先老板不会“移向”玩家,而是立即出现在 targetPosition 处,然后就停留在那里,没有向后移动。

下面是我的代码:

private Vector2 chargeTarget;
private Vector2 tankStartPosition;

void Start()
{
    chargeTarget = new Vector2(-5.0f, transform.position.y);
    tankStartPosition = transform.position;
}

void Update()
{
    if (Time.time > nextCharge)
    {
        StartCoroutine(TankCharge());
        nextCharge = Time.time + chargeRate;
    }
}

IEnumerator TankCharge()
{
    transform.position = Vector2.MoveTowards(tankStartPosition, chargeTarget, Time.deltaTime * chargeSpeed);

    transform.position = Vector2.MoveTowards(chargeTarget, tankStartPosition, Time.deltaTime * returnSpeed);
}

知道我在这里做错了什么吗?以及如何实现我想要的操作?

谢谢

最佳答案

调用 MoveTowards 一次只会在游戏循环的迭代期间移动游戏对象一次。调用一次 MoveTowards 不会将游戏对象一直移动到其目标(除非 maxDistanceDelta 参数足够大,可以在一次迭代中将游戏对象移动到其目标) .

如果 boss 立即出现在目标处,我猜你的 chargeSpeed 太大了。

您要做的是在每个 Update 周期调用一次 MoveTowards。但是,按照您执行协程的方式,协程只会移动游戏对象一次然后退出。通常协程内部会有一个循环(否则协程运行一次就会退出)。像这样:

IEnumerator TankCharge()
{
    while (Vector3.Distance(transform.position, chargeTarget.position) > Mathf.Epsilon)
    {
        // Adjust this so this game object doesn't move the entire
        // distance in one iteration
        float distanceToMove = Time.deltaTime * chargeSpeed;

        transform.position = Vector3.MoveTowards(transform.position, chargeTarget.position, distanceToMove)

        yield return null;
    }
}

但是,对于您的情况,您实际上并不需要协程。您可以直接在 Update()

中执行此操作
    private bool returnToStart = false;
    private float timer;

    void Update
    {
        float distanceToMove = Time.deltaTime * chargeSpeed;

        if (timer <= 0)
        {
            if (!returnToStart)
            {
                transform.position = Vector3.MoveTowards(transform.position, chargeTarget.position, distanceToMove)

                // Target reached?  If so, start moving back to the original position
                if (Vector3.Distance(transform.position, chargeTarget.position) <= Mathf.Epsilon)
                {
                    returnToStart = true;
                    this.timer = this.chargeRate;
                }
            }
            else
            {
                transform.position = Vector3.MoveTowards(transform.position, tankStartPosition.position, distanceToMove)

                // Original position reached?  If so, start moving to the target
                if (Vector3.Distance(transform.position, tankStartPosition.position) <= Mathf.Epsilon)
                {
                    returnToStart = false;
                    this.timer = this.chargeRate;
                }
            }
        }
        else
        {
            this.timer -= Time.time;
        }
    }    

关于c# - 如何在两个位置之间连续移动 GameObject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56284324/

相关文章:

c# - 在C#中有没有 "clean"方式跳出 "try" block 无异常

ios - 由于未编译着色器,Unity 应用程序在 iOS 上崩溃

android - 使用Unity编译后是否可以读取apk文件脚本?

unity3d - 提取 _CameraDepthTexture 值 Unity

c# - 一个 Function App 中包含多个已编译的库

c# - 允许在 .ASCX 控件完成加载之前显示 .ASPX 页面吗?

c# - Unity - 等待 HTTP 请求解析

c# - Unity中Image的onClick事件

c# - 为什么在没有 new() 泛型类型约束的情况下允许 Activator.CreateInstance<T>() ?

c# - 具有泛型的结构图配置