Day 26 - Adventure Game Tutorial 5
昨日の続きです。 2/6 Inventory機能の作成で書いたコードはこちら。 Inventory.cs using UnityEngine; using UnityEngine.UI; public class Inventory : MonoBehaviour { public Image[] itemImages = new Image[numItemSlots]; public Item[] items = new Item[numItemSlots]; public const int numItemSlots = 4; public ...
昨日の続きです。
2/6
Inventory機能の作成で書いたコードはこちら。
Inventory.cs
using UnityEngine; using UnityEngine.UI; public class Inventory : MonoBehaviour { public Image[] itemImages = new Image[numItemSlots]; public Item[] items = new Item[numItemSlots]; public const int numItemSlots = 4; public void AddItem(Item itemToAdd) { for (int i = 0; i < items.Length; i++) { if (items[i] == null) { items[i] = itemToAdd; itemImages[i].sprite = itemToAdd.sprite; itemImages[i].enabled = true; return; } } } public void RemoveItem (Item itemToRemove) { for (int i = 0; i < items.Length; i++) { if (items[i] == itemToRemove) { items[i] = null; itemImages[i].sprite = null; itemImages[i].enabled = false; return; } } } }
他にも、InventoryEditor.csというものを書いたのですが、こちらはまたEditor系で今度まとめて説明します。
Inventory.cs
AddItem関数の近く
public Image[] itemImages = new Image[numItemSlots]; // アイテム画像を設定 public Item[] items = new Item[numItemSlots]; // プレイヤーが持っているアイテム public const int numItemSlots = 4; // numItemSlotsってのは4で固定(変数じゃない) public void AddItem(Item itemToAdd) // AddItem 関数 { for (int i = 0; i < items.Length; i++) // アイテム欄を上から全部チェック { if (items[i] == null) // もし、アイテムが入っていない欄があったら { items[i] = itemToAdd; // AddItem(hoge)のhogeを入手したという判定 itemImages[i].sprite = itemToAdd.sprite; // 欄にアイテムの画像を割り当てて itemImages[i].enabled = true; // 画像を非アクティブからアクティブにする return; // アイテムの入手処理をしたらfor文終了。 } } }
で、RemoveItemの周り
public void RemoveItem (Item itemToRemove) // RemoveItem関数 { for (int i = 0; i < items.Length; i++) // アイテム欄を上から全部チェック { if (items[i] == itemToRemove) // RemoveItem(hoge)のhogeで指定されたのが入ってたら { items[i] = null; // アイテムは値を持たなくなる(アイテムが消える) itemImages[i].sprite = null; // 画像も値は持たなくなるし itemImages[i].enabled = false; // 非アクティブになる。 return; // アイテムを取り除いたらfor文終了。 } } }
publicにしている関数を他のスクリプトで使うためにここで書いていると… 前ゲーム作った時は考えなしにpublicにしてましたね。次作る時は使い分けを意識しなきゃ。
3/6
Condition機能の作成のために書いたコードはこちら。
ConditionCollection
using UnityEngine; public class ConditionCollection : ScriptableObject { public string description; public Condition[] requiredConditions = new Condition[0]; public ReactionCollection reactionCollection; public bool CheckAndReact() { for (int i = 0; i < requiredConditions.Length; i++) { if (!AllConditions.CheckCondition (requiredConditions[i])) return false; } if(reactionCollection) reactionCollection.React(); return true; } }
まずクラス名のところを見てみましょう。
using UnityEngine; public class ConditionCollection : ScriptableObject
何か気づかないでしょうか。 今までクラス名の右はMonoBehaviourというのが書かれていたんですが、今回はScriptableObjectという新要素が出てきました。 そもそも、MonoBehaviourとは何か?
公式によると 『MonoBehaviour はすべてのスクリプトから派生するベースクラスです。』 とのことです。 めちゃくちゃ噛み砕くと AwakeとかUpdateとか使ってましたよね、アレが使えてるのはMonoBehaviourのおかげです。
一行目のUnityEngineっていうので名前空間にクラスがいっぱい入ってて、その中の一つがMonoBehaviour。 そのMonoBehaviourを継承してやることでAwakeとかUpdateやらが使えていたわけですね。
んで、今回使うScriptableObjectもUnityEngineの中に入っているクラスの中の一つです。 コイツは何が出来るんだ?と、ちょっと調べてみたらゲーム全体で使えて一定なデータを作りたいときに使うらしいです。 プレイヤーの初期ステータスとかですかね、コードを見ていきましょう。
public string description; // descriptionの名の通り説明、インスペクター上での識別の為に使うだけ public Condition[] requiredConditions = new Condition[0]; // リアクションを起こすために必要な条件の設定 public ReactionCollection reactionCollection; // 条件が満たされた時、指定してある反応をする。その指定がreactionCollection。
・・・と、ここまで書いてきましたが ただつらつらと述べるだけではあまり意味がないと感じたため、全文の解読結果をまとめるのはここまでにしておきます。 次からは、重要だと思った点についてまとめます。 今日はここまで。