侍エンジニアでの学習内容
知識/アドバイス
コーディング
- メソッドの引数による受け渡しを利用してクラス間の密結合を避け、疎結合化し、クラス内のメモリ(変数)を節約すると良い
- 2つ以上のクラスで同じような処理があった場合は親クラスに同じような処理を記述し、子クラスで振る舞いを変えさせると良い
- 「TryGetComponent()」を使用して、タグではなく接触相手にアタッチされているクラスで接触相手を判断すると、タグを追加する必要が無くなる
- なるべく1つのゲームオブジェクトに1つのスクリプトをアタッチすると、処理の多様性がアップする
- 3つ以上の外部クラスで使用されているクラスはシングルトンにすると良い
- 「PlayerController クラスならプレイヤーの動きのみを制御し、GameManager クラスならゲームの進行に関する処理のみを書く」というようにクラス毎に役割分担を明確にすると良い
- GameManager クラスのようなゲームの脳にあたるクラス以外のクラスでは変数を外部からアサインするのはやめ、メソッドの引数などを利用してクラス内の変数自体を減らすように意識すると良い(クラスは出来る限り外部からの参照を少なくする事で様々なエラーを防止できる)
- 各クラス間を効率よく疎結合化するためにクラス図を作成すると良い
- コルーチンが正常に動作しなくなる可能性があるため、「Destroy()」等で消える可能性のあるクラスでコルーチンを行ったり、直接的に呼び出すのは避けた方が良い
- 「Instantiate()」を使って、ゲームオブジェクトのクローンを生成する時はなるべく GameObject 型ではなくて、そのゲームオブジェクトにアタッチされているクラスを第一引数に渡すと、処理を簡略化できる
- enum 型のような構造体は null の状態を強制的に設定しない限り、null にはならないため、基本的に構造体への nullチェックは不要である
- 何か番号を故意に振る場合は配列やリストとの相性を考えて「0」からスタートすると良い
- そのメソッド内でしか使用されていないメンバ変数やメンバ関数はローカル変数やローカル関数にすると、メモリの節約になる
- 1つの効果音につき1つの AudioSource を作成しておくと、音が途切れなくなる
- UIはヒエラルキー上における Canvas の子オブジェクトの上から順に表示の優先順位が上がる(末っ子が一番前に表示され、長男/長女が一番後ろに表示される)
- C# や Python は比較的、高性能であるため、var(型推論)は使わなくても良いが、var(型推論)以外の型で記述した際にエラーが発生するか、型の名前が長い場合のみ var(型推論)を使うと良い
- 「Tween.OnComplete()」は3つ以上重ねると読みにくくなってしまうため、「Sequence」を使うと良い(「Tween.OnComplete()」は目安として2つまでなら重ねて良い)
- switch や if-else if 等による分岐ではなく、クラスの継承やインターフェイス等を用いて振る舞いを変えさせると良い
- 「Start()」や「SetUp~()」等で「Reset()」を呼び出し、「Reset()」内でコンポーネントの取得処理等を記述するようにすると、デバック効率がアップする
- GameData クラスでは可変性のある数値(現在値など)を管理し、ConstData クラスでは不変性のある数値(最大所持数など)を管理すると良い
- 固定値についてはリテラル表記やハードコーディングは避け、ConstData クラス等を使用すると良い
- ゲームの状態(enum 型)を GameManager クラス等で管理する際は UniRx の「Reactive Property」を使うと良い
その他
- 「EventSystem」が無いと、UIがタップなどの感知に反応しないため、もしヒエラルキーの見える所に「EventSystem」無い場合は、既にあるのに新しく追加されてしまう可能性があるため、「EventSystem」は単体でヒエラルキーの見える場所に置いておくと良い
- 非同期処理はメインの処理の負担を軽減できる
用語と概要
UniRx/UniTask
UniRx | イベント処理を行う際に Observable の概念を使ってイベントを扱う事が出来るライブラリ (値の監視など) |
UniTask | コルーチンの不満点を解消したコルーチンの上位互換 (コルーチンの処理を「async / await」で代用できるようになるが、 キャンセルの処理を記述する必要がある) |
セーブ・ロード
PlayerPrefs クラス | ・ゲーム内ではなく、端末ごとにその端末内に保存場所を作る |
JsonUtility クラス | ・どんな型でも string 型に変換するためのフィルター ・クラス毎に使用するのが主流 ・「{}」で1つのクラス |
メソッド
メソッド名 | 呼び出されるタイミング |
Reset() | ・ゲームオブジェクトにそのスクリプトをアタッチした時 ・インスペクターからリセットした時 ・スクリプト中で呼び出した時 |
注意点
ConstData クラス
- ConstData クラス(固定値の管理クラス)では const キーワードを付け、変数は全て大文字で単語が変わる時にはアンダーバーを使用する(例「GAME_OVER_TIME」)