unity源码解析Transform

Transform这个类继承自Component, IEnumerable。我们在开发的过程中之所以可以对Transform进行foreach,就是因为它实现了IEnumerable抽象方法GetEnumerator,该方法返回一个IEnumerator,而通过重写了IEnumerator中的Current,可以依次获得子对象。废话不多说了

using System;
using System.Collections;
using System.Runtime.CompilerServices;
using UnityEngine.Internal;

namespace UnityEngine
{
    public class Transform : Component, IEnumerable
    {
        private sealed class Enumerator : IEnumerator
        {
            private Transform outer;

            private int currentIndex = -1;

            public object Current
            {
                get
                {
                    return this.outer.GetChild(this.currentIndex);
                }
            }

            internal Enumerator(Transform outer)
            {
                this.outer = outer;
            }

            public bool MoveNext()
            {
                int childCount =this.outer.childCount;
                return ++this.currentIndex < childCount;
            }

            public void Reset()
            {
                this.currentIndex = -1;
            }
        }

        public Vector3 position
        {
            get
            {
                Vector3 result;
                this.INTERNAL_get_position(out result);
                return result;
            }
            set
            {
                this.INTERNAL_set_position(refvalue);
            }
        }

        public Vector3 localPosition
        {
            get
            {
                Vector3 result;
                this.INTERNAL_get_localPosition(out result);
                return result;
            }
            set
            {
                this.INTERNAL_set_localPosition(refvalue);
            }
        }

        public Vector3 eulerAngles
        {
            get
            {
                return this.rotation.eulerAngles;
            }
            set
            {
                this.rotation = Quaternion.Euler(value);
            }
        }

        public Vector3 localEulerAngles
        {
            get
            {
                Vector3 result;
                this.INTERNAL_get_localEulerAngles(out result);
                return result;
            }
            set
            {
                this.INTERNAL_set_localEulerAngles(refvalue);
            }
        }

        public Vector3 right
        {
            get
            {
                return this.rotation * Vector3.right;
            }
            set
            {
                this.rotation = Quaternion.FromToRotation(Vector3.right,value);
            }
        }

        public Vector3 up
        {
            get
            {
                return this.rotation * Vector3.up;
            }
            set
            {
                this.rotation = Quaternion.FromToRotation(Vector3.up,value);
            }
        }

        public Vector3 forward
        {
            get
            {
                return this.rotation * Vector3.forward;
            }
            set
            {
                this.rotation = Quaternion.LookRotation(value);
            }
        }

        public Quaternion rotation
        {
            get
            {
                Quaternion result;
                this.INTERNAL_get_rotation(out result);
                return result;
            }
            set
            {
                this.INTERNAL_set_rotation(refvalue);
            }
        }

        public Quaternion localRotation
        {
            get
            {
                Quaternion result;
                this.INTERNAL_get_localRotation(out result);
                return result;
            }
            set
            {
                this.INTERNAL_set_localRotation(refvalue);
            }
        }

        public Vector3 localScale
        {
            get
            {
                Vector3 result;
                this.INTERNAL_get_localScale(out result);
                return result;
            }
            set
            {
                this.INTERNAL_set_localScale(refvalue);
            }
        }

        public Transform parent
        {
            get
            {
                return this.parentInternal;
            }
            set
            {
                if (thisis RectTransform)
                {
                    Debug.LogWarning("Parent of RectTransform is being set with parent property. Consider using the SetParent method instead, with the worldPositionStays argument set to false. This will retain local orientation and scale rather than world orientation and scale, which can prevent common UI scaling issues.",this);
                }
                this.parentInternal = value;
            }
        }

        internal extern Transform parentInternal
        {
            [WrapperlessIcall]
            [MethodImpl(MethodImplOptions.InternalCall)]
            get;
            [WrapperlessIcall]
            [MethodImpl(MethodImplOptions.InternalCall)]
            set;
        }

        public Matrix4x4 worldToLocalMatrix
        {
            get
            {
                Matrix4x4 result;
                this.INTERNAL_get_worldToLocalMatrix(out result);
                return result;
            }
        }

        public Matrix4x4 localToWorldMatrix
        {
            get
            {
                Matrix4x4 result;
                this.INTERNAL_get_localToWorldMatrix(out result);
                return result;
            }
        }

        public extern Transform root
        {
            [WrapperlessIcall]
            [MethodImpl(MethodImplOptions.InternalCall)]
            get;
        }

        public extern int childCount
        {
            [WrapperlessIcall]
            [MethodImpl(MethodImplOptions.InternalCall)]
            get;
        }

        public Vector3 lossyScale
        {
            get
            {
                Vector3 result;
                this.INTERNAL_get_lossyScale(out result);
                return result;
            }
        }

