【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>();
}
}
リファクタリングのポイント
- Start メソッド内のコードを CreateCube メソッドに抽出しました。これにより、コードがよりモジュール化され、理解しやすくなります
- 不要な cube 変数の作成と代入を削除し、新しいゲームオブジェクトを AddComponent メソッドを使って直接作成しました
- 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
{
}
ディスカッション
コメント一覧
まだ、コメントがありません