アイテムの取得
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 17/63。
アイテムは、それ自身のスクリプトを持つトリガーです。何かが入ると、アイテムはそれがプレイヤーかどうかを確認し、効果を与えて自身を破棄します。プレイヤーのスクリプトは結果を保持し、そのためのパブリックメソッドを提供します。このヘルスパックは、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)にすると、プレイヤーが削除されます。
チャレンジ
簡単プレイヤーはBlasterを持っています。ammo(開始時は4)とmaxAmmo(10)があります。矢印キーで移動し、Spaceで射撃します。どちらも記述済みです。弾薬箱で弾薬を補充できるようにしましょう。
Blaster.csに、publicメソッドint AddAmmo(int amount)を追加します。amountのうちmaxAmmoを超えない分だけ受け取り、新しい合計(例:Ammo: 7)をログに出力し、受け取った数を返します。AmmoCrate.csでは、プレイヤーが弾薬箱に入ったとき、箱のamountをBlasterに渡し、受け取った分を差し引きます。空になった弾薬箱は削除します。弾薬が残っている箱は、残った弾薬を保持したまま、次に訪れるときまでその場に残します。
最初の弾薬箱には3、2つ目には5入っています。Playを押して右へ歩き、何発か撃ってから、2つ目の弾薬箱まで戻って歩き、Checkを押します。
自分で試してみよう
using UnityEngine;
public class AmmoCrate : MonoBehaviour
{
public int amount = 3;
void OnTriggerEnter(Collider other)
{
// プレイヤーのBlasterは収まる分だけ受け取り、残りはクレートに残る。クレートは空になると消える
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。