今天在開發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); //與跳躍做一樣的視覺效果。也可以省略或替換
}
沒有留言:
張貼留言