Slide 1

Slide 1 text

でゲームを作ろう! リーダブルノードのススメ 広島Unity勉強会 ナカオクタカヒロ 1

Slide 2

Slide 2 text

ナカオク タカヒロ Follow me! Github/FB @kamera25 X(旧Twitter) @csc_kamera25 仕事 : ネットワークSE@広島 好きなゲーム : ゼルダの伝説 2

Slide 3

Slide 3 text

3 https://unityroom.com/users/kamera25

Slide 4

Slide 4 text

4

Slide 5

Slide 5 text

5

Slide 6

Slide 6 text

6

Slide 7

Slide 7 text

7 引用 : https://gamefromscratch.com/game-engine-popularity-in-2024/

Slide 8

Slide 8 text

8 引用 : https://x.com/gamemakerstk/status/1826184926393491689

Slide 9

Slide 9 text

9 特徴は?

Slide 10

Slide 10 text

10 Godotの特徴 ・完全オープンソース のゲームエンジン  MITライセンスを採用 ・マルチプラットフォーム (エディタおよび出力が可能)  Windows/mac/Linux/Android/Web… ・独自&最適化された開発言語 - GDScript

Slide 11

Slide 11 text

11 https://www.youtube.com/watch?v=j9aZkNt6G48

Slide 12

Slide 12 text

でゲームを作ろう! リーダブルノードのススメ 広島Unity勉強会 ナカオクタカヒロ 12

Slide 13

Slide 13 text

でゲームを作ろう! リーダブルノードのススメ 広島Unity勉強会 ナカオクタカヒロ 13 リーダブルノードとは?

Slide 14

Slide 14 text

14 疎結合 & ふるまいが具体的な ノード(+スクリプト)のこと

Slide 15

Slide 15 text

15 疎結合 & ふるまいが具体的な ノード(+スクリプト)のこと 誰にとってメリットがある?

Slide 16

Slide 16 text

16 自分自身 チームメンバー AI あなた自身 半年後の自分は赤の他人 ゲームを一緒につくるメンバー ゲームジャムの即席チーム含む ChatGPT や GitHub Copilot Garbage In, Garbage Outを防ぐ

Slide 17

Slide 17 text

17 最もメリットを受ける人は?

Slide 18

Slide 18 text

18 最もメリットを受ける人は? ゲームを遊んでくれる人 早いイテレーション と 継続的な改善 の下地を作り いち早く面白いゲーム を届ける

Slide 19

Slide 19 text

19

Slide 20

Slide 20 text

20 Question!

Slide 21

Slide 21 text

21 https://github.com/kamera25/godot-rotating-slash

Slide 22

Slide 22 text

Q.以下の仕様を ノード でどのように構成する? プレイヤーにはHPがあり、数値は0〜3 敵はプレイヤーを攻撃し、ダメージを与える HPは画面左上に❤で表示 HPが0になると、ゲームオーバー ふむふむ。この構成なら …!

Slide 23

Slide 23 text

23 よくあるパターン 1. HPなら俺に任せろ! HPマネージャーノード を作る hit_player _by_enemy() 2. 敵に当たったら プレイヤーがHPマネージャーの関数を呼ぶ HPManagerNode ゲームオーバーの処理 HPの減らす処理 HPが0になった時の処理 HPを回復させる処理 ❤を表示させる処理 ❤画像ノード 色々な関数()

Slide 24

Slide 24 text

24 ある日のこと はいこれ、新しい仕様書 。 HP周りの処理色々追加になってるから。 これなら、簡単に実装 できますよ

Slide 25

Slide 25 text

HPGodManagerNode ゲームオーバーの処理 HPの減らす処理 HPが0になった時の処理 HPを回復させる処理 ❤を表示させる処理 HPが減った時に、攻撃力を上げる処理 +新機能 状態異常を受けた時 ❤の色を変える処理 HPが減った時に、音を鳴らす処理 急にオンラインゲームになったので HPを他プレイヤーと共有する処理 HPに応じてプレイヤーの動きを 変える処理 HPが減った時に、攻撃力を上げる処理 ゲーム難易度から HPのMAX値を変更する処理 これで、ヨシ!

Slide 26

Slide 26 text

26

Slide 27

Slide 27 text

27 何がマズイ? なんでもかんでも HPManagerNodeに処理を書いた HPManagerNodeが ネ申ノード となってしまった 誰にも触れないノードになってしまった カ ミ

Slide 28

Slide 28 text

2 28 1 シグナル を 活用&多用 する ノードが すべきこと を意識する ☝改善ポイント

Slide 29

Slide 29 text

2 29 1 シグナル を 活用&多用 する ノードが すべきこと を意識する ☝改善ポイント

Slide 30

Slide 30 text

30 シグナルとは ある イベント が発生した時に、登録先に通知されるもの イ ベ ン ト マウス や キーボード を クリックした 時 当たり判定に 衝突した 時 タイマーが 残り60秒となった 時 HPが 0になった 時

Slide 31

Slide 31 text

