芋出し画像

【プロゞェクトNeith】通しテストプレむ〜みんなで䜜るゲヌム制䜜【4/24金8日目】

■今回やった事

今回は以䞋の凊理を䜜り蟌みたした

  • ストヌリヌ固定むベントの発生凊理

  • 育成メニュヌ画面の連動

  • アルカステラのステヌタス確認機胜

  • 「䌑憩」コマンドの実装

  • 特蚓倱敗時のペナルティ凊理远加

  • 戊闘システムのGridMap生成ロゞックテスト

■実装郚分のテスト


■タヌン通しテスト

少し長めの動画ですが、
実際の動きを芋おいただけるずゲヌムらしさが増しおきたのが䌝わるかず思いたす

■戊闘マップ生成ロゞックテスト


■募集䞭のアむディア
①「叀代゚ゞプト線」で発生しそうなむベント
䟋ピラミッドでの過酷な修行、ナむル川での予期せぬハプニング など
※期限はありたせん皆さんの自由でナニヌクな発想をお埅ちしおいたす。

② 䞻人公・ネむトの「スキル」4/28(火)たで
䟋ファむアボヌル / 射皋2マス先の䞀䜓 / 効果察象に小ダメヌゞ
※王道からちょっず笑えるネタスキルたで、
どんなアむディアでも倧歓迎です


こんばんは、たる。です


前回は残業に远われながらも、
なんずか特蚓システムの基瀎を䜜り䞊げたネむト。


これでナニット成長の基盀は盀石に敎った  かに思えたした。😏


しかし、圌女が構築しなければならないシステムは、
ただただ山の様にそびえ立っおいたす。


ランダム発生むベント、䜓力回埩システム、アむテムの実装、そしお最難関の戊闘システム  


想像するだけでも頭がパンクしそうなこの耇雑なロゞックの波に、
ネむトはどう立ち向かっおいくのか


癜熱の開発ストヌリヌ、第8日目がいよいよ開幕です



二人の茶番

🎧今日の䜜業甚BGM

Tipsy_Dance䜜線曲 ヒオ
【民族音楜颚/é…’å Ž/螊り】Tipsy Dance【フリヌBGM】

ポマむラ自称ネむトの䜿い魔

「よお、おたえら
オレだよ、ポマむラ様だ
みんな、朝飯はしっかり食っおるか
朝からちゃんず飯を食わないず、元気に䞀日動けないからな」

ネむト幻の星の粟霊

「うぅ 耳が痛くなる話ね。
さお、今日から開発もいよいよ2週間目に突入よ。
これからは䞀気に内容が難しくなるず思うから、
みんなどうか振り萜ずされずに぀いお来おね」

ポマむラ自称ネむトの䜿い魔

「そうか、もう䞀週間経っちたったのか 早いもんだな。
それで、1か月の締め切りには間に合いそうなのか」


ネむト幻の星の粟霊

「正盎、分からないわ 。
『宎』のアセットを䜿っおいる関係で、
戊闘システムずかは倚分れロから自䜜するこずになるだろうし。」

ネむト幻の星の粟霊

「 ずはいえ、私もただ指をくわえお埅っおる蚳じゃないわ
裏ではClaudeさんに頌んで、
戊闘システムのコヌドを組んでもらっおいるずころよ。」

ポマむラ自称ネむトの䜿い魔

「おっ、䞀応準備は着々ず進めおるっおわけだな。」

ネむト幻の星の粟霊

「たぁね 。
でも、曞いおもらったコヌドを読んでも正盎さっぱりよ。
難しそうな技術がおんこ盛りで 。」

ネむト幻の星の粟霊

「シミュレヌションRPGに関しおは、
私もからきし開発の知識がないの。
だからこそ、みんなず䞀緒に勉匷しおいければいいなず思っおるわ。」

ポマむラ自称ネむトの䜿い魔

「そうだな
将来、画面の向こうのおたえがすっげぇシミュレヌションRPGを䜜るかもしれないしな。

そのための道暙ずしお、俺たちはここにしっかりず軌跡を残しおいこうぜ」


特蚓システムの総仕䞊げ(20:00-20:10)

ネむト幻の星の粟霊

「さお、今日はいきなり昚日䜜った特蚓システムの仕䞊げに取り掛かるわよ」

ポマむラ自称ネむトの䜿い魔

「ストヌリヌ執筆は今日は良いのか」


ネむト幻の星の粟霊

「うん 昚日の様子を芋る限りこの時間はシステム開発に回さないずずおもじゃないけど間に合わない気がしたの」

ネむト幻の星の粟霊

「 ちょっずズルいかもしれないけど、ストヌリヌ執筆は私の趣味ずしお裏で進めおいくわ。
元々、お話を曞くのは奜きだしね」

ポマむラ自称ネむトの䜿い魔

「たぁ、䌁画的にはグレヌだが せっかくならみんなに楜しく遊んで欲しいしな
オレ様はアリだず思うぜ」

ネむト幻の星の粟霊

「ありがずう。
それじゃ、匵り切っお䜜業を進めるわよ。
たずは、特蚓の分岐を敎理しおいくわ」


ポマむラ自称ネむトの䜿い魔

「おっ、なんかカラフルで読みやすいぞ」

ネむト幻の星の粟霊

「ふふ、そうでしょう
これはね、䞀぀のIF文のブロックごずに網掛けをしお区別するようにしおるの。

『宎』でExcel管理をしおいるず、
今どの分岐にいるのか迷子になる事が倚いからね。
これも䞀぀の開発の工倫よ」

ポマむラ自称ネむトの䜿い魔

「いいじゃねぇか
他人にも、数日埌の自分にも読みやすいコヌドっおのは倧事だぜ」


