移動(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);
? ? ? ? }