WindowsFormsとUnityの具体的な開発比較

手順の比較

Windows Forms

フォームの作成

Windows Formsアプリケーションでは、フォーム(ウィンドウ)を作成して、ユーザーインターフェースを構築します。フォームは主要なコンテナであり、ユーザーインターフェースコントロール(ボタン、テキストボックス、ラベルなど)を含むことができます。

コントロールの追加

フォームにコントロールを追加するには、コントロールをフォームにドラッグアンドドロップするか、コードでコントロールを作成してフォームに追加します。

プロパティとイベント

コントロールはプロパティとイベントを持っており、プロパティを設定して外観や動作をカスタマイズし、イベントをハンドルしてユーザーの操作に応答します。

Unity

ゲームオブジェクトの作成

Unityでは、ゲームオブジェクトを作成してシーン内に配置します。ゲームオブジェクトは、3Dモデル、2Dスプライト、カメラ、ライトなど、ゲーム内のすべての要素を表します。

コンポーネントの追加

ゲームオブジェクトにはコンポーネントを追加できます。コンポーネントは、スクリプト、コライダ、レンダラ、アニメータなど、ゲームオブジェクトの機能を拡張します。

スクリプトの作成

Unityでは、C#を使用してスクリプトを作成し、ゲームオブジェクトにアタッチすることで振る舞いを制御します。スクリプトは、イベントハンドリングやオブジェクトの操作に使用されます。

フレームワークとエディタ

Unityはゲーム開発用の総合的なフレームワークであり、ゲームオブジェクトの配置、シーンの管理、アセットのインポートなど、さまざまなツールを提供します。Unityエディタは、シーンを視覚的に編集するための強力なツールです。

要約すると、Windows Formsはデスクトップアプリケーションの開発に使用され、Windowsユーザーインターフェースを作成します。一方、Unityはゲーム開発に使用され、3Dまたは2Dのゲームワールドを構築し、ゲームオブジェクトを操作します。両方のプラットフォームは異なる用途に特化しており、それぞれの開発スタイルとツールセットが必要です。

オブジェクトモデルの比較

Windows Forms

Windows Formsは、Microsoft .NETフレームワークを使用してデスクトップアプリケーションを開発するためのライブラリです
Windows Formsのオブジェクトモデルは、ウィンドウベースのユーザーインターフェースを作成するのに使用されます
以下は、Windows Formsの主要なオブジェクトと概念です

Form(フォーム)

Formは、ウィンドウを表すオブジェクトで、アプリケーションのメインウィンドウやダイアログボックスなどのウィンドウユーザーインターフェースを表示します

Control(コントロール)

Controlは、ユーザーインターフェースの要素を表すオブジェクトで、ボタン、テキストボックス、ラベルなどが含まれます。これらのコントロールはForm上に配置されます

Event Handling(イベントハンドリング)

Windows Formsでは、ユーザーインタラクションやシステムイベントに対応するために、イベントハンドラを使用します
ボタンクリックなどのイベントに応答してアプリケーションの動作を制御できます

Layout(レイアウト)

コントロールの配置とサイズ調整は、Layout管理を使用して行われます
FlowLayout、TableLayout、Anchor、Dockなどのレイアウトマネージャが提供されています

Unity

Unityは、3Dおよび2Dゲーム開発のための統合開発環境であり、ゲームエンジンでもあります。Unityのオブジェクトモデルは、ゲームオブジェクトとコンポーネントに基づいています。以下は、Unityの主要なオブジェクトと概念です

Scene(シーン)

Unityのシーンは、ゲームの特定の部分やステージを表すもので、複数のGameObjectとコンポーネントが配置されます。シーンは、ゲームの異なる状態やレベルを表現します。

イメージコード
class Scene
{
    public  List<GameObject> GameObjects { get; set; }
}

GameObject(ゲームオブジェクト)

GameObjectは、シーン内のオブジェクトを表す基本的な存在です。ゲームオブジェクトには、3Dモデル、カメラ、ライト、サウンド、スクリプトなどのコンポーネントがアタッチされます。

イメージコード
class GameObject
{
    public List<Component> Components { get; set; }
}

Component(コンポーネント)

コンポーネントは、GameObjectに機能を追加するためのモジュールです。例えば、Transformコンポーネントは位置、回転、スケールを管理し、Scriptコンポーネントはカスタムスクリプトをアタッチして動作を制御します。

イメージコード(Transformコンポーネントの場合)
class Transform : Component
{
    public Vector3 position { get; set; }

