[英]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.