51歩目 レアモンスターを実装! Unityで1日1ステップ!ノンフィールドRPG開発日記

1日1歩開発日記

ふりかえり

前回は、G(ゴールド)やEXP(経験値)、ダイヤの獲得量を増やす「アーティファクト」や「マナ強化」機能を実装しました。プレイヤーが育成を実感できる重要な要素で、これによりダンジョンの奥深くまでテンポよく進めるようになります。

レアモンスターを実装!

今回はゲームに“ワクワク感”をプラスするため、レアモンスターの仕組みを実装しました!

レアモンスターは1%という超低確率で出現する特別な敵で、撃破時には通常の敵の約50倍のGとEXP、さらに確定でダイヤ50個をドロップします。

出現時には画面に派手なエフェクトが再生され、誰が見ても「これはレアだ!」とすぐに分かる演出になっています。プレイヤーにとってはサプライズ的な要素となり、ゲームプレイにアクセントを加えます。

倒せれば一気に育成が進みますが、強化が不十分な状態では倒しきれず逃げられてしまうため、緊張感あるバトル体験にも繋がっています。

スクリプトの変更

EnemyManager.cs

EnemyManager.csにレアモンスター判定と報酬計算の処理を追加しました。

主な変更点の目的と処理の流れ:

1. レアモンスターの出現判定

  • 通常の確率(例: 1%)に、アーティファクトによる出現率ボーナスを加えた確率で抽選します。

2. 報酬の倍率処理

  • 経験値・ゴールドは、設定された倍率(基本50倍)にアーティファクト効果を加算して計算。

3. レアモンスターの演出とログ

  • 名前の前に「レア」が付与され、出現時はAnimationManagerで豪華なエフェクトを再生。
  • RecordManagerに記録を追加し、プレイヤーの達成感・記録性もサポート。