    public void Translate (float x, float y, float z)
    {
        // 移動するコード
    }
}
イメージコード(BoxColliderコンポーネントの場合)
class BoxCollider : Collider
{
}

ColliderクラスはさらにComponentクラスを継承しています

class Collider : Component
{
}

Physics(フィジックス)

Unityは物理エンジンを統合しており、物理演算をサポートします。Rigidbodyコンポーネントを使用して、物理的な振る舞いをゲームオブジェクトに追加できます。

Windows FormsとUnityは、異なる種類のアプリケーションを開発するために使用されるため、オブジェクトモデルも異なります。Windows FormsはデスクトップアプリケーションのGUIを構築するために設計されており、Unityはゲーム開発に特化しています。したがって、それぞれのフレームワークは異なる目的に使用され、異なるアーキテクチャとオブジェクトモデルを持っています。

イメージコード
class Rigidbody : Component
{
    // 重力の有効、無効設定
    public bool useGravity { get; set; }
}

UnityのGameObject(ゲームオブジェクト)の考え方

オブジェクトの基本単位

GameObjectは、Unityエンジン内で操作されるすべての要素やオブジェクトの基本単位です。これは、3Dモデル、2Dスプライト、カメラ、ライト、音声エフェクト、スクリプトなど、シーン内で使用されるあらゆるものを表すために使用されます。

コンポーネントベースのアーキテクチャ

GameObjectは、コンポーネントベースのアーキテクチャで構築されています。つまり、GameObjectは他のコンポーネントをアタッチして機能を追加できる容器のような存在です。これにより、GameObjectは非常に柔軟で、異なるタイプのコンポーネントを組み合わせて、さまざまな機能を持つオブジェクトを作成できます。

座標、回転、スケール(Transformコンポーネント)

GameObjectは、3D空間内での位置、回転、スケールを持っています。これらの属性は、オブジェクトの位置と姿勢を制御するために使用されます。例えば、GameObjectの座標を変更すると、オブジェクトはシーン内で移動します。

全てのゲームオブジェクトに存在する唯一のコンポーネントです

階層構造(ヒエラルキー)

GameObjectは、シーン内で階層構造を形成します。つまり、親GameObject内に子GameObjectを配置できます。この階層構造を使用することで、オブジェクト間の親子関係を定義し、階層内での変換や操作を効果的に管理できます。

ライフサイクル

GameObjectは、Unityのライフサイクルに組み込まれており、シーン内での初期化、アップデート、破棄などのイベントに応答できます。これにより、オブジェクトの振る舞いを時間に応じて変更できます。

using UnityEngine;

public class Test : MonoBehaviour
{
    // Startは最初のフレームが更新される前に呼び出されるイベント
    void Start()
    {

    }

    // 更新は1フレームにつき1回呼び出されるイベント
    void Update()
    {

    }
}

イベントとコンポーネント通信

GameObjectは、イベントやメッセージングを介してコンポーネント間で通信するための手段を提供します。例えば、1つのGameObjectにアタッチされたスクリプトが別のGameObjectのスクリプトと情報を共有し、協力して動作することができます。

Unityエンジンが制御する場合

インスタンスの作成は、エンジン内部でコード化
WindowsFormsアプリでデザインフォームにアイテムボックスからコンポーネントをドラッグ&ドロップするようなもの

using UnityEngine;

public class MyClass : MonoBehaviour
{
    void Start()
    {
        GetComponent<OtherClass>().Show();
    }
}
using UnityEngine;

public class OtherClass : MonoBehaviour
{
    public void Show()
    {
        Debug.Log("メソッドが呼ばれた");
    }
}

実行結果

メソッドが呼ばれた

独自のクラスを使う場合

インスタンスの作成は、new キーワードで行います

using UnityEngine;

public class MyClass : MonoBehaviour
{
    void Start()
    {
        OtherClass otherClass = new OtherClass();

        int result = otherClass.Add(1, 2);

        Debug.Log(result);
    }
}
public class OtherClass
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

実行結果

3

シーン管理

GameObjectはシーン内に配置され、シーンの一部として管理されます。シーンはプロジェクト内で異なるゲームレベル、画面、エリアなどを表し、GameObjectはそれらのシーン内で配置されてゲームオブジェクト階層を構築します。

総括すると、UnityのGameObjectはゲーム開発において中心的な役割を果たし、シーン内でのオブジェクトの表現、コンポーネントのアタッチ、コミュニケーション、座標操作、ライフサイクル管理など、多くの重要な機能を提供します。開発者はこれらのGameObjectを使用して、豊かなゲーム体験を作成できます。