学習記事一覧 · WinFormsRPG

【学習】WinFormsで作るRPG入門(5)Unity に移植するときの対応関係まとめ 〜シリーズの締め〜

第4回 までで、戦闘のルールPlayer / Enemy / BattleManager にまとまり、Form1入力と表示に薄くできました。

この第5回は 新しい機能をほとんど増やさず、WinForms で書いたものを Unity に持っていくときの 対応関係置き場所の考え方だけを整理します。シリーズの 締めの総括として読んでください。


今回の最小ゴール

  • 持っていくクラスUnity 側に新しく書く層を言葉で切り分けられる
  • 第1〜4回の処理が、Unity で どのタイミング・どの API に相当するかを表で追える
  • 「Unity だと全部 MonoBehaviour に書く」という 誤解を減らす

前回からの差分

第4回 第5回
WinForms 上で完結 **別エンジン(Unity)**への持ち方・対応表が中心
コードは BattleManager まで 主に 説明と対応表(コピー対象の目安)

持っていくもの/いったん捨てるもの

持っていく(ロジックの核)

  • Player(HP・攻撃・回復・上限の考え方)
  • Enemy
  • BattleManager(ターゲット・攻撃/回復・勝利判定)

これらは WinForms の using に依存しない形にしておくと、そのまま Unity プロジェクトの Scripts フォルダに置きやすいです(SystemSystem.Collections.Generic だけで動く状態が理想です)。

いったん捨てる(Unity で置き換える)

  • Form1Form1.Designer.cs
  • Label / Button / RadioButton の名前と配置(Unity では Canvas + uGUI や UI Toolkit で別途作る)

捨てる=考え方が無駄、ではありません。 「画面に数字を出す」「ボタンで1アクション起こす」という 役割は、Unity の UI で同じように作り直します。


対応関係一覧(シリーズのおさらい)

WinForms(第1〜4回) 役割 Unity(イメージ)
Form1_Load 戦闘開始時にデータを用意する Start() や独自の Initialize()、シーン読み込み直後の1回
btnAction_Click プレイヤーが「決定」したタイミングで1手進める UI ButtononClick、または入力確定時の処理
rdoAttack / rdoHeal いま選んでいるコマンド Toggle 群、ドロップダウン、または enum + キー割り当て
UpdateUI 状態 → 画面の文字 Text / TextMeshPro / UI Toolkit で 表示だけ更新
Player / Enemy データと自分に関する処理 そのまま 通常の C# クラスとして利用可(MonoBehaviour である必要なし)
BattleManager 戦闘の進行 同様に 通常の C# クラスがおすすめ(テストしやすい)

ポイント: Unity に来て変わりやすいのは 「いつ・どの入力で」 処理が動くかと 「どう描画するか」 です。HP が減る・ターゲットが進むなどのルールは、第4回までのクラスに近い形で残せます。


フォルダと役割のおすすめ(最小)

Unity プロジェクト内の例です(名前は任意)。

置き場所(例) 中身
Scripts/Battle/ Player.cs / Enemy.cs / BattleManager.cs(WinForms 版から WinForms 専用参照を削ったもの
Scripts/UI/ 画面と入力だけの MonoBehaviour(ボタンから battle.DoAttack() を呼ぶ等)

橋渡し用の MonoBehaviour は薄くするイメージです。

using System.Collections.Generic;
using UnityEngine;

// 例: 戦闘 UI から BattleManager を呼ぶだけのイメージ(教材用・抜粋)
public class BattleScreen : MonoBehaviour
{
    BattleManager battle;

    void Start()
    {
        var player = new Player("勇者", 100, 20);
        var enemies = new List<Enemy>
        {
            new Enemy("スライムA", 30),
            new Enemy("スライムB", 40),
            new Enemy("ゴブリン", 60),
        };
        battle = new BattleManager(player, enemies);
        RefreshView();
    }

    public void OnAttackButton()
    {
        battle.DoAttack();
        RefreshView();
    }

    public void OnHealButton()
    {
        battle.DoHeal();
        RefreshView();
    }

    void RefreshView()
    {
        // ここで TMP や UI のテキストに battle.Player.Hp などを代入する
    }
}

実際のプロジェクトでは、1ボタン1メソッドにするか、enum でコマンドを渡すかは好みでよいです。BattleManager をいじらず、呼び出し側だけ Unity 用に増やすと分かりやすいです。


Update() との関係(誤解しやすいところ)

Unity の Update()毎フレーム呼ばれます。WinForms の ボタン Click は「押したときだけ」です。

  • **ターン制 RPG の「1手」**は、WinForms では Click に対応しやすい
  • Unity でも ボタンイベントに DoAttack を載せれば、第4回と同じ発想です
  • Update() に書くなら、「キーを押したその1フレームだけ」など 条件付きにする(入力の取得
  • キー入力は Input API ではなく Input System で統一するのが本講義の方針です(例: Keyboard.currentwasPressedThisFrame、または PlayerInput とコールバック)

つまり Update = Form のメインループではなく、「連続的に動かすもの」用のタイミングと理解すると混乱が減ります。


よくある誤解

「Unity では全部 MonoBehaviour に書くのが正しい」

  • 表示・入力・シーンに乗せるものMonoBehaviour 向きです。
  • ルール・計算・データの持ち方は、BattleManager のような 普通のクラスに分けた方が、WinForms で学んだ分離がそのまま活きます。

「WinForms で書いた時間が無駄になる」

  • イベントで1手進める状態をクラスに持つUI は薄くするという流れは、Unity でもそのまま応用できます。

次の学習(Unity 側の公式ルート)

本リポジトリでは、次の順で足場を固めるとスムーズです。

内容 記事(目次)
スクリプトの付け方 C# スクリプトの作成とアタッチ
UI に文字・ボタン UI(Canvas)の基本
キー入力 入力の取得

全体の流れは Unity入門シリーズ の目次を参照してください。


授業・ブログ向けの伸ばし方(任意)

  • スライド用: この回の「対応関係一覧」の表だけを1枚に抜き出す
  • ミニ課題: BattleManager防御敵の1回だけ反撃を足す(ルールはマネージャ、表示は UI スクリプト)

シリーズ全体の目次

WinFormsでRPG入門 〜Unityへ繋がる設計の考え方〜(固定ページ)


まとめ

  • ロジックPlayer / Enemy / BattleManager)は Unity にも 持ち込みやすい
  • フォームとコントロールは Unity の UI と入力に置き換える
  • 橋渡し用 MonoBehaviour を薄く保つと、WinForms で学んだ構造がそのまま見える
  • これで 第1回〜第5回の流れは一区切り。Unity は Unity入門シリーズ から本格的に深掘りできます