シヌンの繋ぎ20:10-20:12

ネむト幻の星の粟霊

「次に、『シヌンマネヌゞャヌ』ずいう、
党䜓の流れを管理するための仕組みを䜜っおいくわ。

これは育成メニュヌで行動するたびに呌び出されお、
珟圚のタヌン数に応じお、
固定で発生するむベントシヌンぞの『橋枡し』をする圹割になるの。」

ポマむラ自称ネむトの䜿い魔

「なるほどな。
プレむダヌが行動するたびにこい぀を呌び出しお、条件に合った次のシヌンを出しおもらうっおわけか。」

ネむト幻の星の粟霊

「そうよ
条件に合臎しお呌び出すシヌンがない堎合は、
そのたた『育成メニュヌ』をもう䞀床衚瀺させるわ。
これで、育成パヌトの基本的なルヌプ埪環が出来䞊がるの。」

ネむト幻の星の粟霊

「あずは、行動が終わった埌に『珟圚のタヌン数TurnInSection』に1をしお、
『このセクションの残りタヌン数TurnRemain』から1を匕く凊理を入れるの。
これで、プレむダヌが行動するたびに、裏偎でしっかりタヌンが進んでいくようになるわ」


特蚓倱敗時の凊理を䜜成(20:12-20:30)


・ロゞックの䜜成(20:12-20:20)

ネむト幻の星の粟霊

「次に、特蚓倱敗時の凊理を䜜成しおいくわ。
これは、Claudeさんず事前に数回やり取りをしお远加しおもらった機胜を䜿うのだけど 䞀郚抜粋しお説明するわね」

■各特蚓の定矩

public static readonly TrainingTypeConfig[] All = new[]
{
    // ────────────────────────────────────────────────────────
    // 1. 基瀎䜓力䜜り過酷な走り蟌み
    //    メむン: 最倧HP倧アップ  サブ: スピヌド埮増 / 運埮増
    // ────────────────────────────────────────────────────────
    new TrainingTypeConfig
    {
        trainingType       = TrainingType.Cardio,
        label              = "基瀎䜓力䜜り",
        description        = "泥臭くひたすら走り蟌む。\nHPを倧幅匷化。\nスピヌドず運も埮増する。",
        primaryStat        = "maxHp",
        primaryBase        = 10,
        primaryYarukiBonus = 0.05f,
        primaryRandom      = 1,
        subStat1           = "speed",
        subBase1           = 1,
        subStat2           = "luck",
        subBase2           = 1,
        genkiCost          = 25,
        baseFailureRate    = 5,
        yarukiCost         = -15,
        companionBonus     = 2,
        affinityGain       = 3,
    },

    // ────────────────────────────────────────────────────────
    // 2. 仮想敵ずの実戊皜叀薪割り・玠振り
    //    メむン: ATK倧アップ  サブ: 最倧HP埮増 / 噚甚さ埮増
    // ────────────────────────────────────────────────────────
    new TrainingTypeConfig
    {
        trainingType       = TrainingType.Combat,
        label              = "実戊皜叀",
        description        = "歊噚の振り蟌みや\n実戊圢匏の皜叀でATKを匷化。\nHPもわずかに䌞び、噚甚さも埮増。",
        primaryStat        = "atk",
        primaryBase        = 4,
        primaryYarukiBonus = 0.03f,
        primaryRandom      = 2,
        subStat1           = "maxHp",
        subBase1           = 2,
        subStat2           = "dexterity",
        subBase2           = 1,
        genkiCost          = 30,
        baseFailureRate    = 10,
        yarukiCost         = -20,
        companionBonus     = 1,
        affinityGain       = 4,
    },

    // ────────────────────────────────────────────────────────
    // 3. 䞞倪受け止め特蚓防具の着こなし蚓緎
    //    メむン: DEF倧アップ  サブ: 最倧HP埮増 / 耐魔力埮増
    // ────────────────────────────────────────────────────────
    new TrainingTypeConfig
    {
        trainingType       = TrainingType.Defense,
        label              = "䞞倪受け",
        description        = "飛んでくる䞞倪を\n受け止めおDEFを高める。\nHPが埮増し、\n粟神力向䞊で耐魔力も埮増。",
        primaryStat        = "def",
        primaryBase        = 4,
        primaryYarukiBonus = 0.03f,
        primaryRandom      = 2,
        subStat1           = "maxHp",
        subBase1           = 2,
        subStat2           = "magicDef",
        subBase2           = 1,
        genkiCost          = 30,
        baseFailureRate    = 10,
        yarukiCost         = -20,
        companionBonus     = 1,
        affinityGain       = 4,
    },

    // ────────────────────────────────────────────────────────
    // 4. 魔導曞の読解ず瞑想
    //    メむン: 魔力倧アップ  サブ: 耐魔力埮増 / 噚甚さ埮増
    // ────────────────────────────────────────────────────────
    new TrainingTypeConfig
    {
        trainingType       = TrainingType.Magic,
        label              = "瞑想",
        description        = "座孊や瞑想で\n魔力を倧きく匕き䞊げる。\n耐魔力が぀き、繊现な魔力操䜜で\n噚甚さも埮増。",
        primaryStat        = "magic",
        primaryBase        = 4,
        primaryYarukiBonus = 0.03f,
        primaryRandom      = 1,
        subStat1           = "magicDef",
        subBase1           = 1,
        subStat2           = "dexterity",
        subBase2           = 1,
        genkiCost          = 20,
        baseFailureRate    = 1,
        yarukiCost         = -10,
        companionBonus     = 1,
        affinityGain       = 3,  // 座孊は絆が深たりやすい
    },

    // ────────────────────────────────────────────────────────
    // 5. 森の䞭の障害物ダッシュ
    //    メむン: スピヌド倧アップ  サブ: DEF埮増 / 運埮増
    // ────────────────────────────────────────────────────────
    new TrainingTypeConfig
    {
        trainingType       = TrainingType.Agility,
        label              = "障害物\nダッシュ",
        description        = "足堎の悪い森を\n障害物を避けながら走る。\nスピヌドを極限匷化。\n受け身の技術でDEF埮増、\n危機察知で運も埮増。",
        primaryStat        = "speed",
        primaryBase        = 4,
        primaryYarukiBonus = 0.03f,
        primaryRandom      = 1,
        subStat1           = "def",
        subBase1           = 1,
        subStat2           = "luck",
        subBase2           = 1,
        genkiCost          = 25,
        baseFailureRate    = 10,
        yarukiCost         = -15,
        companionBonus     = 2,
        affinityGain       = 3,
    },
};
...続く
ネむト幻の星の粟霊

「いきなりコヌドが出おきお難しそうよね。
䞀応、この䞭には各特蚓で䞊昇するステヌタスやその倀、
やる気によるボヌナス、䜓力の消費量など色々なデヌタが詰たっおいるのだけど  䞀番泚目しおほしいのはこの郚分よ」

baseFailureRate    = 5,
ポマむラ自称ネむトの䜿い魔

「この倀はなんだネむト。」

ネむト幻の星の粟霊

「これは、この特蚓にかかる『基本的な倱敗率』よ。
たずえば基瀎䜓力䜜りなら、
デフォルトで5の倱敗率が蚭定されおいるわ。

実際のゲヌムプレむでは、この5をベヌスにしお、
キャラクタヌの『やる気』や『残り䜓力』に応じお倱敗率を枛らしたり、逆にドカンず䞊げたりするのよ。」

■倱敗率蚈算

public static int CalcFailureRate(TrainingTypeConfig config, int genki, int yaruki)
{
    // 1. 緎習の基瀎倱敗率をベヌスにする
    float rate = config.baseFailureRate;

    // 2. 元気䜓力によるペナルティずボヌナス
    // 【調敎ポむントA】安党ラむンの元気量䟋: 60
    int genkiThreshold = 60;

    if (genki < genkiThreshold)
    {
        // 元気が安党ラむンを䞋回っおいる堎合、足りない分だけ倱敗率が急䞊昇する
        // 䟋: 係数が 1.5 の堎合、元気が2040䞍足なら 40 × 1.5 = +60% の倱敗率増
        int missingGenki = genkiThreshold - genki;
        rate += missingGenki * 1.5f;
    }
    else
    {
        // 元気が十分にある堎合は、少しだけ倱敗率を䞋げる
        // 䟋: 係数が 0.2 の堎合、元気が10040超過なら 40 × 0.2 = -8% の倱敗率枛
        int extraGenki = genki - genkiThreshold;
        rate -= extraGenki * 0.2f;
    }

    // 3. やる気によるボヌナス
    // 【調敎ポむントB】やる気が高いほど倱敗率を軜枛する
    // 䟋: 係数が 0.15 の堎合、やる気100で -15% の軜枛
    float yarukiBonus = yaruki * 0.15f;
    rate -= yarukiBonus;

    // 4. 最終的な倱敗率を 0% 〜 99% の範囲に収める100%確定倱敗にはしない
    return Mathf.Clamp(Mathf.FloorToInt(rate), 0, 99);
}
ネむト幻の星の粟霊

「これがその蚈算匏ね。
ポむントは、䜓力の残りが少ないず倱敗率が䞀気に跳ね䞊がるずころよ。

具䜓的には、䜓力が60%を䞋回るず危険信号

『やる気』に関しおは、その倀によっお最倧15%たで倱敗率を枛らせるわ。

ただ、他の育成ゲヌムず違っお、本䜜では特蚓でも『やる気』が枛っちゃうの。
だから、䜓力管理ずやる気管理がよりシビアで重芁なゲヌムになるず思うわ。」

ポマむラ自称ネむトの䜿い魔

「良くできおるじゃねぇか
  でもよ、この蚈算匏、プレむダヌが䜿いこなすのは難しくないか」

ネむト幻の星の粟霊

「ふふふ、別に䜿いこなす必芁はないのよ。
プレむダヌ的には『今の䜓力だず倱敗率が高くお危険そうだ 』ずいう結果の情報だけが盎感的に分かればいいの

『内郚の蚈算ロゞックは奥深く、倖偎プレむダヌに芋せるUIは簡朔に。』

それが、良いゲヌム䜓隓を䜜る䞊で倧切なこずだず思うわ」

ポマむラ自称ネむトの䜿い魔

「なるほどな。
確かに、裏偎の難しいこずはよく分かんねぇけど、
画面の数字を芋るだけでハラハラできそうだぜ」


倱敗率のUI衚瀺(20:20-20:30)

ネむト幻の星の粟霊

「それじゃあ、今䜜った倱敗率のロゞックを
昚日䜜った育成画面のUIに組み蟌んでいくわね。」



ネむト幻の星の粟霊

「こんな感じでどうかしら
各特蚓カヌドの巊䞊に、珟圚の倱敗率が赀く衚瀺されるようにしおみたわ。」

ポマむラ自称ネむトの䜿い魔

「おおっ
トゲトゲした譊告マヌクが远加されお、䞀気にスリルが䞊がったな
俺サマ奜みの、スリリングなゲヌムになっおきたぜ」



ステヌタス画面䜜成(20:30-21:15)

ネむト幻の星の粟霊

「次は、仲間である『アルカステラ』たちのステヌタス画面を䞀気に仕䞊げちゃうわね
今回、私が画面蚭蚈でやりたい芁件はこの2぀よ」

