動態(tài)網站開發(fā)工程師—aspseo一鍵優(yōu)化
最終效果
前言
我們要實現的功能是雙擊疾跑,當玩家快速地按下同一個移動鍵兩次時能進入跑步狀態(tài)
我假設快速按下的定義為0.2秒內,按下同一按鍵兩次
簡單的分析一下需求,實現它的關鍵在于獲得按鍵按下的時間,我們需要知道第一次按下按鍵的時間,然后判斷規(guī)定時間內有沒有按下按鍵
有兩種實現方法
第一種
啟動一個計時器,判斷在計時器結束之前有沒有再次按下這個鍵
第二種
是分別記錄下兩次按鍵的時間,然后用第二次按下的時間減去第一次按下的時間,判斷是否小于0.2
這里我采用第二種方法,為了獲取按下的時間,我們需要使用到Unity給我們提供的Time類,里面的Time.time會提供游戲啟動到現在運行了多少秒,這個需求還需要我們檢測到按鍵是否被按下,我打算使用Input Manager來實現
public static float GetAxis (string axisName);
public static float GetAxisRaw(string axisName);
GetAxisRaw會在檢測到按鍵后,馬上返回1或-1,松開按鍵后馬上變成0
而GetAxis會在檢測到按鍵的時候,從0過渡到1或-1,松開按鍵后再過渡到0
為了方便,我使用GetAxisRaw來獲得輸入的時間,當按鍵按下時意味著GetAxisRaw的返回值為1的絕對值,我們在符合條件的時候使用Time.time來獲得當前的時間即可
但顯然,我們不希望玩家按下a后馬上按下d,還能讓人物進入到疾跑狀態(tài),所以兩個按鍵的輸入時間要分開存儲,還有一個需要注意的地方是,當玩家開始走路或疾跑時,a鍵或d鍵是按住不放的,所以當玩家在移動的時候,我們要使個bool變量為真,當這個變量為真時,就不再刷新輸入的時間
我們設想一下,玩家進入游戲以后,馬上按下了一次移動鍵,如果他電腦開游戲開的特別的快,他第一次按下移動鍵的時間,離打開游戲不到0.2秒,如果我們存儲按鍵時間的變量,沒有初始化,那么會默認賦值為0,當他第一次按下移動時,就會進入到疾跑狀態(tài),這很明顯是我們不想要看到的bug
所以最后一個要點是給存儲按鍵時間的變量進行初始化,但初始化的只要賦值為多少也是一個值得考慮的問題,如果賦值為一個極大的正數,就算賦值為1萬,萬一玩家一開始在掛機剛好在10,000.01秒,按一下移動按鍵,還是會錯誤地進入到疾跑狀態(tài),所以可以給他賦值為,負的最大等待輸入時間,如果實在不放心,可以賦值為2倍,這樣第一次輸入就不會出現bug
經過了這么多的分析,相信你此時此刻已經完全明白了,接下來我們進入到代碼實戰(zhàn)環(huán)節(jié)
開始
配置動畫,walk為true進入走路動畫,run為true進入跑步動畫
public class PlayerController : MonoBehaviour
{private Rigidbody2D rb;private Animator animator;public float maxAwaitTime;private float leftPressTime, rightPressTime;private bool moving, canRun;public int walkSpeed, runSpeed;private int currentSpeed;private float h;private void Awake(){rb = GetComponent<Rigidbody2D>();animator = GetComponent<Animator>();leftPressTime = rightPressTime = -maxAwaitTime;}private void Update(){h = Input.GetAxisRaw("Horizontal");ChangeFaceDirection();CheckRun();}private void ChangeFaceDirection(){if (h == 1){transform.localScale = new Vector3(1, 1, 1);}else if (h == -1){transform.localScale = new Vector3(-1, 1, 1);}}private void CheckRun(){if (h == 1 && !moving){if (Time.time - rightPressTime <= maxAwaitTime){canRun = true;}rightPressTime = Time.time;}if (h == -1 && !moving){if (Time.time - leftPressTime <= maxAwaitTime){canRun = true;}leftPressTime = Time.time;}//取 h 的絕對值if (Mathf.Abs(h) == 1){moving = true;if (canRun){currentSpeed = runSpeed;animator.SetBool("run", true);}else{currentSpeed = walkSpeed;animator.SetBool("walk", true);}}else{animator.SetBool("run", false);animator.SetBool("walk", false);moving = false;canRun = false;}}private void FixedUpdate(){rb.velocity = new Vector2(h * currentSpeed * Time.deltaTime, rb.velocity.y);}
}
效果
參考
【視頻】https://www.bilibili.com/video/BV1YN4113771/
完結
贈人玫瑰,手有余香!如果文章內容對你有所幫助,請不要吝嗇你的點贊評論和關注
,以便我第一時間收到反饋,你的每一次支持
都是我不斷創(chuàng)作的最大動力。當然如果你發(fā)現了文章中存在錯誤
或者有更好的解決方法
,也歡迎評論私信告訴我哦!
好了,我是向宇
,https://xiangyu.blog.csdn.net
一位在小公司默默奮斗的開發(fā)者,出于興趣愛好,于是最近才開始自習unity。如果你遇到任何問題,也歡迎你評論私信找我, 雖然有些問題我可能也不一定會,但是我會查閱各方資料,爭取給出最好的建議,希望可以幫助更多想學編程的人,共勉~