ふりかえり
前回はステータス保存機能を実装しました!
いつでも同じ強さで挑戦できるようになり、「転生直後で弱いから挑戦できない…」などの挑戦時のストレスを軽減することができます!
防具作成!
前回、前々回で防具をドロップするための新しい遺跡や、ステータス保存機能で遺跡に挑戦するための準備を完了させました!
今回は、実際に遺跡でドロップする防具を実装していきたいと思います!
防具のシステムを決めていきます。
装備の種類、システム
今回は防具を5種類(頭・腕・胴・脚・足)実装します。
- 各装備にはメインオプションとサブオプションが付きます。 例:
- 頭:HP強化(固定)
- 腕:攻撃力強化(固定)
- 胴:防御力強化(固定)
- 脚:G獲得量強化(固定)
- 足:EXP獲得量強化(固定)
- サブオプションはランダムで1〜4個付きます。
- 強化システム
- 装備は最大Lv20まで強化可能
- 強化でメインオプションが強化されます
- Lv4ごとに
- サブオプションが4つ未満なら追加
- 4つならランダム強化
これにより、プレイヤーごとに異なる「最強装備」が生まれる設計になっています。
防具の画像はUnity Assetの「6000 Fantasy Icons」がセール対象になっていたので購入しました。6000個の高品質なアイコンが使えるのでゲーム制作で素材などを用意するのに困ったら役に立ちます!