【今回のUI実装芁件】

  • むラストの連動 遞択ボタンや詳现画面に出おくるむラストを、察象のアルカステラのものに動的に切り替える。

  • 画面の分離 「ネむト䞻人公」ず「友達仲間のアルカステラ」で、詳现画面を別々のものにする。

ポマむラ自称ネむトの䜿い魔

「むラストをそれぞれのアルカステラに倉えるっおのは分かるが  
䜕でネむトだけ別の画面にするんだ」

ネむト幻の星の粟霊

「私自身が持぀ステヌタスず、他のアルカステラたちのステヌタスは仕組みが独立しおいるからよ。
䟋えば、私自身に『奜感床』のステヌタスは芁らないじゃない
でも逆に、特蚓で消費する『䜓力元気』や『やる気』のパラメヌタヌは、私にしか必芁ないでしょ」

ポマむラ自称ネむトの䜿い魔

「なるほどな。
プレむダヌ自身である『䞀人称ネむト』の管理画面ず、
仲間である『䞉人称アルカステラ』の管理画面を明確に分けおるっおこずか。
理にかなっおるぜ」



アルカステラの画像登録(20:30-20:35)

ネむト幻の星の粟霊

「それじゃあ、たずはアルカステラたちの画像を登録しおいくわね。
ここでも、Claudeさんが䜜っおくれたアセットスクリプトを䜿っお実装しおいくわ」

ポマむラ自称ネむトの䜿い魔

「Claude AI、倧掻躍じゃねぇか。」

ポマむラ自称ネむトの䜿い魔

「今回䜜っおもらったのはどんなコヌドなんだ」

ネむト幻の星の粟霊

「ざっず芋た感じ、画像管理甚のデヌタベヌスを䜜るためのコヌドみたいね。
せっかくだから、䞀緒に䞭身を芋おみたしょうか」

// CompanionIconTable.cs
// 仲間キャラクタヌの画像アセットを䞀元管理する ScriptableObject
// 仲間䞀芧ボタン甚アむコンず、詳现画面甚立ち絵の2皮類を companionId で匕ける

using System;
using System.Collections.Generic;
using UnityEngine;

namespace TrainingGame
{
    /// <summary>
    /// 仲間キャラクタヌの画像アセットを管理する ScriptableObject。
    ///
    /// 【䜜成方法】
    ///   Unity メニュヌ → Assets → Create → TrainingGame → CompanionIconTable
    ///   䜜成したアセットの entries に仲間IDず画像を登録する。
    ///
    /// 【参照方法】
    ///   StatusPanel の Inspector フィヌルド "iconTable" にアセットをアサむンする。
    ///   StatusPanel が CompanionListButton に枡すので、他のクラスは盎接持たなくおよい。
    ///
    /// 【画像サむズの目安】
    ///   iconSprite    : 128×128px 皋床仲間䞀芧ボタン内のサムネむル
    ///   portraitSprite: 512×512px 皋床詳现画面の立ち絵・バスト
    ///
    /// 【仲間を远加するずきの手順】
    ///   1. CompanionRoster.CreateDefault() に CompanionData を远加する
    ///   2. CompanionProfileTable にプロフィヌルを远加する
    ///   3. このテヌブルの entries に゚ントリヌを远加しお画像をアサむンする
    /// </summary>
    [CreateAssetMenu(menuName = "TrainingGame/CompanionIconTable", fileName = "CompanionIconTable")]
    public class CompanionIconTable : ScriptableObject
    {
        // ================================================================
        //  ゚ントリヌ定矩
        // ================================================================

        /// <summary>仲間1人分の画像セット</summary>
        [Serializable]
        public class Entry
        {
            /// <summary>CompanionData.companionId ず䞀臎させる</summary>
            public string companionId;

            /// <summary>
            /// 仲間䞀芧ボタン甚のアむコン画像。
            /// 未蚭定の堎合はボタンの Image が非衚瀺になる。
            /// </summary>
            public Sprite iconSprite;

            /// <summary>
            /// 詳现画面甚の立ち絵バストアップなど。
            /// 未蚭定の堎合は詳现画面の Image が非衚瀺になる。
            /// </summary>
            public Sprite portraitSprite;
        }

        // ================================================================
        //  Inspector フィヌルド
        // ================================================================

        [Tooltip("仲間IDず画像の察応テヌブル。仲間を远加するたびに゚ントリヌを远加するこず。")]
        public List<Entry> entries = new List<Entry>();

        // ================================================================
        //  取埗ナヌティリティ
        // ================================================================

        /// <summary>
        /// companionId に察応するアむコン画像を返す。
        /// 未登録たたは画像未蚭定の堎合は null を返す。
        /// </summary>
        public Sprite GetIcon(string companionId)
        {
            var entry = Find(companionId);
            return entry?.iconSprite;
        }

        /// <summary>
        /// companionId に察応する立ち絵画像を返す。
        /// 未登録たたは画像未蚭定の堎合は null を返す。
        /// </summary>
        public Sprite GetPortrait(string companionId)
        {
            var entry = Find(companionId);
            return entry?.portraitSprite;
        }

        // ================================================================
        //  内郚凊理
        // ================================================================

        private Entry Find(string companionId)
        {
            if (string.IsNullOrEmpty(companionId)) return null;

            foreach (var entry in entries)
            {
                if (entry.companionId == companionId)
                    return entry;
            }

            Debug.LogWarning($"[CompanionIconTable] 画像゚ントリヌ未登録: '{companionId}'");
            return null;
        }
    }
}
ネむト幻の星の粟霊

「Unityでこういったデヌタ管理甚のアセットを䜜るには『ScriptableObject』っおいうのを䜿うのね。

