簡體   English   中英

Unity-為我的按鈕添加延遲

[英]Unity - Adding delays to my buttons

我正在開發蛇游戲,但遇到一個問題:如果我以太快地擊中輸入(上,下,左,右),我的蛇就會碰上它自己。 我試圖在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方向),如何將按鈕的參數傳遞給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函數鏈接,因此我決定為每個方向創建單獨的協程,並從我的公共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;
}

不確定我是否完全理解您的問題...

您是否試圖在延遲之前改變方向?

如果是這樣,我將嘗試:

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

我想我看到了問題。 您需要區分蛇的當前方向和用戶的命令方向。 嘗試這樣的事情:

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為東時,北/南)並進行設置蛇為將來的方向改變做准備。 有點像為格斗游戲緩沖“特殊動作”輸入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM