【Unity】プリミティブのCubeをスクリプトだけで実現

プリミティブのCubeはヒエラルキービューから作成できますが、コードでも実現することが可能です

コード

本来、インスタンスの作成は、Unityエンジンで実行させるために、このようなコードで作成はしませんが学習のために確認しておきましょう

using UnityEngine;

public class CubeSim : MonoBehaviour
{
    [SerializeField]
    Material defaultMaterial;

    [SerializeField]
    Mesh cubeMesh;

    void Start()
    {
        GameObject cube = new GameObject();
        cube.name = "Cube";

        cube.AddComponent<MeshFilter>().mesh = cubeMesh;
        cube.AddComponent<MeshRenderer>().material = defaultMaterial;
        cube.AddComponent<BoxCollider>();
    }
}

このコードは、それに基本的なコンポーネントをアタッチする役割を果たします

具体的なコードの説明

using UnityEngine;

Unityのクラスやメソッドを使用するためのUnityエンジンの名前空間をインクルードしています

public class CubeSim : MonoBehaviour

CubeSimというクラスを宣言し、MonoBehaviourを継承しています
これはUnityコンポーネントを作成するための基本クラスです。

[SerializeField]

この属性は、プライベートな変数をインスペクターで公開可能にし、インスペクターから設定できるようにします
このスクリプトで使用されている変数 defaultMaterial と cubeMesh は、インスペクターで設定できるようになります

Material defaultMaterial;

defaultMaterialという名前のMaterial型の変数を宣言します
この変数はキューブの外観を定義するために使用されます

Mesh cubeMesh;

cubeMesh という名前のMesh型の変数を宣言します。この変数はキューブの形状を定義するために使用されます

void Start()

Start メソッドは、スクリプトがアクティブになったときに一度だけ実行されるUnityのメソッドです

GameObject cube = new GameObject();

新しい空のGameObject(ゲームオブジェクト)を作成し、それを cube という名前の変数に割り当てます

cube.name = "Cube"

cube ゲームオブジェクトの名前を “Cube" に設定します

cube.AddComponent<MeshFilter>().mesh = cubeMesh;

cube ゲームオブジェクトに MeshFilter コンポーネントを追加し、その MeshFilter のメッシュプロパティに cubeMesh を設定します
これにより、キューブの形状が設定されます

cube.AddComponent<MeshRenderer>().material = defaultMaterial;

cube ゲームオブジェクトに MeshRenderer コンポーネントを追加し、その MeshRenderer のマテリアルプロパティに defaultMaterial を設定します
これにより、キューブの外観が設定されます

cube.AddComponent<BoxCollider>();

cube ゲームオブジェクトに BoxCollider コンポーネントを追加します
これにより、キューブは物理的な衝突を持つようになり、他のオブジェクトとの衝突を検出できます

このコードは、Unity内で実行すると、名前が “Cube" のキューブが生成され、その形状と外観が指定され、物理的な衝突も考慮されることを意味しています。このキューブは、ゲーム内で他のオブジェクトと相互作用するために使用できます。

別の書き方

上記のコードをリファクタリングしています
実行結果は同じになります

using UnityEngine;

public class CubeSim : MonoBehaviour
{
    [SerializeField] private Material defaultMaterial;
    [SerializeField] private Mesh cubeMesh;

    private void Start()
    {
        CreateCube();
    }

    private void CreateCube()
    {
        GameObject cube = new GameObject("Cube");

        MeshFilter meshFilter = cube.AddComponent<MeshFilter>();
        meshFilter.mesh = cubeMesh;

        MeshRenderer meshRenderer = cube.AddComponent<MeshRenderer>();
        meshRenderer.material = defaultMaterial;

        cube.AddComponent<BoxCollider>();
    }
}

リファクタリングのポイント

  1. Start メソッド内のコードを CreateCube メソッドに抽出しました。これにより、コードがよりモジュール化され、理解しやすくなります
  2. 不要な cube 変数の作成と代入を削除し、新しいゲームオブジェクトを AddComponent メソッドを使って直接作成しました
  3. MeshFilter と MeshRenderer のインスタンスを変数に格納し、それを使ってメッシュとマテリアルを設定しました
    これにより、コードがすっきりとし、重複を減らすことができます

このリファクタリングにより、コードの読みやすさが向上し、将来の変更や保守が容易になります
また、CreateCube メソッドは将来的に他の部分でも再利用できるため、コードの再利用性も高まります

別に作成したスクリプトも追加できます

次のようなスクリプトを別途用意します

using UnityEngine;

public class CubeTestSample : MonoBehaviour
{
    void Start()
    {
        Debug.Log("test");
    }
}

CubeSimスクリプトに次の行を追加します

cube.AddComponent<CubeTestSample>();

追加できるわけ

CubeTestSampleはMonoBehaviourクラスを継承しています

MonoBehaviourクラスは、Behaviourクラスを継承しています

public class MonoBehaviour : Behaviour
{
}

BehaviourクラスはComponentクラスを継承しています
つまり、ジェネリックのAddComponent<Componen>()の型パラメータに代入できることになります
(ポリモーフィズム)

public class Behaviour : Component
{
}

Unity,学習

Posted by hidepon