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

移動是角色和游戲場景交互的基本功能,一般會先于其他功能實現(xiàn)

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

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

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

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

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

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

if (buttonLDown == true && buttonRDown == false )//按下左鍵或右鍵,角色水平方向移動,并調(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 )

? ? ? ? {?//按空格的時間越長,跳的越高

? ? ? ? ? ? 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);

? ? ? ? }

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

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

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

? ? ? ? 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);

? ? ? ? }

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

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

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