2017年10月22日 星期日

隨手札記:PF2D Controller的牆壁跳設定(Unity C#)

今天在開發WallJump功能,我規劃的大概結構是這樣的:

bool leftLeanOnWall, rightLeanOnWall
bool JudgeIfIsLeanOnWall (bool isRight){
 //物理射線偵測左邊/右邊是否有牆壁
}
OnColliderEnter
leftLeanOnWall = JudgeIfIsLeanOnWall(false)
rightLeanOnWall = JudgeIfIsLeanOnWall(true) 
OnColliderExit
更新兩個LeanOnWall
牆壁跳的時候
兩個LeanOnWall = false;

因為JudgeIfIsLeanOnWall這個函式會創造物理射線、檢視是否有接觸牆壁,所以基於效能考量,我希望他在有需要的時候再呼叫比較好。




....結果後來想想,改成按下跳躍的時候再判斷不就好了嗎?就跟原本的跳躍寫法一樣:

bool leftLeanOnWall
bool rightLeanOnWall
bool JudgeIfIsLeanOnWall (bool isRight){
物理射線偵測左邊/右邊是否有牆壁
}
按下跳躍鍵時
如果(在地上)
跳躍
再不然,如果(左邊有牆壁)
牆壁跳躍(從左)
再不然,如果(右邊有牆壁)
牆壁跳躍(從右)
牆壁跳躍
牆壁跳躍的動作、動畫、效果...等
兩個LeanOnWall = false;

甚至到頭來好像也不必宣告兩個LeanOnWall參數,直接呼叫JudgeIfIsLeanOnWall就可以了。

成果如下:

bool JudgeIfIsLeanOnWall(bool isRight){
//use Physics2D.Linecast to detect wall....
if(thereIsSomething)
{
return true;
}
else
{
return false;
}
}
void Update(){
//......
if (allowJump)
{
if (Input.GetKeyDown(jumpButton))
{
if (IsOnGround)
{
DoJump();
}
else if (JudgeIfIsLeanOnWall(false))
{
//false = left
DoWallJump(false);
}
else if (JudgeIfIsLeanOnWall(true))
{
//true = right
DoWallJump(true);
}
}
}
}
void DoWallJump(bool isFromRightWall){
if (isFromRightWall)
{
//做從右往左的跳躍,可以指派RigidBody2D.velocity
}
else
{
//做從左往右的跳躍,可以指派RigidBody2D.velocity
}
JumpEffect(true); //與跳躍做一樣的視覺效果。也可以省略或替換
}


沒有留言:

張貼留言