【Unity】Transformを独自実装してみる

理解のためにUnityのTransform的なものを独自で実装してみたメモです。
パフォーマンスとかは一切気にしてません。

ソースコード

早速ですがソースコードです。

using UnityEngine;

[System.Serializable]
public class CustomTransform 
{
    // 位置
    [SerializeField]
    private Vector3 _localPosition = Vector3.zero;
    public Vector3 LocalPosition { get { return _localPosition; } set { _localPosition = value; } }
    public Vector3 Position => LocalToWorldMatrix.MultiplyPoint(Vector3.zero);

    // 回転
    [SerializeField]
    private Vector3 _localEulerAngles = Vector3.zero;
    public Vector3 LocalEulerAngles { get { return _localEulerAngles; } set { _localEulerAngles = value; } }
    public Quaternion LocalRotation 
    {
        get {
            // ZXYの順で回転を適用する
            return Quaternion.AngleAxis(LocalEulerAngles.y, Vector3.up)
                * Quaternion.AngleAxis(LocalEulerAngles.x, Vector3.right)
                * Quaternion.AngleAxis(LocalEulerAngles.z, Vector3.forward);
        }
    }
    public Quaternion Rotation => LocalToWorldMatrix.rotation;

    // スケール
    [SerializeField]
    private Vector3 _localScale = new Vector3(1, 1, 1);
    public Vector3 LocalScale { get { return _localScale; } set { _localScale = value; } }
    public Vector3 LossyScale => LocalToWorldMatrix.lossyScale;
    
    // 親
    public CustomTransform Parent { get; set; }
    
    public Matrix4x4 LocalToParentMatrix => Matrix4x4.TRS(LocalPosition, LocalRotation, LocalScale);
    
    public Matrix4x4 LocalToWorldMatrix => (Parent == null ? Matrix4x4.identity : Parent.LocalToWorldMatrix) * LocalToParentMatrix;
}

関連

light11.hatenadiary.com