美文网首页Unity3d
Unity基础(8)-Transform组件与类

Unity基础(8)-Transform组件与类

作者: 元宇宙协会 | 来源:发表于2018-01-27 21:34 被阅读252次

    01-Unity下的Transform组件

    Transform组件

    02-Transform类包含的属性

    // 获得当前Transform的子Transform的个数
    childCount                    The number of children the Transform has.
    // 当前Transform的父亲
    parent                        The parent of the transform.
    // 获得Transform物体的根物体Transform (儿子获取父亲,孙子获取爷爷)
    root                          Returns the topmost transform in the hierarchy.
    
    // 当前的Transform被改变后,就会调用这个属性,所以一般使用
    hasChanged                    Has the transform changed since the last time the flag was set to 'false'?
    
     // 当前物体树状结构层级容量
    hierarchyCapacity             The transform capacity of the transform's hierarchy data structure.
     // 当前节点的树状结构层次数目
    hierarchyCount                The number of transforms in the transform's hierarchy data structure.
    
    //物体的世界角度与自身角度,这两者都是以Vector3进行表示
    eulerAngles                   The rotation as Euler angles in degrees.
    localEulerAngles              The rotation as Euler angles in degrees relative to the parent transform's rotation.
    
    //物体的世界坐标与自身坐标
    position                  The position of the transform in world space.
    localPosition             Position of the transform relative to the parent transform.
    
    // 物体的世界角度与自身角度,这两者都是以四元数进行旋转
    rotation                  The rotation of the transform in world space stored as a Quaternion.
    localRotation             The rotation of the transform relative to the parent transform's rotation.
    
    // 物体的自身大小(可读fget可写set)与世界大小(只读get)
    localScale                     The scale of the transform relative to the parent.
    lossyScale                     The global scale of the object (Read Only).
    
    
    //获得Transform组件在世界x,y,z轴的正值即(Vector3.right,Vector3.up,Vector3.forward)
    right          The red axis of the transform in world space.
    up             The green axis of the transform in world space.
    forward        The blue axis of the transform in world space.
    
     // 矩阵  从世界矩阵转成自身矩阵
    worldToLocalMatrix  Matrix that transforms a point from world space into local space (Read On)
     // 矩阵 从自身矩阵转成世界矩阵
    localToWorldMatrix  Matrix that transforms a point from local space into world space (Read Only).
    

    03-Transform类属性使用

            // 获取物体的坐标信息
            Vector3 pos = sp.position;  // 世界坐标
            Vector3 pos1 = sp.localPosition; // 自身坐标
            Debug.Log(pos);
            Debug.Log(pos1);
            // 打印的就是Transform的Rotation
            Vector3 anglrL = tf.localEulerAngles;
            Vector3 anglr = tf.eulerAngles;
            Debug.Log(anglr);
            Debug.Log(anglrL);
    
            Quaternion rota = tf.localRotation; // 自身旋转位置
            Quaternion rota1 = tf.rotation; // 世界旋转位置
            Debug.Log(rota);
            Debug.Log(rota1);
    
            tf.localScale = new Vector3(2, 2, 2);
            Debug.Log(sp.localScale + "圆球的自身大小");
            // 获取当前物体在世界中的大小
            Debug.Log(tf.lossyScale);
    
            // 拿到Transform组建的父物体
            //Transform ptf = sp.parent;
            //Debug.Log(ptf.name);
            // 脱离父子关系
            //sp.parent = null;
            //Debug.Log(sp.parent.name);
    
            Vector3 yUp = sp.up;
            Vector3 zForward = sp.forward;
            Vector3 xRight = sp.right;
            Debug.Log(yUp);
            Debug.Log(xRight);
            Debug.Log(zForward);
            // 获取当前物体的子个数
            int number = tf.childCount;
            Debug.Log(number);
            Debug.Log(cuSun.root.name);
            // 当前树状结构层及容量
            Debug.Log(tf.hierarchyCapacity + "代表当前所在的树的层次容量");
            // 当前节点的树状结构层次数目。
            Debug.Log(tf.hierarchyCount + "...");
    
            // 矩阵 从自身矩阵转成世界矩阵
            Matrix4x4 ma = tf.localToWorldMatrix;
            // 矩阵  从世界矩阵转成自身矩阵
            Matrix4x4 ma1 = tf.worldToLocalMatrix;
            Debug.Log(ma.ToString());
            Debug.Log(tf.hasChanged);
            Debug.Log(ma1.ToString());
    
            // 当前的Transform被改变后,就会调用这个属性
            //if (tf.hasChanged)
            //{
            //    Debug.Log("当前的Transform被改变");
            //    tf.hasChanged = false;
            //}
    

    04-Transform类包含的方法

    //删除所有子类
    DetachChildren             Unparents all children.
    //查找子类对象的Transform
    Find                       Finds a child by name and returns it.
    //获取子类对象Transform组件,根据索引
    GetChild                 Returns a transform child by index.
    // 调用此方法的Transform是否为后面的Transform组件儿子
    IsChildOf                Is this transform a child of parent?
    // 为调用此方法的Transform组件设置父Transform,建立父子级关系
    SetParent               Set the parent of the transform.
    
    // 让当前调用此方法的物体的z轴朝向目标位置
    LookAt               Rotates the transform so the forward vector points at /target/'s current position.
    // 让当前调用此方法的物体产生位移移动
    Translate             Moves the transform in the direction and distance of translation.
    
    // 旋转方法
    Rotate               Applies a rotation of eulerAngles.z degrees around the z axis, eulerAngles.x degrees around the x axis, and eulerAngles.y degrees around the y axis (in that order).
    // 旋转方法(绕某个轴进行旋转)
    RotateAround         Rotates the transform about axis passing through point in world coordinates by angle degrees.
    // 为当前Transform组件设置位置与旋转角
    SetPositionAndRotation                 Sets the world space position and rotation of the Transform component.
    
    // 获取当前组件的游戏对象在Hierarchy中的索引值(从0开始计)
    GetSiblingIndex Gets the sibling index.
    // 设置当前组件的游戏对象在Hierarchy中的索引值(从0开始计)
    SetSiblingIndex Sets the sibling index.
    //设置当前组件的游戏对象在Hierarchy面板中最上面位置
    SetAsFirstSibling   Move the transform to the start of the local transform list.
    //设置当前组件的游戏对象在Hierarchy面板中最下面位置
    SetAsLastSibling    Move the transform to the end of the local transform list.
    
    // 将方向从本地坐标转换为世界坐标,不受缩放影响
    TransformDirection                    Transforms direction from local space to world space.
    // 使用父类Transform组件调用此方法可以将子类对象的自身坐标转换成世界坐标
     // 使用子类Transform组件调用此方法可以将父类对象的世界坐标拿到
    
    // 使用父类Transform组件调用此方法可以将子类对象的坐标点转换成世界坐标点
    TransformPoint                    Transforms position from local space to world space.
    
    // 将坐标点从本地坐标转换为世界坐标,不受位置影响但受缩放影响。
    TransformVector                   Transforms vector from local space to world space.
    // 使用父类Transform组件调用此方法可以将子类对象的自身方向转换成世界方向
    
    // 使用父类Transform组件调用此方法可以将子类对象的世界坐标转换成自身坐标
    InverseTransformDirection   Transforms a direction from world space to local space. The opposite of Transform.TransformDirection.
    // 使用父类Transform组件调用此方法可以将子类对象的世界坐标点转换成自身坐标点
    InverseTransformPoint                     Transforms position from world space to local space.
    // 使用父类Transform组件调用此方法可以将子类对象的世界方向转换成自身方向
    InverseTransformVector  Transforms a vector from world space to local space. The opposite of Transform.TransformVector.
    
    

    05-Transform类方法使用

    public class TransformScripts : MonoBehaviour {
    
        private Transform tf;
        public Transform sp;
        public Transform cuSun;
        public Transform currrent;
        void Start () {
            tf = this.transform;
            // 删除所有的子对象
            //tf.DetachChildren();
            // 当前transform的父控件设置为空
            //sp.parent = null;
            //sp.parent = tf;
            // 只能查找子类对象的Transform
            //sp = tf.Find("Sphere");
            //Debug.Log(sp.name);
            // 获取子对象的Transform,index表示子对象,从0开始
            sp = tf.GetChild(0);
            //Debug.Log(sp.name);
            // 获取同级索引
            //int number = tf.GetSiblingIndex();
            //Debug.Log(number);
    
            //Debug.Log( "sp是否是tf的子对象"+ sp.IsChildOf(tf));
    
            //获取的Sp代表的物体的世界坐标
            Debug.Log(sp.position);
            // 获取的自身坐标(参考父物体的坐标点)
            Debug.Log(sp.localPosition);
    
            // 一定要使用父类的Transform组件进行转换
            Debug.Log( "使用父类的坐标转换方法:让子对象从自身坐标转为世界坐标" + tf.TransformPoint(sp.localPosition));
            Debug.Log("使用父类的坐标转换方法:让子对象从世界坐标转为自身坐标" + tf.InverseTransformPoint(sp.position));
            // InverseTransformDirection
            // TransformDirection      
    
            // InverseTransformVector
            // TransformVector  
        }
    
    void Update () {
    
            if (Input.GetKeyDown(KeyCode.Q))
            {
                // 获取同级索引
                //int number = tf.GetSiblingIndex();
                // 设置当前的transform组件的物体在层级的最前面
                //tf.SetAsFirstSibling();
                // 设置当前的transform组件的物体在层级的最后面
                //tf.SetAsLastSibling();
            }
    
    
            if (Input.GetMouseButtonDown(0))
            {
                // 让当前含有transform组件的物体朝向另一transform组件的物体位置
                //currrent.LookAt(tf);
    
            }
            if (Input.GetMouseButton(0))
            {
                // 让当前的Transform组建进行旋转
                tf.Rotate(new Vector3(10, 0, 0));
            }
    
            if (Input.GetMouseButton(1))
            {
                // 添加一个托线渲染器
                currrent.gameObject.AddComponent<TrailRenderer>();
                // 绕着tf物体的位置,进行Y轴10角度的旋转
                currrent.RotateAround(tf.position, Vector3.up, 10f);
    
            }
            if (Input.GetMouseButtonDown(2))
            {
                //currrent.SetParent(tf);
                // 给一个物体的transform设置一个点和角度
                currrent.SetPositionAndRotation(new Vector3(0, 0, -5), new Quaternion(1, 0, 0, 1));
    
            }
    
            if (Input.GetKey(KeyCode.W))
            {
                // 使当前物体进行移动
                currrent.Translate(new Vector3(0, 0, 1f) * 10f * Time.deltaTime);
            }
            if (Input.GetKey(KeyCode.S))
            {
                currrent.Translate(new Vector3(0, 0, -1f) * 10f * Time.deltaTime);
            }
            if (Input.GetKey(KeyCode.A))
            {
                // 使当前物体进行移动
                currrent.Translate(new Vector3(-1f, 0,0) * 10f * Time.deltaTime);
            }
            if (Input.GetKey(KeyCode.D))
            {
                currrent.Translate(new Vector3(1, 0, 0f) * 10f * Time.deltaTime);
            }
    }
    

    06-游戏开发中的衍生使用

    在游戏开发中,我们使用Transform类用来查找游戏对象的Transform组件,从来对游戏对象的坐标及旋转,大小进行相应的设置。
    Transform类的调用相比GameObject类更加具有轻量化,耗费资源更少,建议开发中使用此类替代GameObject类的使用。
    

    相关文章

      网友评论

        本文标题:Unity基础(8)-Transform组件与类

        本文链接:https://www.haomeiwen.com/subject/fwonaxtx.html