アイテムの取得
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 17/71。
拾得アイテムは、それ自体のスクリプトを持つトリガーです。何かが中に入ると、拾得アイテムはそれがプレイヤーであることを確認し、効果を与えてから自身を破棄します。プレイヤーのスクリプトは結果を保持し、そのためのパブリックメソッドを用意します。この体力パックは、Healthスクリプトを持つものを回復します。
// HealthPack.cs
public int amount = 25;
void OnTriggerEnter(Collider other)
{
if (other.TryGetComponent(out Health health) && health.hp < 100)
{
health.Heal(amount);
Destroy(gameObject);
}
}// Health.cs、プレイヤーにアタッチ
public int hp = 50;
public void Heal(int amount)
{
hp = Mathf.Min(hp + amount, 100);
Debug.Log("HP: " + hp);
}パックに滑り込んできた箱に対して、other.TryGetComponent(out Health health)はfalseになるため、Healthスクリプトを持つオブジェクトだけがこれを取得できます。また、体力が満タンのプレイヤーは、後で使えるようにパックをその場に残します。パックはotherを通じてプレイヤーを見つけるため、パックごとにInspector参照を設定する必要はなく、レベルに50個置くこともできます。別のスクリプトから呼び出されるため、Healはpublicです。また、上限の100は、hpを所有する唯一の場所であるHealthに設定されています。Destroy(gameObject)はパックを取り除きます。Destroy(other.gameObject)にすると、プレイヤーが取り除かれてしまいます。
チャレンジ
簡単弾薬箱でブラスターを補充できるようにします(ammo 4、maxAmmo 10)。
Blaster.csで、public int AddAmmo(int amount)を追加します。int taken = Mathf.Min(amount, maxAmmo - ammo);を追加し、ammoに加算して、"Ammo: " + ammoをログに出力し、takenを返します。AmmoCrate.csで、other.TryGetComponent(out Blaster blaster)のときに、blaster.AddAmmo(amount);とDestroy(gameObject);を呼び出します。
「プレイ」を押して右に歩きます。ConsoleにAmmo: 7、続いてAmmo: 10と表示されます。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class AmmoCrate : MonoBehaviour
{
public int amount = 3;
void OnTriggerEnter(Collider other)
{
// プレイヤーのBlasterが弾薬を受け取り、箱は消える
}
}
物理演算とゲームプレイのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド