移動是角色和游戲場景交互的基本功能,一般會先于其他功能實現(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);
? ? ? ? }