個人的なプロジェクトでレースゲームを作っているのですが、コースと車両を動的に読み込んで走行するところまで目途が立ってきました。ここで一度Unityのサンプルにあるレースのシステムを勉強して、自分のプロジェクトに取り込めることがあるか確認したいと思います。
チェックポイントの構造
チェックポイントとなるオブジェクトを見るとBox ColliderとPickup Object.csというスクリプトがアタッチされています。PickupObject.csにはTargetObjectを継承したPickupObjectクラスが定義されています。
PickupObjectクラスにはOnTriggerEnterメソッドが定義されており、このメソッドはBox Colliderに触れたタイミングで呼び出されます。メソッド内ではコライダーに触れたオブジェクトのレイヤー名とタグを調べて、プレイヤーだった場合のみOnCollectメソッドを呼び出しています。
void OnTriggerEnter(Collider other)
{
if ((layerMask.value & 1 << other.gameObject.layer) > 0 && other.gameObject.CompareTag("Player"))
{
OnCollect();
}
}
OnCollectメソッドは次のコードになっています。
void OnCollect()
{
if (CollectSound)
{ // コンポーネントに音声ファイルが指定されていれば音を鳴らす。
AudioUtility.CreateSFX(CollectSound, transform.position, AudioUtility.AudioGroups.Pickup, 0f);
}
if (spawnPrefabOnPickup)
{ // チェックポイントを通過したときに表示する効果(パーティクルとか)
var vfx = Instantiate(spawnPrefabOnPickup, CollectVFXSpawnPoint.position, Quaternion.identity);
Destroy(vfx, destroySpawnPrefabDelay);
}
// Objective.csに定義されたアクションで、実体はUnregisterPickupメソッド。
Objective.OnUnregisterPickup(this);
// TimeManager.csに定義されたアクションで、実体はAdjustTimeメソッド。
TimeManager.OnAdjustTime(TimeGained);
// 指定秒数後に自オブジェクト(チェックポイント)を削除する。
Destroy(gameObject, collectDuration);
}
やっていることは単純ですが、技術的にはとても参考になるコードです。このシリーズの次回はObjective.csかTimeManager.csを見ていこうと思います。なぜアクションを使うのかについては別途掘り下げたいと思います。
コメント