【问题标题】:Unity - Adding delays to my buttonsUnity - 为我的按钮添加延迟
【发布时间】:2017-10-23 16:37:49
【问题描述】:

我正在开发一个蛇游戏,我遇到了一个问题,如果我输入(上、下、左、右)太快,我的蛇会撞到自己。我试图在 Update() 下创建一个计时器来调节我的动作,但我发现我的蛇仍然不时地跑到自己身上。

我使用 InvokeRepeating() 每 0.05 秒移动一次我的蛇,我有 2 种输入方法:1​​) 更新以监听键盘输入(上、下、左、右箭头)和 2) 游戏手柄 UI(上、下、左、右箭头)下、左、右按钮)。关于如何调节方向变化的任何建议?

    void Start () {
        Screen.orientation = ScreenOrientation.Portrait;
        isPaused = false;
        InvokeRepeating("TimerInvoke", 0, deltaTimer);
    }

    void TimerInvoke() {
    Movement();
    StartCoroutine(checkVisible());
    if (currentSize == maxSize)
        TailFunction();
    else
        currentSize++;
    }

    void Update () {
         CompDirectionControl();
         PauseCMD();
    }

    void CompDirectionControl() {
    if (direction != Direction.South && Input.GetKeyDown(KeyCode.UpArrow))
        direction = Direction.North;
    if (direction != Direction.West && Input.GetKeyDown(KeyCode.RightArrow))
        direction = Direction.East;
    if (direction != Direction.North && Input.GetKeyDown(KeyCode.DownArrow))
        direction = Direction.South;
    if (direction != Direction.East && Input.GetKeyDown(KeyCode.LeftArrow))
        direction = Direction.West;
    }

    public void  MPadDirectionControl(int numDirection)
    {
    if (direction != Direction.South && numDirection == 0)
        direction = Direction.North;
    if (direction != Direction.West && numDirection == 1)
        direction = Direction.East;
    if (direction != Direction.North && numDirection == 2)
        direction = Direction.South;
    if (direction != Direction.East && numDirection == 3)
        direction = Direction.West;
    }

我尝试创建这样的东西,但延迟非常不一致

    if (Time.time >= timeStamp)
    {
        CompDirectionControl();
        timeStamp = Time.time + moveInterval;
    }

更新 通过使用协程,我能够为我的键盘输入添加延迟。但是,我还没有想出如何对我的按钮 UI 输入做同样的事情。如果我创建一个公共 IEnumerator GamePadDirControl(int direction),如何将按钮的参数传递给我的 IEnumator?即使我将我的 GamePadDirControl 设置为 public,我在 Inspector 中也看不到它,所以我无法将我的按钮链接到它

IEnumerator DirControl() {
    if (direction != Direction.South && Input.GetKeyDown(KeyCode.UpArrow))
    {
        yield return new WaitForSeconds(deltaTimer);
        direction = Direction.North;
    }
    else if (direction != Direction.West && Input.GetKeyDown(KeyCode.RightArrow))
    {
        yield return new WaitForSeconds(deltaTimer);
        direction = Direction.East;
    }
    else if (direction != Direction.North && Input.GetKeyDown(KeyCode.DownArrow))
    {
        yield return new WaitForSeconds(deltaTimer);
        direction = Direction.South;
    }
    else if (direction != Direction.East && Input.GetKeyDown(KeyCode.LeftArrow))
    {
        yield return new WaitForSeconds(deltaTimer);
        direction = Direction.West;
    }
}

更新 2 对于我的按钮 UI - 由于我的按钮无法与 IEnumator 函数链接,因此我决定为每个方向创建单独的协程,并从我的 public void MPadDirectionControl(int numDirection) 函数中调用它们。

按钮 ui 输入上的更新代码