4. ダイヤ報酬の確定化と強化

  • ダイヤは基本50個+アーティファクトによる追加で確定ドロップされます。
    public void SetupNewEnemyForStage(int stageLevel)
    {   
        // レアモンスターの判定と設定
        if (currentEnemyType.canBeRare && Random.Range(0f, 1f) < GetRareMonsterChanceWithArtifact())
        {
            enemy.isRare = true;
            enemy.expReward = Mathf.RoundToInt(enemy.expReward * GetRareMonsterRewardMultiplierWithArtifact());
            enemy.goldReward = Mathf.RoundToInt(enemy.goldReward * GetRareMonsterRewardMultiplierWithArtifact());
            enemy.diamondReward = GetRareMonsterDiamondRewardWithArtifact();
            
            // レアモンスターの名前を変更
            enemy.name = $"レア {enemy.name}";
            
            // RecordManagerにレアモンスター遭遇記録を追加
            if (recordManager != null)
            {
                recordManager.RecordRareMonsterEncounter();
            }
            
            Debug.Log($"<color=yellow>レアモンスターが出現しました!</color>");
            Debug.Log($"報酬: 経験値{enemy.expReward}、ゴールド{enemy.goldReward}、ダイヤ{enemy.diamondReward}");
            
            // レアモンスター出現エフェクトを再生
            if (animationManager != null)
            {
                animationManager.PlayRareMonsterEffect();
            }
        }

    // レアモンスターの出現確率を設定
    public void SetRareMonsterChance(float chance)
    {
        if (availableEnemies != null)
        {
            foreach (var enemySO in availableEnemies)
            {
                if (enemySO.canBeRare)
                {
                    enemySO.rareChance = Mathf.Clamp01(chance);
                }
            }
        }
        
        if (stageMonsterManager != null)
        {
            // StageMonsterManagerのモンスターにも適用
            var monsterSets = stageMonsterManager.GetMonsterSets();
            if (monsterSets != null)
            {
                foreach (var monsterSet in monsterSets)
                {
                    if (monsterSet.monsters != null)
                    {
                        foreach (var monster in monsterSet.monsters)
                        {
                            if (monster.canBeRare)
                            {
                                monster.rareChance = Mathf.Clamp01(chance);
                            }
                        }
                    }
                }
            }
        }
        
        Debug.Log($"レアモンスター出現確率を{chance * 100:F1}%に設定しました");
    }
    
    // 現在のレアモンスター出現確率を取得
    public float GetRareMonsterChance()
    {
        if (availableEnemies != null && availableEnemies.Count > 0)
        {
            return availableEnemies[0].rareChance;
        }
        return 0.01f; // デフォルト値
    }
    
    // アーティファクトの効果を含むレアモンスター出現確率を取得
    private float GetRareMonsterChanceWithArtifact()
    {
        float baseChance = currentEnemyType.rareChance;
        float artifactBonus = 0f;
        
        if (playerManager != null && playerManager.player != null)
        {
            artifactBonus = playerManager.player.artifactPowerUpRareMonsterChance;
        }
        
        float totalChance = baseChance + artifactBonus;
        Debug.Log($"レアモンスター出現確率: 基本{baseChance * 100:F1}% + アーティファクト{artifactBonus * 100:F1}% = {totalChance * 100:F1}%");
        
        return totalChance;
    }
    
    // アーティファクトの効果を含むレアモンスター報酬倍率を取得
    private float GetRareMonsterRewardMultiplierWithArtifact()
    {
        float baseMultiplier = currentEnemyType.rareExpMultiplier; // 経験値とゴールドは同じ倍率
        float artifactBonus = 0f;
        
        if (playerManager != null && playerManager.player != null)
        {
            artifactBonus = playerManager.player.artifactPowerUpRareMonsterRewardBonus;
        }
        
        float totalMultiplier = baseMultiplier + artifactBonus;
        Debug.Log($"レアモンスター報酬倍率: 基本{baseMultiplier}倍 + アーティファクト{artifactBonus}倍 = {totalMultiplier}倍");
        
        return totalMultiplier;
    }
    
    // アーティファクトの効果を含むレアモンスターダイヤ報酬を取得
    private int GetRareMonsterDiamondRewardWithArtifact()
    {
        int baseReward = currentEnemyType.rareDiamondReward;
        int artifactBonus = 0;
        
        if (playerManager != null && playerManager.player != null)
        {
            artifactBonus = playerManager.player.artifactPowerUpRareMonsterDiamondBonus;
        }
        
        int totalReward = baseReward + artifactBonus;
        Debug.Log($"レアモンスターダイヤ報酬: 基本{baseReward}個 + アーティファクト{artifactBonus}個 = {totalReward}個");
        
        return (int)totalReward;
    }

動作確認

レアモンスター出現時に派手なエフェクトが発生し、一目でレアモンスターが出現したとわかります!

また倒すと大量のGとEXPとダイヤを獲得し一気にレベルアップしました!

まとめ

  • レアモンスターという新要素を追加し、偶然性・サプライズ・報酬強化を同時に実現。
  • アーティファクト強化と連動し、育成戦略の幅をさらに拡大。
  • 出現時エフェクトと報酬により、見た目・体感ともに「特別感」を演出。

強化が不十分な状態ではせっかく出現しても倒せず逃げられてしまうので、しっかり準備して挑みましょう!

進捗

今回はレアモンスターの追加をしました!

  • (済)オート戦闘:ボタン操作なしでもバトルが進むようにする。
  • (済)オートスキル発動:スキルも自動で発動する機能。
  • (済)UIのブラッシュアップ:デザインとレイアウトを整えて見やすくする。
  • (済)ステージ数の拡充(最低20):遊びごたえを高めるためにボリュームアップ。
  • 復活機能(広告視聴):ゲームオーバー時、広告視聴で復活できる仕組み。
  • 広告報酬でダイヤ獲得:無課金でもダイヤが手に入る仕組み。
  • (済)G強化・アーティファクト・転生の拡張:各システムにさらなる深みを持たせる。
  • (済)回復薬の追加:ステージを進めやすくする。
  • アニメーションの追加:ゲーム画面にもっと動きを持たせる。
  • (済)レアモンスターの追加:わくわく感を追加する。
  • 放置要素の追加:プレイしていない時間も強くなる。
  • メニューの内容追加:ストーリー、記録、ガイドなどプレイヤーが遊びやすくする。

次回予告

次回はメニュー内容の追加を進めていきます。

まずはストーリー機能の実装に取りかかる予定です。

プレイヤーが世界観にもっと没入できるように、物語面の強化にも注力していきます。お楽しみに!

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