Unityに関連する記事です

1.クラスとインスタンスの違い:身近な例で理解しよう


 まず、クラスとインスタンスの違いについて理解するために、身近な例で説明します。

 クラスは「設計図」のようなもので、特定のオブジェクトの基本的な特性や振る舞いを定義しています。

 例えば、あるゲームの敵キャラクターの「設計図」を作るとします。
この「設計図」(クラス)では、敵キャラクターの基本的な特性(例:体力、攻撃力、防御力など)や振る舞い(例:移動方法、攻撃方法など)を定義します。

 一方、インスタンスはこの「設計図」を元に作成された「具体的なオブジェクト」です。
敵キャラクターの「設計図」を元に、具体的な敵キャラクター(インスタンス)を作り出すことができます。
そして、この具体的な敵キャラクター(インスタンス)それぞれは、自分自身の状態(例:現在の体力、位置など)を保持します。

 そのため、同じ設計図であるクラスからインスタンスは作成されますが、それぞれが異なるオブジェクトであるため、
現在の体力や位置の情報などを、別々に管理することが出来ます。

 敵キャラクターの場合であれば、これにより、1つのクラスから、同じ見た目と設定を持つ、異なる値を持つ敵キャラクターを作ることが出来ます。


2.インスペクターでインスタンスを理解する:Debug モードの活用


 Unityのインスペクターでは、オブジェクトの詳細情報を見ることができます。
このインスペクターを使って、クラスとインスタンスの違いを理解しましょう。

 インスペクターの右上にある、縦型の「…」のアイコンをクリックし、「Debug」を選択すると、インスペクターがDebugモードに切り替わります。
あるいは、Inspector タブの上で右クリックをしてメニューを開いても選択できます。



―跳燭痢屐帖廚離▲ぅ灰鵑鬟リックし、「Debug」を選択する



Inspector タブの上で右クリックをしてメニューを開いて、「Debug」を選択する





 このモードでは、オブジェクトのインスタンスIDが表示されます。
このIDは、Unityが内部で管理するオブジェクトの一意の識別子で、インスタンスそれぞれが異なるIDを持ちます。

 また private 修飾子で宣言している変数についても表示されます。活用しましょう。


通常のインスペクター(Normal)



Debug モードのインスペクター




 一度 Debug を選択すると、自動的には元の表示状態に戻りません
元の表示に戻したい場合には、再度、メニューから「Normal」を選択することで通常のインスペクターの表示に戻ります。



縦型の「…」のアイコンをクリックするか、Inspector タブの上で右クリックをしてメニューを開いて、「Debug」を選択する




3.エディターでインスタンスIDを取得する:GetInstanceIDメソッドの活用


 UnityのC#スクリプト内から、オブジェクトのインスタンスIDを取得することも可能です。

 以下に、そのサンプルコードを示します。


using UnityEngine;

public class GetInstanceIDExample : MonoBehaviour
{
    void Start()
    {
        Debug.Log("インスタンスID: " + this.GetInstanceID());
    }
}

 このスクリプトをUnityのゲームオブジェクトに付けて実行すると、そのゲームオブジェクトのインスタンスIDが Console ビューに表示されます。


Console ビューとDebug モードのインスペクター



 このように インスタンスIDが同じ値であることが分かります。



 GetInstanceIDメソッドは、そのオブジェクト(インスタンス)の一意のIDを取得するためのメソッドです。


参考サイト
Unity 公式スクリプト・リファレンス
Object.GetInstanceID


4.インスタンス番号の変化:ゲーム起動ごとの変動とその原因


 Unityでは、ゲームを起動するたびにインスタンスIDが変わることがあります
これは、動的に生成されるオブジェクトやヒエラルキーに配置されたオブジェクトで顕著に見られます。

 例えば、ゲームのプレイ中に敵キャラクターを動的に生成する場合、その敵キャラクターのインスタンスIDは、生成されるたびに異なります。
