UnityEngine擬似コードから考えるC#スクリプトの振る舞い

2023年3月9日

UnityのStart()メソッドの内部処理を疑似コードから見てみましょう。

GameObjectのコンポーネントへのアクセスについても同時に学びます。

using System;
using UnityEngine;
public class SampleScript : MonoBehaviour
{
    public void Start()
    {
        gameObject.transform.Position = new Vector3(1.0f, 2.0f, 3.0f);
        // gameObject.transform.Position.x = 10;
        gameObject.GetComponent<Transform>().Position = new Vector3(10.0f, 20.0f, 30.0f);
        Console.WriteLine(transform.Position.y);
    }
    public void Update()
    {
        Console.WriteLine("updata");
    }
}

Unityエンジンの疑似コード(説明用なので実際のコードとは一致しません)

// UnityEngine内部構造のシミュレーション
namespace UnityEngine
{
    class Program
    {
        static void Main(string[] args)
        {
            GameManager manager = new GameManager();
            manager.Run();
        }
    }
    class GameManager
    {
        public void Run()
        {
            GameObject obj = new GameObject();
            obj.sampleScript = new SampleScript();
            obj.name = "Cube";
            // スクリプトのStart()メソッドを実行
            obj.sampleScript.Start();
            // スクリプトのUpdate()メソッドを実行
            while (true)
            {
                System.Threading.Thread.Sleep(1000);
                obj.sampleScript.Update();
            }
        }
    }
    public class MonoBehaviour : GameObject
    {
    }
    public class GameObject
    {
        // 自身のインスタンスを宣言。格納する変数
        public GameObject gameObject;
        public string name;
        // コンポーネント(Transform)
        public Transform transform = new Transform();
        // コンポーネント(Script)
        public SampleScript sampleScript;
        // コンストラクタ。自身をセット
        public GameObject()
        {
            gameObject = this;
        }
        // コンポーネント間のアクセスを可能にする。戻り値はコンポーネントのインスタンス。
        public T GetComponent<T>() where T : Transform
        {
            return (T)transform;
        }
    }
    // Transformコンポーネント
    public class Transform
    {
        private Vector3 position;
        private Vector3 rotation;
        private Vector3 scale;
        public Vector3 Position
        {
            get
            {
                return position;
            }
            set
            {
                position = value;
            }
        }
        public Vector3 Rotation { get => rotation; set => rotation = value; }
        public Vector3 Scale { get => scale; set => scale = value; }
    }
    // Vector3構造体
    public struct Vector3
    {
        public float x;
        public float y;
        public float z;
        public Vector3(float x, float y, float z)
        {
            this.x = x;
            this.y = y;
            this.z = z;
        }
    }
}

C#

Posted by hidepon