はじめに
プレイヤーがアイテムに触れるとアイテムが消え、所持アイテム数が増える。
そして、ゲーム中に1度しか反応しないし、その後取得したシーンに戻っても出現しなくなるスクリプト。
\\\\ほしい!!!/////
となったのでついでに記事を書きました!
初心者なのでお見苦しいところなどがあると思いますがどうぞよろしくお願いいたします!
使用した環境
Unity 2021.3.4f1
Visual studio 2022
目次
1.調べた情報について・使う物の一覧
2.その1.Itemloggerクラスの作成
3.その2.Itemクラスの作成
4.まとめ
#1. 調べた情報について・使う物の一覧
C#のList< T > クラスを使っていきます!
Q.後ろに付いてる< T >ってなんだろう?
A.ジェネリッククラス
のことです!
特定のデータ型に固有ではない操作をカプセル化するらしいです。
詳しくは公式をご覧ください!↓
今回はList
内の3つのメソッドを使います。
1.Add()
2.Contains()
3. Clear()
List
はList<型名> 変数名 = new List<型名>();
で作成します。
これを使うことによりアイテムなどのゲーム中に保存したい物の管理 がしやすくなります。
(保存はStaticのおかげです。staticがないとシーンが変わると消えます!注意!)
Listの初期化見本
//string以外にもintなどが利用できます。
static List<string> parts = new List<string>();
Add
はリスト名.Add(変数名or"名前");
で使います。
リストにアイテムを追加するためのメソッドです。これを使えば、リストに新たな要素を簡単に追加することができます。
Add部分作成の見本
//ゲットしたアイテムを記録
public static void Add(string GetitemID)
{
if (Contains(GetitemID))
{
return;
}
parts.Add(GetitemID);//partsにはList名を書く
}
Containsはリスト名.Contains(変数名or"名前"など);
で使います。
リストが特定のアイテムを含んでいるかどうかを確認するためのメソッドです。これにより、特定のアイテムが既にリスト内に存在するかどうかを簡単にチェックすることができます。
Contains部分作成の見本
//アイテムをゲットしたか確認
public static bool Contains(string CheckItemID)
{
return parts.Contains(CheckItemID);
}
Clearは[リスト名.Crler();]で使います。
リスト内の全てのアイテムを削除し、リストを空にするためのメソッドです。これを使えば、一度に全てのアイテムを削除し、リストを初期状態に戻すことができます。
Clearの見本
//アイテム数をクリア
public static void Clear()
{
parts.Clear();
}
警告
リストに入っている記録を全部削除するので使いどころには注意が必要です。
それでは早速やっていきましょう!
#2. その1.ItemLoggerクラスの作成
アイテムを管理するスクリプトを作ります。
名前はItemLogger
です。
このスクリプトはオブジェクトにアタッチする必要はないです。
まずはアイテムを記憶するList
の部分を作っていきます。
これが今回の大部分といっていいぐらいの大きなものです!(文は短いですけどね)
String
以外にもint
だったり、両方組み合わせて
使うこともできます。
あと、Count
を他のスクリプト内で呼び出したりすると現在持ってるアイテムをIF文で比較したりできます。
public static class ItemLogger
{
static List<string> parts = new List<string>();
//リスト内の数をintで召喚出来る
//if文等で使える
public static int Count => parts.Count;
次に、いつでもリスト内のアイテム記録を削除できるように「Clear」の部分を作っていきます。
これを呼び出すと、そのリスト内の記録を綺麗さっぱり削除してくれます。
public static void Clear()
{
parts.Clear();
//アイテム数をクリア
}
そして、アイテムを取得した際にリストに追加できるadd
の部分を作っていきます。
public static void Add(string GetitemID)
{
if (Contains(GetitemID))
{
//取得状態は追加するタイミングでもチェック!
return;
}
parts.Add(GetitemID);
//ゲットしたアイテムを記録
}
#3. その2.Itemクラスの作成
アイテム側にアタッチするスクリプトを作っていきます!
名前はItem
です。
オブジェクト個々にID名を設定できるようにSerializeFieldを使います。
これを使うと、01.01
(1ステージ.1個目)のような形で管理することができます。
public class Item : MonoBehaviour
{
[SerializeField] string ID;
次にシーンが読み込まれた時の部分を作っていきます。
ステージが読み込まれた際にアイテム獲得済みかをItemLogger
側に聞きに行く感じです。
ID
の中は上の01
(int)やitem1
(string)のようなListで設定した変数名が使えます。
void Start()
{
//初期化 取得状態の確認
if (ItemLogger.Contains(ID))
{
Debug.Log("アイテムを獲得済み");
Destroy(gameObject);
}
else
{
Debug.Log("アイテムを獲得してないよ");
}
}
次にアイテムに触った時の処理を書きます。
まず、タグをプレイヤーか確認します。
プレイヤーの場合は取ったアイテムのIDをItemLoggerに追加
します。
その後Destroy
でプレイヤーが取得したアイテムを削除します。
private void OnTriggerEnter2D(Collider2D other)
{
//プレイヤーがアイテムを獲得したら
//IDをItemLoggerにIDを送ってアイテムを消す。
if(other.CompareTag("Player"))
{
ItemLogger.Add(ID);
Destroy(gameObject);
}
}
これでアイテムにアタッチするスクリプトができました!
ではアイテムオブジェクトにアタッチ!
あっ!そうそう! IDを設定するのを忘れずにしておきましょう。
このような感じに使うこともできます!
#4. まとめ
Add、Contains、Clear
これら3つのメソッドを使えば、リスト内のアイテム管理はいい感じです!
#雑談
アイテム管理以外にも汎用性がよさげな物なので作り方次第では他のスクリプトにも使えるかも...?
それ以外のメソッドも確認ぐらいはしておきましょう!!
掘り出し物は探さなければ見つからないのですから...
参考元
(List説明の参考元)マイクロソフト公式リンク #C Listクラス