理解のために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; }