public void MPadDirectionControl(int numDirection)
{
    if (direction != Direction.South && numDirection == 0)
    {
        StartCoroutine(IntervalN());
        //direction = Direction.North;
    }
    else if (direction != Direction.West && numDirection == 1)
    {
        StartCoroutine(IntervalE());
        //direction = Direction.East;
    }
    else if (direction != Direction.North && numDirection == 2)
    {
        StartCoroutine(IntervalS());
        //direction = Direction.South;
    }
    else if (direction != Direction.East && numDirection == 3)
    {
        StartCoroutine(IntervalW());
        //direction = Direction.West;
    }
}

IEnumerator IntervalN() {
    yield return new WaitForSeconds(deltaTimer);
    direction = Direction.North;
}

IEnumerator IntervalE()
{
    yield return new WaitForSeconds(deltaTimer);
    direction = Direction.East;
}

IEnumerator IntervalS()
{
    yield return new WaitForSeconds(deltaTimer);
    direction = Direction.South;
}

IEnumerator IntervalW()
{
    yield return new WaitForSeconds(deltaTimer);
    direction = Direction.West;
}

【问题讨论】:

    标签: c# unity3d unity5


    【解决方案1】:

    不确定我是否完全理解您的问题...

    你试图在延迟之前改变方向?

    如果是这样,我会尝试:

    StartCoroutine(ChangeDirectionTo(Direction.North, 0.05f));
    IEnumarator ChangeDirectionTo(Direction direction, float delay) {
       yield return new WaitForSeconds(delay);
       this.direction = direction;
    }
    

    【讨论】:

    • 嘿@Emanouil 我正在尝试为我的输入(键盘和按钮 UI)添加延迟。为了“移动”我的蛇,我运行一个 InvokeRepeating() 设置为我的程序在用户选择的方向上创建一个立方体的间隔。虽然我对输入进行了编码,因此蛇不能向后移动(即,如果蛇向北,它不能向南),问题是如果用户改变方向的速度快于统一移动蛇的速度,用户当前可以向后移动蛇(即蛇向北,用户改变方向向东然后向南,导致蛇在帧结束时撞到自己
    • 嗯,我看到了你的更新,协程解决了你一半的问题。关于在检查器中访问协程以将其链接到您的按钮,我通常通过创建一个辅助公共函数(void 不是 IEnumator)并从中调用协程来解决这个问题。
    • 感谢您的建议!我在玩,想出了同样的想法。我为每个方向创建了单独的协程,然后从我的公共输入函数中调用它们。似乎正在造成我现在需要的延迟!
    【解决方案2】:

    我想我看到了问题所在。您需要区分蛇的当前 方向和用户的命令 方向。试试这样的:

    if (direction != Direction.South && Input.GetKeyDown(KeyCode.UpArrow))
        nextDirection = Direction.North;
    if (direction != Direction.West && Input.GetKeyDown(KeyCode.RightArrow))
        nextDirection = Direction.East;
    if (direction != Direction.North && Input.GetKeyDown(KeyCode.DownArrow))
        nextDirection = Direction.South;
    if (direction != Direction.East && Input.GetKeyDown(KeyCode.LeftArrow))
        nextDirection = Direction.West;
    }
    

    然后在你实际创建立方体的代码中,在生成它之前,使用 nextDirection 告诉你玩家想去哪里:

    direction = nextDirection;
    

    因此玩家根本没有机会在立方体生成之前改变方向。

    这应该可行,但它的缺点是您不会获得某些蛇游戏所具有的良好“输入缓冲”效果,您可以在蛇向北掉头时点击向右,向下.如果你想这样做,你必须实现某种智能缓冲系统来检测玩家是否输入了一种非常特定类型的“无效”输入(当方向为北且 nextDirection 为东时为北/南)并设置蛇为未来的方向改变而准备。有点像为格斗游戏缓冲“特殊动作”输入。

    【讨论】:

    • 感谢@Nat 的建议
    • 我通过在我的方向控制上使用协程找到了一个解决方案,它适用于我的键盘输入。但是,我仍在寻找按钮 UI 输入的解决方案。我不知道如何运行使用按钮传入的参数的协程
    猜你喜欢
    • 1970-01-01
    • 2022-07-31
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    相关资源
    最近更新 更多