31 シグナルとは ある イベント が発生した時に、登録先に通知されるもの イ ベ ン ト マウス や キーボード を クリックした 時 当たり判定に 衝突した 時 タイマーが 残り60秒となった 時 HPが 0になった 時 ゲームは イベント の カタマリ である

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

33 通知 area_enterd シグナル ノード1 処理1 ノード2 処理1 ノード3 処理1 処理2 シグナルの流れ 発火!

Slide 34

Slide 34 text

34 通知 area_enterd シグナル ノード1 処理1 ノード2 処理1 ノード3 処理1 処理2 シグナルの流れ 発火! バッドパターンを直していきましょう。

Slide 35

Slide 35 text

35 バッドパターンを直そう hit_player _by_enemy() HPManagerNode ゲームオーバーの処理 HPの減らす処理 HPが0になった時の処理 HPを回復させる処理 ❤を表示させる処理 ❤画像ノード 色々な関数()

Slide 36

Slide 36 text

2 36 1 シグナル を 活用&多用 する ノードが すべきこと を意識する 改善ポイント ☝

Slide 37

Slide 37 text

37 バッドパターンを直そう 上位のノードには シグナル で伝えよう プレイヤーノードに親ノードの 存在を忘れさせよう 見直しポイント ☝

Slide 38

Slide 38 text

バッドパターンを直そう 敵に当たった時 シグナル を発火させる

Slide 39

Slide 39 text

HPManagerNode バッドパターンを直そう HPの減らす処理 Playerからのシグナルを 受信する処理 開始時点で HPManagerNode が プレイヤーの シグナル を受信準備をする

Slide 40

Slide 40 text

40 改善されたパターン HPManagerNode HPの減らす処理 Playerからのシグナルを 受信する処理 hitシグナル ①hitシグナルに通知登録 PlayerNode 開始直後 敵と当たった時

Slide 41

Slide 41 text

41 PlayerNode 改善されたパターン HPManagerNode HPの減らす処理 Playerからのシグナルを 受信する処理 hitシグナル ②発火! 開始直後 敵と当たった時 ④ 実行! ③通知

Slide 42

Slide 42 text

42 知らないこと は 良いこと PlayerNode HPManagerNode hitシグナル 知ってる HPManagerNode 知ってる 知ってる 敵に当たったら hit_player_by_enemy() を呼び出す処理 前 後 ☝ 知らない PlayerNode

Slide 43

Slide 43 text

43 知らないこと は 良いこと PlayerNode HPManagerNode hitシグナル 知ってる HPManagerNode 知ってる 知ってる 敵に当たったら hit_player_by_enemy() を呼び出す処理 前 後 ☝ 知らない PlayerNode 必要以上 に 関係 を持たないこと!

Slide 44

Slide 44 text

44 疎結合 & ふるまいが具体的な ノード(+スクリプト)のこと

Slide 45

Slide 45 text

もう一つの問題と戦おう。

Slide 46

Slide 46 text

46 HPManagerNode ゲームオーバーの処理 HPの減らす処理 HPが0になった時の処理 HPを回復させる処理 ❤を表示させる処理 ネ申ノード を討伐しなければならない カ ミ

Slide 47

Slide 47 text

47 HPManagerNode ゲームオーバーの処理 HPの減らす処理 HPが0になった時の処理 HPを回復させる処理 ❤を表示させる処理 ネ申ノード を討伐しなければならない G○d Eater 開始です

Slide 48

Slide 48 text

2 48 1 シグナル を 活用&多用 する ノードが すべきこと を意識する ☝改善ポイント ☝

Slide 49

Slide 49 text

49 HPManagerNode って具体的に何をやるの? HPの新規処理を追加したいけど、どこを修正すれば良いの? 変更したら、○○の機能が動かなくなっちゃった。 問題点

Slide 50

Slide 50 text

50 HPManagerNode ゲームオーバーの処理 HPの減らす処理 HPが0になった時の処理 HPを回復させる処理 ❤を表示させる処理 HP HP変数を使いたいため、色々な機能が集まる

Slide 51

Slide 51 text

51 HP変数を使いたいため、色々な機能が集まる 解 決 方 針 HPManagerNodeを ふるまいごと に分解する ふるまいには 具体的な名前 をつける HPノードとは シグナル でやりとり

Slide 52

Slide 52 text

52 HP変数を使いたいため、色々な機能が集まる 解 決 方 針 HPManagerNodeを ふるまいごと に分解する ふるまいには 具体的な名前 をつける HPノードとは シグナル でやりとり ふるまい = Behavior

Slide 53

Slide 53 text

53 HPManagerNode ゲームオーバーの処理 HPの減らす処理 HPが0になった時の処理 HPを回復させる処理 ❤を表示させる処理 HP変数 ふるまい ごとに分解しよう

Slide 54

Slide 54 text

54 HPManagerNode2 ゲームオーバーの処理 HPの減らす処理 HPが0になった時の処理 HPを回復させる処理 ❤を表示させる処理 HP HPを増減させる関数 HPManagerNode1 HPManagerNode3 HPManagerNode4 HPManagerNode5 ❤画像ノード ふるまい ごとに分解してみた

