【Unity】子オブジェクトを使ったインベントリ
柔軟性の高い武器管理システムをUnityの子オブジェクトの構成を使って実現します
実行サンプル
まず、武器管理の様子を見てみましょう
プレイヤーを上下左右矢印で移動できます
武器に触れると持ち物として取得できます
サンプルとして武器は3つを用意しています(幾つでも対応は可能です)
数値の1キーで武器を有効にし、2キーで無効にしています
実行動画
3つのソードを取得したときの様子
プレイヤーのこオブジェクトとして管理されているのがわかります
プレイヤーと共に扱われ、いかにも持ち物!という雰囲気を出しています
このような仕組みを集約と言います

構成サンプル
集約とコンポジションを使った構成とすることで、一見複雑には見えますがアイテムの追加と機能ごとの管理ができ、わかりやすい構成となります
シーン構成
プレイヤー

武器1(ソード1)

武器2(ソード2)

武器3(ソード3)

スクリプト
このコードは、Unityゲームでの武器のインベントリシステムを実装しています。特徴は以下の通りです:
- 子オブジェクト管理:
ObjectManipulator
クラスは、武器を親オブジェクトの子供として移動させるメソッドを提供しています。これにより、武器の追加や削除が容易になります。 - インターフェース:
IStatus
とIWeaponStatus
のインターフェースがあります。これにより、異なるタイプの武器を統一的に扱うことができます。 - 武器の表示と非表示の制御:
WeaponController
クラスでは、武器の表示と非表示を制御するメソッドが提供されています。これにより、プレイヤーが武器をアクティブにしたり非表示にしたりできます。 - 武器の状態の表示:
WeaponController
クラスでは、GUIを使用して武器の状態を表示します。これにより、プレイヤーが現在装備している武器の情報を確認できます。
IStatusインターフェース
あらゆるステータス状態の実装の元になります
武器以外にもライフのアイテムであったり様々なクラスを実装できます
Name
プロパティ: インターフェースには、オブジェクトの名前を表すName
プロパティが含まれています。このプロパティは、オブジェクトの名前を取得または設定するために使用されます。Show()
メソッド:Show()
メソッドは、オブジェクトを表示するためのメソッドです。このメソッドが呼び出されると、対象のオブジェクトが表示されるようになります。Hide()
メソッド:Hide()
メソッドは、オブジェクトを非表示にするためのメソッドです。このメソッドが呼び出されると、対象のオブジェクトが非表示になります。IsActive()
メソッド:IsActive()
メソッドは、オブジェクトがアクティブであるかどうかを判定するためのメソッドです。このメソッドが呼び出されると、対象のオブジェクトがアクティブであればtrue
を返し、非アクティブであればfalse
を返します。
このインターフェースは、オブジェクトが持つ基本的な機能を定義しており、これを実装するクラスは、そのオブジェクトを表示・非表示にすることや、その状態を確認することができます。
IWeaponStatusインターフェース
武器関連のインターフェース定義コードになります
ステータスの基本に武器に特化したメンバーの追加を要求します
IWeaponStatus
インターフェースは IStatus
インターフェースを継承しており、そのため IStatus
インターフェースで定義されたプロパティやメソッドを含みます。
Power
プロパティ:Power
プロパティは、武器の攻撃力を表します。このプロパティは、武器の攻撃力を取得または設定するために使用されます。Defence
プロパティ:Defence
プロパティは、武器の防御力を表します。このプロパティは、武器の防御力を取得または設定するために使用されます。
IWeaponStatus
インターフェースは、武器の特性やステータスを表すために使用されます。このインターフェースを実装するクラスは、武器の攻撃力や防御力を取得・設定できると同時に、 IStatus
インターフェースで定義されたオブジェクトの名前を取得・設定し、オブジェクトを表示・非表示にするメソッドを持つことができます。
SwordStatus スクリプト
武器の中でも、ソード(剣)について特化したクラスになります
このシンプルなサンプルでは、特にソード特有のコードは追加していませんが、追記可能です
Name
,Power
,Defence
プロパティ: クラスには、武器の名前、攻撃力、防御力を表す3つのプロパティがあります。これらのプロパティはSerializeField
属性を使用してシリアライズされ、Unityのインスペクターで編集可能になります。これにより、Unityのエディターで簡単に武器の属性を設定できます。Show()
メソッド:Show()
メソッドは、武器を表示するためのメソッドです。これが呼び出されると、gameObject.SetActive(true)
を使用して、この武器のゲームオブジェクトをアクティブにします。Hide()
メソッド:Hide()
メソッドは、武器を非表示にするためのメソッドです。これが呼び出されると、gameObject.SetActive(false)
を使用して、この武器のゲームオブジェクトを非アクティブにします。IsActitve()
メソッド:IsActive()
メソッドは、武器がアクティブであるかどうかを判定するためのメソッドです。gameObject.activeSelf
を使用して、この武器のゲームオブジェクトがアクティブかどうかを返します。
このクラスは、Unityゲーム内で武器の状態を管理し、表示・非表示を切り替える機能を提供します
ObjectManipulator スクリプト
武器に触れて取得した際、プレイヤーの子オブジェクトとして帯刀する機能を持ちます
MoveObjectToChild(GameObject parentObject, GameObject childObject)
メソッド: このメソッドは、親オブジェクトと子オブジェクトを受け取り、子オブジェクトを親オブジェクトの子供として移動させる役割を持ちます。parentObject
: 移動先の親オブジェクトを示します。childObject
: 移動させる子オブジェクトを示します。
childObject
の親をparentObject
に設定し、次に子オブジェクトの位置を親オブジェクトのローカル座標系での原点に移動します。これにより、子オブジェクトが親オブジェクトに対して正確に配置されます。
このクラスは、ゲームオブジェクトを操作するためのユーティリティ機能を提供するものであり、特に親子関係を操作する際に便利です。
PlayerCommander スクリプト
武器をコントロールするためのコードです
今回は、シンプルに有効・無効について制御するサンプルとしています
weaponController
フィールド:WeaponController
クラスのインスタンスを格納するためのシリアライズされたフィールドです。このフィールドは、インスペクターでPlayerCommander
オブジェクトにWeaponController
を割り当てることができます。Update()
メソッド: Unityのフレームごとに呼び出されるメソッドです。プレイヤーの入力を監視し、対応する操作を実行します。- キー入力の検出:
Input.GetKeyDown(KeyCode.Alpha1)
とInput.GetKeyDown(KeyCode.Alpha2)
によって、キーボードの1
キーと2
キーの押下を検出します。 weaponController.Show("ソード1")
:weaponController
に対して、Show()
メソッドを呼び出しています。これにより、WeaponController
クラス内の指定された名前の武器("ソード1")が表示されます。weaponController.Hide("ソード1")
:weaponController
に対して、Hide()
メソッドを呼び出しています。これにより、WeaponController
クラス内の指定された名前の武器("ソード1")が非表示にされます。
このクラスは、プレイヤーの入力に応じて武器を表示または非表示にする役割を果たします。
PlayerMovement スクリプト
プレイヤーの移動に特化したコードです
このように機能を切り分けることにより、あらゆる機能が入り混じったコードになることを防ぎ、保守性を高めることができます
moveSpeed
パブリック変数: プレイヤーの移動速度を表します。UnityのInspectorパネルで調整できます。Update()
メソッド: Unityがフレームごとに呼び出す関数で、プレイヤーの移動を制御します。このメソッド内では、プレイヤーの入力を検出し、移動ベクトルを計算しています。Vector2 movement
: プレイヤーの移動ベクトルを格納する変数です。Input.GetAxisRaw()
を使用して水平方向と垂直方向の入力を取得し、それらを正規化して移動ベクトルを作成しています。Move(Vector2 direction)
メソッド: プライベートなメソッドで、プレイヤーの移動を処理します。引数direction
には、プレイヤーの移動方向が渡されます。transform.Translate()
を使用して、プレイヤーを指定された方向に移動させます。Time.deltaTime
を乗算することで、フレームレートに依存しない移動を実現しています。
このスクリプトをアタッチしたゲームオブジェクトは、プレイヤーの移動を制御することができます
WeaponController スクリプト
武器を実際にコントロールするためにメソッド群を記述します
今回は、サンプルのため、有効・無効の機能のみを実装しています
また、デバッグのためにOnGUIライフメソッドを使い、画面上に情報表示をしています
objectManipulator
フィールド:ObjectManipulator
クラスのインスタンスを参照するフィールドです。このクラスは、ゲームオブジェクトを操作するための便利なメソッドを提供します。weaponsStatus
フィールド:IWeaponStatus
インターフェースの配列です。この配列には、ウェポンのステータスを持つオブジェクトが格納されます。OnTriggerEnter2D(Collider2D other)
メソッド: 2Dトリガーコライダーが他のコライダーと接触したときに呼び出されるメソッドです。接触したコライダーを処理するためにHandleCollision()
メソッドを呼び出します。HandleCollision(Collider2D collider)
メソッド: 衝突したコライダーを処理するメソッドです。コライダーを子オブジェクトに移動させ、衝突したウェポンを非表示にします。Show(string weaponName)
メソッド: 指定された名前のウェポンを表示するメソッドです。Hide(string weaponName)
メソッド: 指定された名前のウェポンを非表示にするメソッドです。FindWeaponStatus(string name)
メソッド: 指定された名前のウェポンステータスを検索するメソッドです。OnGUI()
メソッド: GUIイベントが発生したときに呼び出されるメソッドです。このメソッドは、ウェポンのステータスを表示するためにDisplayWeaponStatus()
メソッドを呼び出します。DisplayWeaponStatus(IWeaponStatus status)
メソッド: ウェポンのステータスを表示するメソッドです。ウェポンの名前、攻撃力、防御力、アクティブ状態が表示されます。
このクラスは、トリガーコライダーとの衝突を処理し、それに応じてウェポンを表示または非表示にする機能を提供します。また、ウェポンのステータスを表示するGUIも提供します。
クラス図
全体を俯瞰するためのクラス図になります
各ファイルごとに機能を集約し、また、依存性を低くすることにより、メンテナンス性の向上を実現しています
アイコンの見方

全体クラス図

上記、クラス図を作成するための、PlantUMLソースコードになります
参考にために掲載しておきます
ディスカッション
コメント一覧
まだ、コメントがありません