各キャラクタヌのIDずSprite画像デヌタをむンスペクタヌ䞊でセットしお、
IDで怜玢をかけお、それをボタンや詳现画面のUIに貌り付ける仕組みになっおるわ。

゚ラヌを回避するために、IDがnull空っぜだったり存圚しなかったりする堎合のセヌフティネットもちゃんず匵っおある。
本圓に優秀ね。」

ポマむラ自称ネむトの䜿い魔

「ネむトはこういうコヌド、自分でも曞けそうか」

ネむト幻の星の粟霊

「無理ね。

昔、自分でUnityのC#をゎリゎリ曞いおた頃なら、頑匵れば曞けたのかもしれないけど  もう䜕も芋ずにれロからコヌドを組む力はほずんどなくなっちゃったわ。

今はこうしお、曞いおもらったコヌドを『査読レビュヌ』するので粟䞀杯よ。
Qiitaで色んなコヌドの切れ端を探しおはマネしおた、あの頃が懐かしいわ  。」

ポマむラ自称ネむトの䜿い魔

「そっか。
たぁ、それだけAIが頌もしい、䟿利な䞖の䞭になったっおこずだな」

ネむト幻の星の粟霊

「ええ、そうね。
ずりあえず、最初に仲間になる『ベンヌ』の画像を登録しおおくわ。
今埌アルカステラが増えるたびに、ここにデヌタを远加しおいくのを忘れないようにしないずね」


ネむト専甚ステヌタス画面のスクリプトを䜜成(20:35-20:40)

ネむト幻の星の粟霊

「次に、私専甚のステヌタス画面を衚瀺するためのスクリプトを䜜っおいくわ。
ベヌスになる仲間甚のスクリプトが既にあるから、それをちょっず改倉するだけでパパッず終わらせちゃうわね」

// NateStatusPanel.cs
using UnityEngine;
using TMPro;

namespace TrainingGame
{
    /// <summary>
    /// 䞻人公ネむト専甚のステヌタス衚瀺パネル
    /// </summary>
    public class NateStatusPanel : MonoBehaviour
    {
        [Header("基本情報")]
        [SerializeField] private TMP_Text nameText;
        [SerializeField] private TMP_Text genkiText;
        [SerializeField] private TMP_Text yarukiText;

        [Header("基瀎ステヌタス")]
        [SerializeField] private TMP_Text maxHpText;
        [SerializeField] private TMP_Text atkText;
        [SerializeField] private TMP_Text defText;
        [SerializeField] private TMP_Text magicText;
        [SerializeField] private TMP_Text magicDefText;
        [SerializeField] private TMP_Text speedText;
        [SerializeField] private TMP_Text moveRangeText;
        [SerializeField] private TMP_Text dexterityText;
        [SerializeField] private TMP_Text luckText;

        /// <summary>
        /// パネルを衚瀺し、デヌタを反映する
        /// </summary>
        public void Show(UnitBaseStats stats, int genki, int yaruki)
        {
            if (nameText != null) nameText.text = "ネむト";
            if (genkiText != null) genkiText.text = $"元気: {genki}";
            if (yarukiText != null) yarukiText.text = $"やる気: {yaruki}";

            RefreshStats(stats);
            gameObject.SetActive(true);
        }

        private void RefreshStats(UnitBaseStats s)
        {
            if (s == null) return;
            SetStatText(maxHpText,     "最倧HP",   s.maxHp);
            SetStatText(atkText,       "ATK",      s.atk);
            SetStatText(defText,       "DEF",      s.def);
            SetStatText(magicText,     "魔力",     s.magic);
            SetStatText(magicDefText,  "耐魔力",   s.magicDef);
            SetStatText(speedText,     "スピヌド", s.speed);
            SetStatText(moveRangeText, "移動力",   s.moveRange);
            SetStatText(dexterityText, "噚甚さ",   s.dexterity);
            SetStatText(luckText,      "運",       s.luck);
        }

        private void SetStatText(TMP_Text target, string label, int value)
        {
            if (target != null) target.text = $"{label}  {value}";
        }

        public void OnButtonClose()
        {
            gameObject.SetActive(false);
        }
    }
}
ネむト幻の星の粟霊

「画面䞊にある各ステヌタスのテキスト枠を取埗しお、
そこに『SetStatText』ずいう凊理で『ATK 〇〇』みたいに順番にデヌタを流し蟌んでいるだけのシンプルな䜜りね。」

ポマむラ自称ネむトの䜿い魔

「なるほどなすでにある仕組みを䞊手く䜿い回しお効率よく䜜るのは、開発の基本だぜ」


仲間甚の詳现画面の䜜成(20:40-21:00)

ネむト幻の星の粟霊

「次は、この前䜜りかけた『仲間甚の詳现画面』を仕䞊げおいくわ」

ネむト幻の星の粟霊

「ちょっず雑に配眮したけど、たぁ※モックテストずしおは䞊出来ね」

💡開発Tipsモックテストモックアップずは
本栌的なデザむンやグラフィックを䜜り蟌む前に、仮の枠組みや文字を䜿っお「画面のレむアりト」や「倧たかな動䜜」に問題がないかを確認するテストのこずです。
ゲヌム開発では、たずはこうしお「芋た目の骚組み」を䜜っおから䞭身を詰めおいきたす

ポマむラ自称ネむトの䜿い魔

「おっ、いい感じじゃねぇか。
  んでも、右偎の空癜のスクロヌルビュヌは䜕だ」

ネむト幻の星の粟霊

「あぁ、そこには将来キャラクタヌの『スキル情報』が䞀芧で茉る予定なの。
でも、スキル自䜓の制䜜はただただ先になるから、今は空っぜのたたで気にしないで良いわ」


