装備機能の実装④防具作成編! Unityで1日1ステップ!ノンフィールドRPG開発日記

1日1歩開発日記

ふりかえり

前回はステータス保存機能を実装しました!

いつでも同じ強さで挑戦できるようになり、「転生直後で弱いから挑戦できない…」などの挑戦時のストレスを軽減することができます!

防具作成!

前回、前々回で防具をドロップするための新しい遺跡や、ステータス保存機能で遺跡に挑戦するための準備を完了させました!

今回は、実際に遺跡でドロップする防具を実装していきたいと思います!

防具のシステムを決めていきます。

装備の種類、システム

今回は防具を5種類(頭・腕・胴・脚・足)実装します。

  • 各装備にはメインオプションサブオプションが付きます。 例:
    • 頭:HP強化(固定)
    • 腕:攻撃力強化(固定)
    • 胴:防御力強化(固定)
    • 脚:G獲得量強化(固定)
    • 足:EXP獲得量強化(固定)
    • サブオプションはランダムで1〜4個付きます。
  • 強化システム
    • 装備は最大Lv20まで強化可能
    • 強化でメインオプションが強化されます
    • Lv4ごとに
      • サブオプションが4つ未満なら追加
      • 4つならランダム強化

これにより、プレイヤーごとに異なる「最強装備」が生まれる設計になっています。

防具の画像はUnity Assetの「6000 Fantasy Icons」がセール対象になっていたので購入しました。6000個の高品質なアイコンが使えるのでゲーム制作で素材などを用意するのに困ったら役に立ちます!

6000 Fantasy Icons | 2D Icons | Unity Asset Store
Elevate your workflow with the 6000 Fantasy Icons asset from PONETI. Browse more 2D GUI on the Unity Asset Store.

スクリプト

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つのコア機能を実装することができ、装備機能を完成させることができました!

  1. 遺跡(新ダンジョン)
  2. 装備の種類とシステム
  3. ステータス保存機能

次回予告

次回は防具に二つ名機能を実装したいと思います!

とても深いやり込み要素になると思います!

お楽しみに!

タイトルとURLをコピーしました