        public extern bool hasChanged
        {
            [WrapperlessIcall]
            [MethodImpl(MethodImplOptions.InternalCall)]
            get;
            [WrapperlessIcall]
            [MethodImpl(MethodImplOptions.InternalCall)]
            set;
        }

        protected Transform()
        {
        }

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private extern void INTERNAL_get_position(out Vector3value);

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private extern void INTERNAL_set_position(ref Vector3value);

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private extern void INTERNAL_get_localPosition(out Vector3value);

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private extern void INTERNAL_set_localPosition(ref Vector3value);

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private extern void INTERNAL_get_localEulerAngles(out Vector3value);

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private extern void INTERNAL_set_localEulerAngles(ref Vector3value);

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private extern void INTERNAL_get_rotation(out Quaternionvalue);

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private extern void INTERNAL_set_rotation(ref Quaternionvalue);

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private extern void INTERNAL_get_localRotation(out Quaternionvalue);

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private extern void INTERNAL_set_localRotation(ref Quaternionvalue);

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private extern void INTERNAL_get_localScale(out Vector3value);

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private extern void INTERNAL_set_localScale(ref Vector3value);

        public void SetParent(Transform parent)
        {
            this.SetParent(parent,true);
        }

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        public extern void SetParent(Transform parent, bool worldPositionStays);

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private extern void INTERNAL_get_worldToLocalMatrix(out Matrix4x4value);

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private extern void INTERNAL_get_localToWorldMatrix(out Matrix4x4value);

        [ExcludeFromDocs]
        public void Translate(Vector3 translation)
        {
            Space relativeTo = Space.Self;
            this.Translate(translation, relativeTo);
        }
//更新位置,如果传入得是世界坐标,则直接在原基础上增加,否则表示传入是一个该物体的方向上位移
        public void Translate(Vector3 translation, [DefaultValue("Space.Self")] Space relativeTo)
        {
            if (relativeTo == Space.World)
            {
                this.position += translation;
            }
            else
            {
                this.position += this.TransformDirection(translation);
            }
        }
//默认传入值为当前物体的坐标系上的位移
        [ExcludeFromDocs]
        public void Translate(float x,float y, float z)
        {
            Space relativeTo = Space.Self;
            this.Translate(x, y, z, relativeTo);
        }
//更新位置,如果传入得是世界坐标,则直接在原基础上增加,否则表示传入是一个该物体的方向上位移
        public void Translate(float x,float y, float z, [DefaultValue("Space.Self")] Space relativeTo)
        {
            this.Translate(newVector3(x, y, z), relativeTo);
        }
//更新位置,如果传入relativeTo为空表示是世界坐标,则直接在原基础上增加,否则表示传入是一个该物体的方向上位移
        public void Translate(Vector3 translation, Transform relativeTo)
        {
            if (relativeTo)
            {
                this.position += relativeTo.TransformDirection(translation);
            }
            else
            {
                this.position += translation;
            }
        }
//同上
        public void Translate(float x,float y, float z, Transform relativeTo)
        {
            this.Translate(newVector3(x, y, z), relativeTo);
        }
//默认该物体的坐标系中旋转
        [ExcludeFromDocs]
        public void Rotate(Vector3 eulerAngles)
        {
            Space relativeTo = Space.Self;
            this.Rotate(eulerAngles, relativeTo);
        }
//旋转,从这个方法我们可以看出来,unity的欧拉角旋转并非真正的欧拉角旋转,而是同样是四元数的方式
        public void Rotate(Vector3 eulerAngles, [DefaultValue("Space.Self")] Space relativeTo)
        {//相对于父节点的旋转
            Quaternion rhs = Quaternion.Euler(eulerAngles.x, eulerAngles.y, eulerAngles.z);
            if (relativeTo == Space.Self)
            {
                this.localRotation *= rhs;
            }
            else
            { //世界空间的旋转
                this.rotation *= Quaternion.Inverse(this.rotation) * rhs *this.rotation;
            }
        }
//默认相对父节点旋转
        [ExcludeFromDocs]
        public void Rotate(float xAngle,float yAngle, float zAngle)
        {
            Space relativeTo = Space.Self;
            this.Rotate(xAngle, yAngle, zAngle, relativeTo);
        }

        public void Rotate(float xAngle,float yAngle, float zAngle, [DefaultValue("Space.Self")] Space relativeTo)
        {
            this.Rotate(newVector3(xAngle, yAngle, zAngle), relativeTo);
        }

