Unity3d

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

2018-01-27  本文已影响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类的使用。
上一篇下一篇

猜你喜欢

热点阅读