スクリプト
ArmorManager.csで防具システムを実装しています。
1. 部位別生成システム
各部位に固定のメインオプションを設定します。
// 部位に応じたメインオプションを取得
private ArmorOptionType GetMainOptionBySlotType(ArmorSlotType slotType)
{
switch (slotType)
{
case ArmorSlotType.Head:
return ArmorOptionType.HP_PERCENTAGE; // 頭はHPの%強化
case ArmorSlotType.Arm:
return ArmorOptionType.ATTACK_PERCENTAGE; // 腕は攻撃力の%強化
case ArmorSlotType.Body:
return ArmorOptionType.DEFENSE_PERCENTAGE; // 胴は防御力の%強化
case ArmorSlotType.Leg:
return ArmorOptionType.GOLD_GAIN; // 脚はG獲得量の%分を追加
case ArmorSlotType.Foot:
return ArmorOptionType.EXP_GAIN; // 足は経験値獲得量の%分を追加
default:
return ArmorOptionType.HP_PERCENTAGE;
}
}
説明: 部位ごとにメインオプションが固定。頭はHP%、腕は攻撃力%、胴は防御力%、脚はG獲得、足はEXP獲得。
2. 難易度別設定システム
ScriptableObjectで難易度ごとの設定を管理します。
public class ArmorDifficultyConfig
{
[Header("防具名設定")]
public string armorName; // 防具名(例:布のフード、革の帽子)
public string description; // 説明
[Header("ビジュアル設定")]
public Sprite armorIcon; // 防具アイコン
[Header("メインオプション値範囲")]
public float minMainOptionValue = 10f; // メインオプション最小値(%)
public float maxMainOptionValue = 50f; // メインオプション最大値(%)
[Header("サブオプション値範囲")]
[Tooltip("HP、攻撃力、防御力、G獲得、EXP獲得、会心ダメージ用")]
public float minSubOptionValue = 5f; // サブオプション最小値(%)
public float maxSubOptionValue = 30f; // サブオプション最大値(%)
[Tooltip("会心率用")]
public float minCriticalRateValue = 1f; // 会心率最小値(%)
public float maxCriticalRateValue = 10f; // 会心率最大値(%)
[Tooltip("ダイヤ獲得確率用")]
public float minDiamondDropRateValue = 0.5f; // ダイヤ獲得確率最小値(%)
public float maxDiamondDropRateValue = 5f; // ダイヤ獲得確率最大値(%)
[Header("強化設定")]
[Tooltip("レベルアップ時のメインオプション強化値(%)")]
public float mainOptionUpgradeValue = 1f; // レベル1上がるたびのメインオプション強化値
[Tooltip("サブオプション強化倍率範囲(4つの場合の強化倍率)")]
public float minSubOptionUpgradeMultiplier = 1.3f; // サブオプション強化倍率最小値
public float maxSubOptionUpgradeMultiplier = 1.6f; // サブオプション強化倍率最大値
[Tooltip("各レベルの強化必要G(レベル1→2からレベル19→20まで、20個の値)")]
public int[] upgradeCosts = new int[20]; // レベル1→2からレベル19→20までの必要G
}
説明: 部位×難易度ごとに設定可能。メイン/サブオプションの値範囲、強化コスト、強化時の上昇値を個別に設定できます。
3. レアリティシステム
サブオプション数でレアリティを決定します。
// サブオプション数を決定(10%で4つ、20%で3つ、30%で2つ、40%で1つ)
private int DetermineSubOptionCount()
{
float random = Random.Range(0f, 1f);
if (random < subOption4Probability)
{
return 4;
}
else if (random < subOption4Probability + subOption3Probability)
{
return 3;
}
else if (random < subOption4Probability + subOption3Probability + subOption2Probability)
{
return 2;
}
else
{
return 1;
}
}
// サブオプション数を決定
int subOptionCount = DetermineSubOptionCount();
armor.rarity = subOptionCount;
armor.initialRarity = subOptionCount; // 初期レアリティを保存
説明: サブオプション数がレアリティ。1個=レアリティ1、2個=2、3個=3、4個=4。初期レアリティは保持され、強化で追加されても変わりません。
4. オプション生成システム
メインオプションは部位固定、サブオプションは重複なしでランダム生成します。
// メインオプションを生成
ArmorOptionType mainOptionType = GetMainOptionBySlotType(slotType);
float mainOptionValue;
if (config != null)
{
mainOptionValue = Random.Range(config.minMainOptionValue, config.maxMainOptionValue);
}
else
{
mainOptionValue = Random.Range(minMainOptionValue, maxMainOptionValue);
}
string mainDisplayName = GetOptionDisplayName(mainOptionType);
string mainDescription = GetOptionDescription(mainOptionType);
armor.mainOption = new ArmorOption(mainOptionType, mainOptionValue, mainDisplayName, mainDescription);
// サブオプション数を決定
int subOptionCount = DetermineSubOptionCount();
armor.rarity = subOptionCount;
armor.initialRarity = subOptionCount; // 初期レアリティを保存
// サブオプションを生成(重複なし)
List<ArmorOptionType> usedOptionTypes = new List<ArmorOptionType>();
usedOptionTypes.Add(mainOptionType); // メインオプションと同じ種類は使用しない
for (int i = 0; i < subOptionCount; i++)
{
ArmorOptionType subOptionType = GetRandomSubOptionType(usedOptionTypes);
usedOptionTypes.Add(subOptionType);
// サブオプションの種類に応じて適切な範囲を使用
float subOptionValue = GetSubOptionValue(subOptionType, config);
string subDisplayName = GetOptionDisplayName(subOptionType);
string subDescription = GetOptionDescription(subOptionType);
ArmorOption subOption = new ArmorOption(subOptionType, subOptionValue, subDisplayName, subDescription);
armor.subOptions.Add(subOption);
}
説明:
- メインオプション: 部位固定。難易度別の値範囲からランダム生成。
- サブオプション: 8種類から重複なしで選択。メインオプションと重複しない。種類ごとに値範囲を設定可能。
Unityでの設定

Inspectorで防具の部位、各難易度ごとの名前、画像、メインとサブオプションの値を設定します。
動作確認
ステータスを保存し、遺跡に挑戦すると、防具をドロップするようになりました!
ドロップした防具を見ると、防具の画像、メインオプション、サブオプションが表示されています!

まとめ
今回は防具を作成しました!
これで以下の3つのコア機能を実装することができ、装備機能を完成させることができました!
- 遺跡(新ダンジョン)
- 装備の種類とシステム
- ステータス保存機能
次回予告
次回は防具に二つ名機能を実装したいと思います!
とても深いやり込み要素になると思います!
お楽しみに!
