Unity2D 實(shí)現(xiàn)按鍵控制角色移動(dòng)的幾種方法

移動(dòng)是角色和游戲場(chǎng)景交互的基本功能,一般會(huì)先于其他功能實(shí)現(xiàn)

在實(shí)現(xiàn)移動(dòng)前,根據(jù)具體的游戲類型,要先大致確定要實(shí)現(xiàn)怎么樣的移動(dòng)操作體驗(yàn):

①橫版過關(guān),角色在地上跑的,類似于超級(jí)馬里奧這種,移動(dòng)的時(shí)候會(huì)有一定慣性,可以利用地面材質(zhì)的摩擦系數(shù)來實(shí)現(xiàn)

②彈幕射擊類游戲,類似于以撒的結(jié)合或者雷霆戰(zhàn)機(jī),角色要進(jìn)行很多躲避操作,這時(shí)就不能有太大慣性

③太空戰(zhàn)斗類游戲,類似于遠(yuǎn)行星號(hào),戰(zhàn)機(jī)根據(jù)質(zhì)量大小有著不同的機(jī)動(dòng)性,這時(shí)就需要考慮慣性包括轉(zhuǎn)向速度的影響

④俯視角走格子的2D游戲,馬基埃亞爾的傳說的這種roguelike類的,每次移動(dòng)會(huì)移動(dòng)固定距離,偏向于走格子,可以直接用moveposition來實(shí)現(xiàn)

類型①的游戲,移動(dòng)一般通過添加rigidbody2D,并給此組件施加力或直接修改velocity來實(shí)現(xiàn)移動(dòng),代碼示例:

if (buttonLDown == true && buttonRDown == false )//按下左鍵或右鍵,角色水平方向移動(dòng),并調(diào)整朝向

? ? ? ? {

? ? ? ? ? ? if (faceRight == true && isWall == false)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? playerObj.transform.localScale = new Vector3(-playerStarScale.x, playerStarScale.y, playerStarScale.z);

? ? ? ? ? ? ? ? faceRight = false;

? ? ? ? ? ? }

? ? ? ? ? ? playerRig.AddForce(new Vector2(-moveSpeed * Time.deltaTime, 0f));

? ? ? ? }

? ? ? ? else if (buttonRDown == true && buttonLDown == false )

? ? ? ? {

? ? ? ? ? ? if (faceRight == false && isWall == false)

? ? ? ? ? ? {//調(diào)整角色朝向

? ? ? ? ? ? ? ? playerObj.transform.localScale = new Vector3(playerStarScale.x, playerStarScale.y, playerStarScale.z);

? ? ? ? ? ? faceRight = true;

? ? ? ? ? ? }

? ? ? ? ? ? playerRig.AddForce(new Vector2(moveSpeed * Time.deltaTime, 0f));

? ? ? ? }

? ? ? ? if(buttonUDown == true&&jumpTime > 0 )

? ? ? ? {?//按空格的時(shí)間越長,跳的越高

? ? ? ? ? ? playerRig.velocity = new Vector2(playerRig.velocity.x, jumpSpeed);

? ? ? ? ? ? isGround = false;

? ? ? ? ? ? jumpTime -= 0.1f*Time.deltaTime;

? ? ? ? }

? ? ? ? if(isWall == true&&isGround ==false? )

? ? ? ? {

? ? ? ? ? ? //角色在墻上滑行

?? ? ? ? ? ?playerRig.velocity = new Vector2(playerRig.velocity.x, Physics2D.gravity.y * 0.005f);

? ? ? ? }

類型②的游戲在以上基礎(chǔ)上取消重力影響

類型③的游戲,增加慣性影響

類型④的游戲,直接改變playerposition實(shí)現(xiàn)移動(dòng)

? ? ? ? PlayerRigid.MovePosition(Vector2.MoveTowards(transform.position, PlayerPosition, MoveSpeed * Time.deltaTime));

? ? ? ? if ((transform.position - PlayerPosition).magnitude > 0.5f) return;

? ? ? ? RestTimer += Time.deltaTime;

? ? ? ? if (RestTimer < RestTime)

? ? ? ? {?

? ? ? ? ? ? return;? ? ? ? ? ?

? ? ? ? }

? ? ? ? float h = Input.GetAxisRaw("Horizontal");

? ? ? ? float v = Input.GetAxisRaw("Vertical");

? ? ? ? if (h != 0)

? ? ? ? {

? ? ? ? ? ? v = 0;

? ? ? ? }

? ? ? ? if (hitObjBox.transform == null)

? ? ? ? {

? ? ? ? ? ? PlayerPosition += new Vector3(h, v,0);

? ? ? ? }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容