【学習】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・攻撃・回復・上限の考え方)EnemyBattleManager(ターゲット・攻撃/回復・勝利判定)
これらは WinForms の using に依存しない形にしておくと、そのまま Unity プロジェクトの Scripts フォルダに置きやすいです(System や System.Collections.Generic だけで動く状態が理想です)。
いったん捨てる(Unity で置き換える)
Form1、Form1.Designer.csLabel/Button/RadioButtonの名前と配置(Unity では Canvas + uGUI や UI Toolkit で別途作る)
捨てる=考え方が無駄、ではありません。 「画面に数字を出す」「ボタンで1アクション起こす」という 役割は、Unity の UI で同じように作り直します。
対応関係一覧(シリーズのおさらい)
| WinForms(第1〜4回) | 役割 | Unity(イメージ) |
|---|---|---|
Form1_Load |
戦闘開始時にデータを用意する | Start() や独自の Initialize()、シーン読み込み直後の1回 |
btnAction_Click |
プレイヤーが「決定」したタイミングで1手進める | UI Button の onClick、または入力確定時の処理 |
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フレームだけ」など 条件付きにする(入力の取得)- キー入力は 旧
InputAPI ではなく Input System で統一するのが本講義の方針です(例:Keyboard.currentのwasPressedThisFrame、または 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入門シリーズ から本格的に深掘りできます