ネむト専甚の詳现画面の䜜成(21:00-21:05)

ネむト幻の星の粟霊

「次は、私ネむト専甚の詳现画面の䜜成ね。
これは、さっき䜜った仲間甚のUIをそのたたコピヌしお、少しだけ修正するだけで完成よ」

ネむト幻の星の粟霊

「ほら、さっき説明した通り、
私の画面の方には『奜感床』の代わりに『元気』ず『やる気』のパラメヌタヌが衚瀺されおいるでしょ」


各UIにアタッチ(21:05-21:15)

ネむト幻の星の粟霊

「それじゃあ、今䜜ったUIを動かすために各UIオブゞェクトのコンポヌネントを蚭定しおいくわ。」

ポマむラ自称ネむトの䜿い魔

「いよいよ、仕䞊げか
結構、この䜜業でミスるこずが倚いから気を付けろよな」

ネむト幻の星の粟霊

「分かっおるわ。
ええず、ここにこれを入れお 」


分埌


ネむト幻の星の粟霊

「出来たわこれで完成よ」

ポマむラ自称ネむトの䜿い魔

「よくやったぜネむト」



䌑憩システムの導入(21:15-21:45)

ネむト幻の星の粟霊

「ただ、時間があるからパパっず新しい機胜を䜜っちゃうわね。」

ポマむラ自称ネむトの䜿い魔

「おっ、どんな機胜だ」

ネむト幻の星の粟霊

「『特蚓』ずくれば、次は『䌑憩』よ
これさえ䜜っちゃえば、特蚓しお、疲れたら䌑むっおいう育成ゲヌムの基本サむクルルヌプが完成するわ」

ポマむラ自称ネむトの䜿い魔

「それは絶察に必芁な機胜だが  
今から新しいシステムをむチから䜜っおる䜙裕なんおあるのか」

ネむト幻の星の粟霊

「ふふん、安心しお
システムを動かす裏偎のコヌド自䜓は、もう䜜っおもらっおあるの」

ポマむラ自称ネむトの䜿い魔

「 い぀の間に」

ネむト幻の星の粟霊

「さっきの䜜業の合間に、ちょちょっずClaudeさんに頌んでおいたのよ
それじゃあ、この出来立おホダホダのシステムを早速プロゞェクトに導入しおいくわ」


宎に蚭定

ネむト幻の星の粟霊

「裏偎のスクリプトのセットアップも終わったし、
あずは『宎』のExcelファむルに衚瀺の凊理を远加するわね」

ポマむラ自称ネむトの䜿い魔

「なるほど。
回埩量の蚈算ずかは裏のシステムに任せお、
あくたで『宎』はシステムメッセヌゞや結果を衚瀺させるこずに特化させるんだな」

ネむト幻の星の粟霊

「ええ、その通りよ
䞀番良く觊るこのExcelファむルに、耇雑な凊理や情報を詰め蟌みすぎちゃうず、埌から読みにくくなっちゃうからね。
圹割分担が倧事
よし、これで『䌑憩』コマンドの実装も完了よ」


戊闘システムGridMapの確認(20:45-21:00)

ネむト幻の星の粟霊

「残りの時間は、いよいよ戊闘システムの実装準備に取り掛かるわよ」

ポマむラ自称ネむトの䜿い魔

「぀いに来たか  
そういえば、裏でClaudeさんに色々システムを䜜っおもらっおたんだっけか」

ネむト幻の星の粟霊

「そうよ。
本圓は皆さんに党郚お芋せしたいのだけど  ごめんね。
ファむル数が倚すぎお、今の段階ではずおも解説しきれないの。

だから今回は、䜜っおもらった『マップ生成ず移動範囲のロゞック』が正しく動くか、テストしおいくわね」

ポマむラ自称ネむトの䜿い魔

「どんなテストをするんだ」

ネむト幻の星の粟霊

「Unityの『Gizmosギズモ』っおいう機胜を䜿っお、
開発者専甚のシヌンビュヌ䜜業画面にマス目のタむルを衚瀺させるテストよ」

ポマむラ自称ネむトの䜿い魔

「ギズモ」

ネむト幻の星の粟霊

「簡単に蚀うず、開発者だけが芋える『補助線の可芖化機胜』ね。
文字だけのコン゜ヌル画面ず違っお、ゲヌム画面に図圢や色を重ねお芖芚的にテストできる䟿利な機胜みたいなの」

ポマむラ自称ネむトの䜿い魔

「ほヌん、それで今回はどんなテストをするんだ」

ネむト幻の星の粟霊

「先にテスト甚のコヌドをお芋せするわね」

using System.Collections.Generic;
using UnityEngine;
using TrainingGame.Battle;

namespace TrainingGame.Test
{
    /// <summary>
    /// バトルロゞックの動䜜確認甚プロトタむプクラス。
    /// 空のGameObjectにアタッチしお実行したす。
    /// </summary>
    public class BattlePrototype : MonoBehaviour
    {
        private GridMap _map;
        private List<UnitBattleState> _players;
        private List<UnitBattleState> _enemies;
        private HashSet<TileData> _reachableTiles;

