@@ -58,11 +58,14 @@ sequenceDiagram
5858
5959* SceneManager: ゲームの各画面を` Scene ` と表現しており、それらの画面遷移を制御する仕組み
6060
61- ### Titleシーンの懸案事項
61+ ### ` SceneManager ` の懸案事項
6262
63- ` Scene ` の` Update ` メソッドで` GameState ` という状態を示す情報を渡しているが、現状この内部は` SceneManager ` のポインタが入っているのみ。
63+ ` Scene ` の` Update ` メソッドで` GameState ` という状態を示す情報を渡しているが、
64+ 現状この内部は` SceneManager ` のポインタが入っているのみ。
6465
65- 画面遷移するため` Scene ` から` SceneManager ` の` GoTo ` メソッドを呼び出したかったのだと思うが、これでは各` Scene ` が「自分の次はXX画面に遷移する」という情報を知っている必要があり、設計的に微妙。これでは、` SceneManager ` に仕事してもらえていない状態。
66+ 画面遷移するため` Scene ` から` SceneManager ` の` GoTo ` メソッドを呼び出したかったのだと思うが、これでは各` Scene ` が「自分の次はXX画面に遷移する」という情報を知っている必要があり、設計的に微妙。画面遷移の順序を自由にするため、` Scene ` 同士はできるだけ疎結合にしたい。
67+
68+ ` Scene ` から` Scene ` への遷移については、` SceneManager ` に任せたい。
6669
6770例えば、` Scene ` 作成時にチャンネルを渡しておいて、そのチャンネルに対して通知すれば` SceneManager ` が次の画面への遷移を実行してくれる・・という機構にすれば、各所が名前の通りの働きになるのではないだろうか。その方が画面遷移の制御コードが` SceneManager ` に集約できるのと、ジワッと画面遷移するような処理も一箇所で実装するだけで済みそう。
6871
@@ -225,8 +228,12 @@ classDiagram
225228 - tension
226229 }
227230
231+ class VelocityController {
232+ <<interface>>
233+ }
234+
228235 Scene <|-- Stage01Scene
229- Field <|-- PrairieLane
236+ Field <|-- PrairieField
230237
231238 Stage01Scene --> charaPlayer
232239 Stage01Scene --> Field
@@ -240,6 +247,11 @@ classDiagram
240247
241248 charaPlayer --> StateMachine
242249 charaPlayer --> StepAnimation
250+ charaPlayer --> VelocityController
251+
252+ VelocityController <|-- KuronaVc
253+ VelocityController <|-- KomaVc
254+ VelocityController <|-- ShishimaruVc
243255```
244256
245257### GameStateのステートマシン図
@@ -269,5 +281,95 @@ stateDiagram-v2
269281
270282### プレイヤーStateのステートマシン図
271283
272- WIP
284+ ` chara.Player ` が内部で` StateMachine ` 実装に移譲して管理しているプレイヤーキャラのStateについて記述する。
285+
286+ まずは現状を書き出してみる。
287+
288+ ``` mermaid
289+ stateDiagram-v2
290+ [*] --> Dash
291+
292+ Dash --> Walk: 1
293+ Walk --> Dash: 2
294+
295+ Dash --> Ascending: 3
296+ Dash --> SkillEffect: 4
297+
298+ SkillAscending --> Dash: 5
299+ Ascending --> Dash: 5
300+ Descending --> Dash: 6
301+ SkillDescending --> Dash: 6
302+
303+ Walk --> SkillDash: 2
304+ SkillDash --> SkillWalk: 1
305+ SkillDash --> Dash: 7
306+
307+ SkillWalk --> SkillDash: 2
308+ SkillWalk --> Dash: 7
273309
310+ SkillWalk --> SkillAscending: 3
311+ SkillDash --> SkillAscending: 3
312+ Walk --> Ascending: 3
313+
314+ SkillWalk --> SkillDescending: 8
315+ SkillDash --> SkillDescending: 8
316+ Walk --> Descending: 8
317+ ```
318+
319+ #### パターン一覧
320+
321+ 1 . スタミナ0または障害物に衝突中
322+ 2 . スタミナ回復または障害物との衝突解消
323+ 3 . ユーザーが上昇ボタン押下
324+ 4 . テンションMaxでユーザーがスキルボタン押下
325+ 5 . 上のレーンに到着
326+ 6 . 下のレーンに到着
327+ 7 . テンション0
328+ 8 . ユーザーが下降ボタンを押下
329+
330+ スキル発動後はエフェクトやボイスの再生などがあるため、状態遷移とそのための操作がやや複雑になっている。現状は、` Scene ` の実装が、` Player ` の` UpdateSkillEffect ` と` FinishSpEffect ` をUpdateのたびに呼び出し、返り値がtrueになったらrun状態に戻す、という実装。(書き出してみて分かったが、上昇・下降前後での状態遷移に不具合がある。)
331+
332+ すでにサウンドの再生にはチャンネルの仕組みを使っており、こちらも同様にチャンネルによる連携にしたい。
333+ スキルエフェクトを担う仕組みからチャンネルを渡しておけば実現できそう。
334+
335+ * ` StateMachine ` 内部では` SkillEffect ` に遷移する
336+ * 次回以降の状態遷移では、スキル完了フラグをチェック
337+ * チャンネルから完了通知があれば、スキル完了フラグをtrueにする
338+ * スキル完了フラグがtrueになったのを受けて、状態を` SkillDash ` に変更
339+
340+ 複雑になっている要因として、内部で「前の状態」を保持・更新して次回の状態遷移に用いている点が挙げられる。
341+ もっとシンプルに、上昇や下降が終了したらまずは` Dash ` または` SkillDash ` に遷移するようにした方がよいのではないだろうか。
342+
343+ これから作る理想の形としては以下。
344+
345+ ``` mermaid
346+ stateDiagram-v2
347+ [*] --> Dash
348+
349+ Dash --> Walk: 1
350+ Walk --> Dash: 2
351+
352+ Dash --> Ascending: 3
353+ Walk --> Ascending: 3
354+ Ascending --> Dash: 5
355+ Dash --> Descending: 8
356+ Walk --> Descending: 8
357+ Descending --> Dash: 6
358+
359+ Dash --> SkillEffect: 4
360+ Walk --> SkillEffect: 4
361+
362+ SkillEffect --> SkillDash: スキルエフェクト完了
363+ SkillDash --> SkillWalk: 1
364+ SkillWalk --> SkillDash: スタミナ回復、障害物除去
365+
366+ SkillDash --> SkillAscending: 3
367+ SkillWalk --> SkillAscending: 3
368+ SkillAscending --> SkillDash: 5
369+ SkillDash --> SkillDescending: 8
370+ SkillWalk --> SkillDescending: 8
371+ SkillDescending --> SkillDash: 6
372+
373+ SkillDash --> Dash: テンション0
374+ SkillWalk --> Walk: テンション0
375+ ```
0 commit comments