これは、インスタンスが新しく生成されるたびに、Unityが新しいIDを割り振るからです。



 一方、ゲーム開始時にヒエラルキーに配置されているオブジェクトも、ゲームを起動するたびにインスタンスIDが変わることがあります。
これは、Unityがゲームを起動するたびに、ヒエラルキーのオブジェクトに新しいIDを割り振るからです。

 ただし、これらのオブジェクトの特性や振る舞い(クラスが定義する部分)は、インスタンスIDが変わっても変わらない点に注意しましょう。
これが「クラスとインスタンス」の関係性を示しています。


5. ゲーム内で操作するのはインスタンス:アサインやGetComponentの活用


 ゲーム内でオブジェクトを操作する際、我々が直接触れるのは「インスタンス」です。

 クラスではありません

 なぜなら、それぞれのゲームオブジェクトはクラスの「設計図」を元にした個々の「建物」(インスタンス)であり、
その「建物」の状態を直接変更することでゲーム内での動きや挙動を制御しているからです。

 これを理解するために、アサインやGetComponentなどの操作を見てみましょう。


1.アサイン(代入)


 Unityのエディター上で、オブジェクトをスクリプトの公開フィールドにドラッグ&ドロップすることを「アサイン」といいます。
この操作を行うと、スクリプトはそのオブジェクト(インスタンス)への参照を保持します。この考え方がポイントです。理解をしていくようにしましょう。

 例えば、敵キャラクターを倒したときに爆発エフェクトを表示する場合、爆発エフェクトのプレハブ(設計図)を作成しておき、
敵キャラクターのスクリプトの公開フィールド(インスペクター)にアサインします。

 このアサインでは、敵キャラクターにアサインしているのは、爆発のエフェクトへの参照です。
そして、敵キャラクターが倒されたときに、そのプレハブからエフェクトのインスタンスを作成(Instantiate)し、ゲーム内で表示します。


2.GetComponent


 GetComponentは、ゲームオブジェクトにアタッチされたコンポーネント(スクリプトやリジッドボディ、コライダーなど)を取得するためのメソッドです。

 例えば、ゲームオブジェクトが特定の条件下(敵の攻撃によるダメージなど)で動きを変える場合、
そのオブジェクトにアタッチされたRigidbodyコンポーネントをGetComponentを使って取得し、インスタンスを参照します。
そして、そのインスタンスのvelocityプロパティを変更することで動きを制御します。


6.まとめ


 これらの操作は、すべて「設計図」(クラス)ではなく「建物」(インスタンス)に対して行われます。
それぞれのインスタンスが個々の状態を持っており、その状態を操作することでゲーム内での挙動を制御しているからです。

 そのためこのように、ゲーム内での操作はインスタンスに対して行われます。
クラスは「設計図」であり、それに基づいて生成された具体的なオブジェクトが「インスタンス」です。
このインスタンスそれぞれが独自の状態を持ち、その状態を変更することでゲームの挙動を制御します。

 クラスからはいくつでもインスタンスを作成できるため、どのインスタンスであるかを知らないとプログラムは命令を出すことが出来ません

 したがって、アサインやGetComponentを使って、具体的なインスタンスを取得しなければならないのです。
クラス(設計図)から直接状態を変更することはできないからです。

 ゲームの挙動を制御するためには、具体的なインスタンスを取得し、その状態を操作する必要があります



 例えば、あるゲームオブジェクトの位置を変更したいとき、そのゲームオブジェクトのクラスから直接位置を変更することはできません
その代わりに、具体的なゲームオブジェクト(インスタンス)を取得し、その位置プロパティを変更することで、ゲームオブジェクトの位置を変更します

 これが、Unity C#における「クラスとインスタンス」の関係性と、なぜインスタンスを取得しなければならないのかの理由です。
これらの概念を理解することで、ゲームの挙動を正確に制御するための基礎を身につけることができます。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます