移動(dòng)是角色和游戲場(chǎng)景交互的基本功能呐籽,一般會(huì)先于其他功能實(shí)現(xiàn)
在實(shí)現(xiàn)移動(dòng)前疾牲,根據(jù)具體的游戲類型乍丈,要先大致確定要實(shí)現(xiàn)怎么樣的移動(dòng)操作體驗(yàn):
①橫版過(guò)關(guān),角色在地上跑的喉前,類似于超級(jí)馬里奧這種没酣,移動(dòng)的時(shí)候會(huì)有一定慣性王财,可以利用地面材質(zhì)的摩擦系數(shù)來(lái)實(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游戲,馬基埃亞爾的傳說(shuō)的這種roguelike類的哎垦,每次移動(dòng)會(huì)移動(dòng)固定距離囱嫩,偏向于走格子,可以直接用moveposition來(lái)實(shí)現(xiàn)
類型①的游戲漏设,移動(dòng)一般通過(guò)添加rigidbody2D,并給此組件施加力或直接修改velocity來(lái)實(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í)間越長(zhǎng)鸳碧,跳的越高
? ? ? ? ? ? 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);
? ? ? ? }