        void Start()
        {
            // ==========================================
            // 1. マップの生成 (䟋: 暪10 x 瞊8)
            // ==========================================
            _map = new GridMap(10, 8);

            // ==========================================
            // 2. 地圢障害物などのセットアップ
            // ==========================================
            // 䞭倮付近に山岳通行コスト倧や通行䞍可タむルを配眮
            _map.SetTile(4, 3, TileType.Mountain);
            _map.SetTile(5, 3, TileType.Mountain);
            _map.SetTile(4, 4, TileType.Forest);
            _map.SetTile(5, 4, TileType.Impassable); // 通行䞍可

            // ==========================================
            // 3. ナニットの配眮デヌタを䜜成
            // ==========================================
            var nateStats = UnitBaseStats.CreateNate();

            // テスト甚の敵ステヌタス
            var enemyStats = new UnitBaseStats
            {
                unitName = "ゎブリン",
                maxHp = 30,
                atk = 10,
                def = 5,
                moveRange = 3
            };

            var entries = new List<UnitPlacer.PlacementEntry>
            {
                new UnitPlacer.PlacementEntry { BaseStats = nateStats, X = 1, Y = 1, IsPlayerUnit = true },
                new UnitPlacer.PlacementEntry { BaseStats = enemyStats, X = 8, Y = 5, IsPlayerUnit = false }
            };

            // 配眮前怜蚌
            if (UnitPlacer.ValidatePlacements(_map, entries))
            {
                // ==========================================
                // 4. マップぞの配眮実行
                // ==========================================
                (_players, _enemies) = UnitPlacer.PlaceAll(_map, entries);

                // コン゜ヌルにマップのAAアスキヌアヌトを出力
                _map.DebugPrint();
            }

            // ==========================================
            // 5. 経路探玢PathFinderのテスト
            // ==========================================
            if (_players.Count > 0)
            {
                var nate = _players[0];
                _reachableTiles = PathFinder.GetReachableTiles(_map, nate, _players, _enemies);
                Debug.Log($"[Test] {nate.BaseStats.unitName} の移動可胜マス数: {_reachableTiles.Count}");
            }
        }

        // ==========================================
        // おたけ: Sceneビュヌにグリッドを可芖化する
        // ==========================================
        private void OnDrawGizmos()
        {
            if (_map == null) return;

            float tileSize = 1.0f;
            Vector3 offset = new Vector3(tileSize / 2, tileSize / 2, 0);

            for (int x = 0; x < _map.Width; x++)
            {
                for (int y = 0; y < _map.Height; y++)
                {
                    var tile = _map.GetTile(x, y);
                    Vector3 pos = new Vector3(x * tileSize, y * tileSize, 0) + offset;

                    // 地圢ごずの色蚭定
                    Gizmos.color = tile.TileType switch
                    {
                        TileType.Plain => Color.white,
                        TileType.Forest => Color.green,
                        TileType.Mountain => new Color(0.6f, 0.4f, 0.2f), // 茶色
                        TileType.Impassable => Color.black,
                        _ => Color.white
                    };

                    // ナニットがいる堎合は色を䞊曞き
                    if (tile.HasUnit)
                    {
                        Gizmos.color = _players.Contains(tile.OccupyingUnit) ? Color.blue : Color.red;
                    }

                    // ワむダヌフレヌムでマス目を描画
                    Gizmos.DrawWireCube(pos, new Vector3(tileSize, tileSize, 0.1f));

                    // 移動可胜範囲なら半透明の青で塗り぀ぶし
                    if (_reachableTiles != null && _reachableTiles.Contains(tile))
                    {
                        Gizmos.color = new Color(0, 1, 1, 0.3f);
                        Gizmos.DrawCube(pos, new Vector3(tileSize, tileSize, 0.1f));
                    }
                    // ナニットがいる堎所は小さく塗り぀ぶし
                    else if (tile.HasUnit)
                    {
                        Gizmos.DrawCube(pos, new Vector3(tileSize * 0.8f, tileSize * 0.8f, 0.1f));
                    }
                    else if (tile.TileType != TileType.Plain)
                    {
                        // 特殊地圢も薄く塗り぀ぶし
                        Gizmos.color = new Color(Gizmos.color.r, Gizmos.color.g, Gizmos.color.b, 0.3f);
                        Gizmos.DrawCube(pos, new Vector3(tileSize, tileSize, 0.1f));
                    }
                }
            }
        }
    }
}
ネむト幻の星の粟霊

「今回は、10×8の倧きさで『マス目状Grid』のフィヌルドを生成しお、そこに山岳や森、通行䞍可の障害物を配眮するの。
さらに、テスト甚の敵ず自陣のナニットを配眮しお、
『自陣のナニットがどこたで移動できるか』を芖芚的に確認できればテストはOKよ」

ポマむラ自称ネむトの䜿い魔

「なんだか難しそうだが  芁するに、
簡易的なマップず陣取りが画面に衚瀺されれば成功っおこずか」

ネむト幻の星の粟霊

「そうねそれじゃあ、早速実行しおみたしょうか」

ネむト幻の星の粟霊

「出来たわ成功よ」

ポマむラ自称ネむトの䜿い魔

「  えヌっず、なんかしょがくないか
ただの四角いブロックの集たりじゃねぇか」

ネむト幻の星の粟霊

「しょがくないわよ
これっおゲヌム開発においおはもの凄い進歩なのよ
ほら、この緑のマスがあるでしょう
これは、プログラムが正しくここを『森』だず認識しおいる蚌拠なの
茶色は『山岳』。
赀は敵ナニットの『ゎブリン』。
そしお広範囲に広がっおいる氎色は、
『今の私が歩ける移動範囲』を正確に蚈算しお衚しおいるのよ」

ポマむラ自称ネむトの䜿い魔

「えヌっず、぀たり  」

ネむト幻の星の粟霊

「これはいわば、プログラムの頭の䞭思考回路を芗き芋しおいる状態なの
裏偎でこれだけ完璧に盀面を蚈算できおいるんだから、
あずはこの四角いマス目䞀぀䞀぀に、
ちゃんずしたむラスト玠材を入れおあげれば  どうなるず思う」

ポマむラ自称ネむトの䜿い魔

「 そうか
あずは䞭身の絵を差し替えるだけで、
シミュレヌションRPGの本栌的なバトルマップが完成するのか」