        internal void RotateAroundInternal(Vector3 axis,float angle)
        {
            Transform.INTERNAL_CALL_RotateAroundInternal(this,ref axis, angle);
        }

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private static extern void INTERNAL_CALL_RotateAroundInternal(Transform self,ref Vector3 axis, float angle);
//绕着axis这跟轴旋转angle角度,非弧度制
        [ExcludeFromDocs]
        public void Rotate(Vector3 axis,float angle)
        {
            Space relativeTo = Space.Self;
            this.Rotate(axis, angle, relativeTo);
        }
//绕着axis这跟轴旋转angle角度,非弧度制
        public void Rotate(Vector3 axis,float angle, [DefaultValue("Space.Self")] Space relativeTo)
        {
            if (relativeTo == Space.Self)
            {
                this.RotateAroundInternal(base.transform.TransformDirection(axis), angle * 0.0174532924f);
            }
            else
            {
                this.RotateAroundInternal(axis, angle *0.0174532924f);
            }
        }
//在point处建立坐标系,方向向量为axis,绕着这跟轴旋转angle角度,非弧度制
        public void RotateAround(Vector3 point, Vector3 axis,float angle)
        {
            Vector3 vector = this.position;
            Quaternion rotation = Quaternion.AngleAxis(angle, axis);
            Vector3 vector2 = vector - point;
            vector2 = rotation * vector2;
            vector = point + vector2;
            this.position = vector;
            this.RotateAroundInternal(axis, angle *0.0174532924f);
        }

        [ExcludeFromDocs]
        public void LookAt(Transform target)
        {
            Vector3 up = Vector3.up;
            this.LookAt(target, up);
        }

        public void LookAt(Transform target, [DefaultValue("Vector3.up")] Vector3 worldUp)
        {
            if (target)
            {
                this.LookAt(target.position, worldUp);
            }
        }

        public void LookAt(Vector3 worldPosition, [DefaultValue("Vector3.up")] Vector3 worldUp)
        {
            Transform.INTERNAL_CALL_LookAt(this,ref worldPosition, ref worldUp);
        }

        [ExcludeFromDocs]
        public void LookAt(Vector3 worldPosition)
        {
            Vector3 up = Vector3.up;
            Transform.INTERNAL_CALL_LookAt(this,ref worldPosition, ref up);
        }

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private static extern void INTERNAL_CALL_LookAt(Transform self,ref Vector3 worldPosition, ref Vector3 worldUp);

        public Vector3 TransformDirection(Vector3 direction)
        {
            return Transform.INTERNAL_CALL_TransformDirection(this,ref direction);
        }

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private static extern Vector3 INTERNAL_CALL_TransformDirection(Transform self, ref Vector3 direction);

        public Vector3 TransformDirection(float x,float y, float z)
        {
            return this.TransformDirection(newVector3(x, y, z));
        }

        public Vector3 InverseTransformDirection(Vector3 direction)
        {
            return Transform.INTERNAL_CALL_InverseTransformDirection(this,ref direction);
        }

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private static extern Vector3 INTERNAL_CALL_InverseTransformDirection(Transform self, ref Vector3 direction);

        public Vector3 InverseTransformDirection(float x,float y, float z)
        {
            return this.InverseTransformDirection(newVector3(x, y, z));
        }

        public Vector3 TransformVector(Vector3 vector)
        {
            return Transform.INTERNAL_CALL_TransformVector(this,ref vector);
        }

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private static extern Vector3 INTERNAL_CALL_TransformVector(Transform self, ref Vector3 vector);

        public Vector3 TransformVector(float x,float y, float z)
        {
            return this.TransformVector(newVector3(x, y, z));
        }

        public Vector3 InverseTransformVector(Vector3 vector)
        {
            return Transform.INTERNAL_CALL_InverseTransformVector(this,ref vector);
        }

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private static extern Vector3 INTERNAL_CALL_InverseTransformVector(Transform self, ref Vector3 vector);

        public Vector3 InverseTransformVector(float x,float y, float z)
        {
            return this.InverseTransformVector(newVector3(x, y, z));
        }

        public Vector3 TransformPoint(Vector3 position)
        {
            return Transform.INTERNAL_CALL_TransformPoint(this,ref position);
        }

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private static extern Vector3 INTERNAL_CALL_TransformPoint(Transform self, ref Vector3 position);

        public Vector3 TransformPoint(float x,float y, float z)
        {
            return this.TransformPoint(newVector3(x, y, z));
        }

        public Vector3 InverseTransformPoint(Vector3 position)
        {
            return Transform.INTERNAL_CALL_InverseTransformPoint(this,ref position);
        }

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private static extern Vector3 INTERNAL_CALL_InverseTransformPoint(Transform self, ref Vector3 position);

        public Vector3 InverseTransformPoint(float x,float y, float z)
        {
            return this.InverseTransformPoint(newVector3(x, y, z));
        }

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        public extern void DetachChildren();

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        public extern void SetAsFirstSibling();

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        public extern void SetAsLastSibling();

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        public extern void SetSiblingIndex(int index);

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        public extern int GetSiblingIndex();

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        public extern Transform Find(string name);

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private extern void INTERNAL_get_lossyScale(out Vector3value);

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        public extern bool IsChildOf(Transform parent);