Slide 55

Slide 55 text

55 HP変数を使いたいため、色々な機能が集まる 解 決 方 針 HPManagerNodeを ふるまいごと に分解する ふるまいには 具体的な名前 をつける HPノードとは シグナル でやりとり

Slide 56

Slide 56 text

56 HPNode ゲームオーバーの処理 HPの減らす処理 HPが0になった時の処理 HPを回復させる処理 ❤を表示させる処理 HP HPを増減させる関数 GameOverHandler DamageReciver HealthRestorer HPIconPresenter ❤画像ノード ふるまいに 適切な名前 をつけよう

Slide 57

Slide 57 text

57

Slide 58

Slide 58 text

58 HP変数を使いたいため、色々な機能が集まる 解 決 方 針 HPManagerNodeを ふるまいごと に分解する ふるまいには 具体的な名前 をつける HPノードとは シグナル でやりとり

Slide 59

Slide 59 text

59 HPNode ゲームオーバーの処理 HPの減らす処理 HPが0になった時の処理 HPを回復させる処理 ❤を表示させる処理 HP HPを増減させる関数 GameOverHandler DamageReceiver HealthRestorer HPIconPresenter ❤画像ノード 分解したのはいいけど HP変数へのアクセス どうするの? ☝

Slide 60

Slide 60 text

60 HPNode ゲームオーバーの処理 HPの減らす処理 HPが0になった時の処理 HPを回復させる処理 ❤を表示させる処理 HP HPを増減させる関数 GameOverHandler DamageReceiver HealthRestorer HPIconPresenter ❤画像ノード 分解したのはいいけど HP変数へのアクセス どうするの? ☝ 本当に HP変数 へのアクセスが必要なのか?

Slide 61

Slide 61 text

HP値自体を持つノード HP値自体を操作する必要がある HP値が変更された事が分かれば良い 61 ゲームオーバーの処理 HPの減らす処理 HPが0になった時の処理 HPを回復させる処理 ❤を表示させる処理 GameOverHandler DamageReceiver HealthRestorer HeartUIPresenter HPNode HP HPを増減させる関数 シグナル を使おう 継承して 関数呼び出し を使おう ※時間が無いため、ここでは説明割愛

Slide 62

Slide 62 text

HP値自体を持つノード 62 HPNode HP HPを増減させる関数  HP変更  シグナル シグナル は 引数(値) も送る事ができる ☝

Slide 63

Slide 63 text

HP値自体を持つノード HP値が変更された事が分かれば良い 63 ゲームオーバーの処理 HPが0になった時の処理 ❤を表示させる処理 GameOverHandler HPIconPresenter HPNode HP HPを増減させる関数  HP変更  シグナル 登録 登録 開始直後 HPが変更された時

Slide 64

Slide 64 text

HP値自体を持つノード HP値が変更された事が分かれば良い 64 ゲームオーバーの処理 HPが0になった時の処理 ❤を表示させる処理 GameOverHandler HPIconPresenter HPNode HP HPを増減させる関数  HP変更  シグナル 通知 通知 ☝ HP 変更! 開始直後 HPが変更された時

Slide 65

Slide 65 text

65 前 後 HPManagerNode ゲームオーバーの処理 HPが0になった時の処理 HP変数 ゲームオーバーの処理 HPが0になった時の処理 GameOverHandler HPNode HP HPを増減させる関数  HP変更  シグナル 知ってる 知らない

Slide 66

Slide 66 text

66 疎結合 & ふるまいが具体的 な ノード(+スクリプト)のこと

Slide 67

Slide 67 text

67 まとめ

Slide 68

Slide 68 text

2 68 1 シグナル を 活用&多用 する ノードが すべきこと を意識する ☝改善ポイント

Slide 69

Slide 69 text

69 シグナルとは ある イベント が発生した時に、登録先に通知されるもの イ ベ ン ト マウス や キーボード を クリックした 時 当たり判定に 衝突した 時 タイマーが 残り60秒となった 時 HPが 0になった 時

Slide 70

Slide 70 text

70 疎結合 & ふるまいが具体的な ノード(+スクリプト)のこと

Slide 71

Slide 71 text

71 https://github.com/kamera25/godot-rotating-slash

Slide 72

Slide 72 text

72 ゲームジャム高梁で Made With Godotのゲームを作りませんか!? カ ミ

Slide 73

Slide 73 text

73 参考資料 ● 良いコード悪いコードで学ぶ設計入門 - 仙塲 大也 ● CODING THE ENTITY-COMPONENT PATTERN IN GODOT - GDQuest https://www.gdquest.com/tutorial/godot/design-patterns/entity-component-pattern/ ● Godotの設計哲学 - Godot Doc https://docs.godotengine.org/ja/4.x/getting_started/introduction/godot_design_philosophy.html ● ぴぽや倉庫 https://pipoya.net/