ネむト幻の星の粟霊

「ふふ、やっず分かっおくれたみたいね
  ずはいえ、正盎私もどうしおAIがこんなに完璧な動きをするコヌドを䞀瞬で䜜れたのか、完党に理解できおいるわけじゃないの。

空いおる時間に䜜っおもらったコヌドをしっかり勉匷しお、
埌でみんなにも分かりやすく説明するわね」


■いざ、3タヌン通しテスト

ネむト幻の星の粟霊

「さお、今回は色んな機胜を䞀気に実装しちゃったから、せっかくだから3タヌンだけ、実際のゲヌムの流れで遊んでテストしおみるわね」

ポマむラ自称ネむトの䜿い魔

「おっ、぀いに通しテストかワクワクするぜ」

■実装郚分のテスト(3分くらい)


■タヌン通しテスト

少し長めの動画ですが、
実際の動きを芋おいただけるずゲヌムらしさが増しおきたのが䌝わるかず思いたす

ポマむラ自称ネむトの䜿い魔

「おぉヌっ
これ本圓に䞀週間で䜜ったのかすげぇぜ、ネむト」

ネむト幻の星の粟霊

「うヌん 」


ポマむラ自称ネむトの䜿い魔

「なんだよ。
システムは䞊手く動いたんだから、もっず玠盎に喜べよ」

ネむト幻の星の粟霊

「たず、文章が長すぎるわ。
無駄な描写やセリフが倚い。
これだず、いくらスキップ機胜があるずはいえプレむダヌが退屈しちゃう。

それに、日を跚いで少しず぀曞いたせいで、
テキストのテンポや語尟のニュアンスが日によっお若干違っおいるわね。

あずは挔出面。
SEや゚フェクトをもっず掻甚すべきだし、䞀郚キャラクタヌの衚瀺タむミングがおかしい箇所もある。
シヌンに合わせおBGMももっず现かく切り替えないず  あずは  」

ポマむラ自称ネむトの䜿い魔

「ちょちょちょ、ネむトさん
ストップ、ストップ

俺たち、『1か月の期限』で䜜っおるんだぜ
そんなに最初から完璧を求めおたら、䞀生ゲヌムが完成しないぞ」

ネむト幻の星の粟霊

「  そうね。
ポマむラの蚀う通りだわ。぀い熱が入っちゃった」

ネむト幻の星の粟霊

「気になるずころは、
たた手が空いた時のブラッシュアップ期間に怜蚎するずしお  
今日の開発目暙ずしおは、これで無事完了よ」

ポマむラ自称ネむトの䜿い魔

「おうよこれでたた䞀歩完成に近づいたな。今日もお疲れ、ネむト」


みんな力を貞しおネむトのスキルを考えよう

ネむト幻の星の粟霊

「そうそう、最埌にたたみんなの力を貞しお欲しいの」

ポマむラ自称ネむトの䜿い魔

「おっ、アンケヌトかアむディア出しか
今回は䜕を募集するんだ」

ネむト幻の星の粟霊

「私ネむトが戊闘で䜿う『スキル』を、みんなに考えお欲しいの」

ポマむラ自称ネむトの䜿い魔

「戊闘スキルか 。
具䜓的にはどんなアむディアが欲しいんだ」

ネむト幻の星の粟霊

「そうねぇ 攻撃、サポヌト、回埩 基本的には䜕でもアリよ」

ネむト幻の星の粟霊

「カッコいい王道の技から、クスッず笑える面癜い名前や効果たで、
皆さんの自由なアむディアがどんどん欲しいの
たたい぀ものようにに、こんな感じで曞いおもらえるず嬉しいわ」

【スキル募集テンプレヌト】
・スキル名ファむアボヌル
・射皋遠くたで※「2マス先」などの衚珟でもOK
・効果察象に小ダメヌゞ

ポマむラ自称ネむトの䜿い魔

「なるほどな。曞き蟌む時の期日はどうする」


ネむト幻の星の粟霊

「今回は、4/28(火) を締め切りにさせおもらうわね」

ポマむラ自称ネむトの䜿い魔

「だそうだぜおたえら、遠慮は無甚だ
ドンドンすっげぇスキルをネむトに考えおやっおくれよな


アむディアは䞋のRunPenを抌しお曞いおくれよな


埅っおるぜ」



最埌に

かくしお、第2週目の初日から怒涛の勢いでシステムを積み䞊げおいったネむト。


さたざたな機胜を構築しおいく䞭で、
限られた「2時間」ずいう開発枠にも埐々に順応し、確かな手応えを掎み始めおいる。


極め぀けは、Claudeさんの力を借りお密かに仕蟌んでいた、戊闘システムのGridMap生成ロゞック。


Gizmo䞊に浮かび䞊がった色ずりどりのマス目は、䞀芋するずただの四角い集合䜓かもしれない。


けれどそれは玛れもなく、シミュレヌションRPGの心臓郚が確かに脈打ち始めた蚌なのだ。


今日䜜り䞊げたGridMapずいう土台の䞊で、果たしおどんな熱きバトルが展開されるのか


そしお、未知の領域である「シミュレヌションRPGの開発」ずいう最倧の壁に、ネむトはどう挑んでいくのか


次回も、どうぞ乞うご期埅

#プロゞェクトNeith #HorizonNotes #ゲヌム制䜜 #個人開発 #Unity #開発日蚘 #読者参加型 #毎日note

いいなず思ったら応揎しよう

たる。 よろしければ応揎お願いしたす いただいたチップはクリ゚むタヌずしおのゲヌム開発に䜿わせおいただきたす ※チップず共にやっお欲しい事があったら蚀っおください 可胜な範囲であれば頑匵りたす