        public Transform FindChild(string name)
        {
            return this.Find(name);
        }

        public IEnumerator GetEnumerator()
        {
            return new Transform.Enumerator(this);
        }

        [Obsolete("use Transform.Rotate instead.")]
        public void RotateAround(Vector3 axis,float angle)
        {
            Transform.INTERNAL_CALL_RotateAround(this,ref axis, angle);
        }

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private static extern void INTERNAL_CALL_RotateAround(Transform self,ref Vector3 axis, float angle);

        [Obsolete("use Transform.Rotate instead.")]
        public void RotateAroundLocal(Vector3 axis,float angle)
        {
            Transform.INTERNAL_CALL_RotateAroundLocal(this,ref axis, angle);
        }

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        private static extern void INTERNAL_CALL_RotateAroundLocal(Transform self,ref Vector3 axis, float angle);

        [WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        public extern Transform GetChild(int index);

        [Obsolete("use Transform.childCount instead."), WrapperlessIcall]
        [MethodImpl(MethodImplOptions.InternalCall)]
        public extern int GetChildCount();
    }
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在Unity中,"object"是一个通用的术语,指代了在场景中的游戏物体。而"transform"是一个特定的组件,用来控制游戏物体的位置、旋转和缩放。 要将一个object转换为transform,我们可以通过访问这个object上的transform属性来实现。首先,我们需要获取到这个object的引用,可以通过Find()函数、通过标签或者通过实例化的方式获得。 一旦我们得到了这个object的引用,我们就可以使用它的transform属性来对其进行操作。transform属性是一个Transform类型的对象,它存储了物体的位置、旋转和缩放信息。 我们可以通过transform的各种方法改变物体的位置,比如设置position属性,设置rotation属性来改变物体的旋转,或者设置localScale属性来改变物体的缩放。 除了上述的属性和方法之外,transform还有一些其他常用的功能,比如LookAt()函数可以让物体朝向另一个物体或者指定的位置,Translate()函数可以改变物体的位置,并且还有一些跟坐标系相关的属性和方法,比如forward、up、right等。 总结起来,将一个object转换为transform意味着我们可以通过访问物体的transform属性来改变物体的位置、旋转和缩放等属性。这使得我们能够更加精确地控制和操作场景中的游戏物体。 ### 回答2: 在Unity中,GameObject是场景中的实体对象,而Transform是GameObject上的组件之一,用于控制对象的位置、旋转和缩放。 将GameObject转换为Transform是非常简单的,只需要使用GameObject的transform属性即可。例如,假设有一个名为"cube"的GameObject,以下是将其转换为Transform的示例代码: ``` GameObject cube = GameObject.Find("cube"); // 根据名字找到GameObject Transform cubeTransform = cube.transform; // 将GameObject转换为Transform ``` 这样,我们就可以通过cubeTransform来获取和控制"cube"的位置、旋转和缩放等属性。例如,可以使用cubeTransform.position来获取和设置"cube"的位置,cubeTransform.rotation来获取和设置"cube"的旋转。 需要注意的是,Transform是一个引用类型,它反映了GameObject的实时状态。因此,对Transform进行操作会直接影响到对应的GameObject。这意味着,当我们改变了Transform的属性时,对应的GameObject也会相应地改变。 总结起来,将GameObject转换为Transform只需使用GameObject的transform属性,通过Transform可以方便地控制GameObject的位置、旋转和缩放等属性。 ### 回答3: Unity中,Object和Transform都是非常重要的概念。 Object是Unity中所有游戏对象的基类,它包含一些共用的属性和功能。这些属性和功能包括对象的名称、标签、活动状态等。通过继承Object类,我们可以创建自己的游戏对象,并在游戏中进行操作。 TransformUnity中用于表示对象的位置、旋转和缩放的组件。每个游戏对象都有一个Transform组件,它可以通过修改位置、旋转和缩放来改变对象的外观和行为。通过Transform,我们可以将对象移动到指定的位置、旋转对象以及调整对象的大小。 在Unity中,我们可以通过将Object对象转换为Transform对象来访问对象的Transform组件。转换的过程可以通过将Object对象强制转换为Transform类型来实现。 例如,我们有一个Object对象,名为obj,现在我们想要访问它的Transform组件。我们可以使用如下代码进行转换: Transform transform = obj.transform; 完成转换后,我们就可以使用transform变量来访问obj的Transform组件,并可以对其进行位置、旋转和缩放的操作。 总结来说,unity object 转 transform是将一个Object对象转换为可以访问和操作其Transform组件的过程。这样可以方便地对对象的位置、旋转和缩放进行控制,以实现游戏中的各种效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梁工123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值