おさらい:戦利品を抽選する
CoddyのUnityジャーニー「Unityのゲームアーキテクチャ」セクションの一部。レッスン 22/64。
この章では、シリアライズ可能なクラス、リスト、列挙型をインスペクターに配置し、宝箱のテーブルではその3つすべてを使用します。これで宝箱はそのテーブルを使って抽選します。
チャレンジ
簡単Spaceキーで宝箱を開き、重みに応じてアイテムを1つドロップさせます。
public LootEntry Pick(int roll)を記述します。tableを順に調べ、rollがその重みより小さい場合はエントリーを返し、そうでなければ重みを差し引きます。ループの後に、return null;を記述します。- Spaceキーを押したとき、
Random.Range(0, TotalWeight())で選び、宝箱より1.5単位上にそのprefabを生成し、entry.rarity + ": " + entry.itemNameをログに出力します。
「プレイ」を押してSpaceキーを押します。ほとんどの場合、Common: AppleまたはBreadが出ます。その後、「確認」を押します。
自分で試してみよう
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public enum Rarity { Common, Rare, Epic, Legendary }
[System.Serializable]
public class LootEntry
{
public string itemName;
public GameObject prefab;
public Rarity rarity;
}
public class LootChest : MonoBehaviour
{
public List<LootEntry> table;
public int WeightOf(Rarity rarity)
{
switch (rarity)
{
case Rarity.Common: return 10;
case Rarity.Rare: return 4;
case Rarity.Epic: return 2;
case Rarity.Legendary: return 1;
}
return 0;
}
public int TotalWeight()
{
int total = 0;
foreach (LootEntry entry in table) total += WeightOf(entry.rarity);
return total;
}
// ここにPick(int roll)と、Spaceで宝箱を開ける処理を記述する
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Unityのゲームアーキテクチャのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド