
第二階段,我們把「互動」建立起來:
玩家能輸入、遊戲能回應、角色能動起來。
但只要你開始做角色控制,你一定會遇到一個經典問題:
角色到底在幹嘛?為什麼會亂跑、亂跳、亂攻擊?
你按攻擊,他卻還在跑步動畫;
你按跳躍,他卻在攻擊後作用力中;
你按互動,他卻在空中做奇怪的事情。
這不是程式壞掉。
這是你缺少遊戲開發裡最重要的系統之一:
狀態機(State Machine)。
一、為什麼需要狀態機?
因為角色不是「一堆行為」,
角色是「一個時間點只能做一件事」。
你不能:
- 一邊跑步一邊死亡
- 一邊跳躍一邊撿東西
- 一邊受傷一邊攻擊
- 一邊翻滾一邊衝刺
這些行為會互相打架。
如果你沒有狀態機,角色就會:
- 動畫亂跳
- 行為互相覆蓋
- 反應延遲
- 手感崩壞
- Bug 多到你懷疑人生
狀態機的目的只有一個:
讓角色在任何時刻,都只處於一個明確的狀態。
二、什麼是狀態?
狀態不是動畫。
狀態不是按鍵。
狀態不是行為。
狀態是:
角色目前的「身分」。
例如:
- Idle(待機)
- Run(跑步)
- Jump(跳躍)
- Fall(落下)
- Attack(攻擊)
- Hurt(受傷)
- Dead(死亡)
每個狀態都有:
- 能做什麼
- 不能做什麼
- 什麼時候結束
- 結束後要轉去哪裡
這就是狀態機的核心。
三、狀態機的基本結構:三件事
一個狀態機只需要三個東西:
1. 當前狀態(current_state)
角色現在是什麼狀態?
2. 狀態更新(state.update)
這個狀態每一幀要做什麼?
3. 狀態轉換(state.transition)
什麼條件下要換到下一個狀態?
就這樣。
你不需要複雜的架構,不需要設計模式,不需要抽象類別。
只要這三件事,你就能做出 90% 的遊戲角色。
四、狀態機的第一原則:輸入不直接控制行為,而是控制「狀態」
例如:
玩家按下攻擊 → 不是「播放攻擊動畫」
而是:
current_state = ATTACK
然後攻擊狀態自己決定:
- 播放什麼動畫
- 什麼時候能取消
- 什麼時候能轉回 Idle
- 什麼時候能被打斷
這樣你就能避免:
- 攻擊中還能跑步
- 跳躍中還能攻擊
- 受傷中還能衝刺
因為狀態會阻擋不合理的行為。
五、狀態機的第二原則:狀態之間要有「邏輯」
狀態不是隨便切的。
例如:
可以從 Idle → Run
因為玩家按下移動。
可以從 Run → Jump
因為玩家按下跳躍。
可以從 Jump → Fall
因為速度變成負的。
可以從 Attack → Idle
因為動畫播完。
但:
不可以從 Dead → Run
不可以從 Hurt → Jump
不可以從 Attack → Attack(無限連打)
這些都是狀態機要處理的邏輯。
六、狀態機的第三原則:狀態要能「拒絕」輸入
例如:
- 攻擊中 → 不能跳
- 受傷中 → 不能攻擊
- 死亡 → 不能做任何事
這不是 Bug,這是設計。
限制,是遊戲設計的語言。
如果你不限制,玩家會覺得角色「不聽話」。
七、狀態機的第四原則:狀態要能「自動轉換」
例如:
- 跳躍 → 落下(速度變負)
- 落下 → 落地(碰到地面)
- 攻擊 → Idle(動畫播完)
- 受傷 → Idle(硬直結束)
這些都不是玩家輸入,而是「狀態自己決定」。
狀態機的強大就在這裡:
角色的行為不再依賴輸入,而是依賴邏輯。
八、狀態機的第五原則:狀態要能「覆蓋」其他狀態
例如:
- 受傷 → 覆蓋所有狀態
- 死亡 → 覆蓋所有狀態
- 翻滾 → 覆蓋移動與攻擊
- 攻擊 → 覆蓋移動
這些「優先權」就是狀態機的靈魂。
沒有優先權,你的角色就會:
- 跑步動畫卡在攻擊裡
- 跳躍被移動覆蓋
- 受傷被攻擊覆蓋
然後你就會開始懷疑人生。
九、本篇的結論:狀態機是角色的大腦
角色不是動畫堆疊。
角色不是輸入反應。
角色不是 if-else 的混亂地獄。
角色是一個:
- 有邏輯
- 有優先權
- 有限制
- 有轉換
- 有行為規則
的系統。
這個系統,就是狀態機。
只要你掌握:
1. 輸入控制狀態,不控制行為
2. 狀態之間有邏輯
3. 狀態能拒絕輸入
4. 狀態能自動轉換
5. 狀態有優先權
你的角色就會從「亂跑亂跳」變成「聽話又有手感」。

















