zoukankan      html  css  js  c++  java
  • 关于Unity中的transform组件(一)

    一、transform组件用途

    1.维护场景树

    2.对3D物体的平移,缩放,旋转

    二、场景树定义

    在Hierarchy视图中显示的:

    一个game_scene场景,下面有Main Camera节点,Directional Light节点,game_root节点,game_root节点下又有Cube子节点,Sphere子节点,组成game_scene场景树。

    三、组件和节点

    1.每个节点都有一个transform组件

    2.每一个继承自MonoBehaviour的组件都有一个数据成员指向这个节点的transform组件。

    使用this.transform;获得。//可以通过任何一个组件来获得每一个节点的transfrom组件。

    同理,由于每一个继承自MonoBehaviour的组件都有一个数据成员gameObject指向组件实例所挂载的场景的节点对象,transfrom它也是一个组件,所以它也有一个gameObject指向它挂的节点。

    使用this.transform.gameObject获得。//Debug.Log(this.transform.gameObject.name);

    3.每一个继承自MonoBehaviour的组件都有一个数据成员gameObject指向组件实例所挂载的场景的节点对象,使用this.gameObject获得。

    Debug.Log(this.gameObject.name);//节点名字
    Debug.Log(this.gameObject.layer);//节点所在层名字

    Debug.Log(this.gameObject.tag);//节点的标记或标签值
    Debug.Log(this.gameObject.activeSelf); // 自己这个属性是否可见,自己节点名字旁边的勾是否打了,结果是true或false
    Debug.Log(this.gameObject.activeInHierarchy); // 自己在这个体系里面是否可见,也就是如果它的父节点设置为不显示,自己还是可见的,那么它的activeInHierarchy就是不可见,结果是true或false

    this.gameObject.SetActive(true);//设置节点为可见

     4.总结

    一个节点上挂载的所有组件实例,包括transform组件实例都有一个数据成员(transform)指向transform组件,所有组件实例,包括transform组件实例都有一个数据成员(gameObject)指向该节点。

    所以经常用this.tranform,this.gameObject获得。

    5.场景树的构成过程

    每一个节点都有一个transform组件,一个父transform组件下面有好多子transform组件,而每一个transform组件都指向一个节点,在transform组件构成transform时,另一方面也间接构成了节点树。

    五、使用transform组件访问孩子节点

    所以可以用transform组件,来访问或者获得节点下面的所有孩子节点
    方法1
    比如找到game_root节点下的Cube节点,在game_root节点的game_scene组件的start方法里面写
    Transform trans = this.transform.Find("Cube");//找到孩子transform组件里节点名叫Cube的transform组件
    GameObject cube= trans.gameObject;//通过Cube的transform组件再得到它的gameObject节点
    Debug.Log(cube.name);//输出Cube节点名字

    方法2
    Transform trans = this.transform.FindChild("Sphere");
    GameObject sphere= trans.gameObject;
    Debug.Log(sphere.name);


    方法1和2的区别是
    find可以多层嵌套查询,可以查孙子节点,孙子的孙子节点,只要加上路径,可以找到节点树的任何节点,不是自己的子节点也可以。

    FindChild只能查自己的子节点。

    多层节点查询要写路径
    Transform trans = this.transform.Find("Sphere/test");//Find如果是自己的子节点或者孙子节点,可以不加前面的路径,只要一个test就可以找到
    GameObject test = trans.gameObject;
    Debug.Log(test.name);


    方法3
    this.transform.GetChild(0).gameObject.name;//0代表第一个子节点的transform组件,1代表第二个,以此类推,性能比find好一些,但是我们通常用find

    子节点数

     //查找一个父节点到底有多少个子节点,或者叫子transform组件
    Debug.Log(this.transform.childCount);

    六、使用transform组件访问父亲节点

    子节点找父节点也是先找到子节点的transform组件,再得到父亲的transform组件,最后得到父亲的gameObject节点
    Transform trans = this.transform.Find("Sphere/test");
    Debug.Log(trans.parent.gameObject.name);
    所以每一个transform组件实例还有一个数据成员(parent)指向父节点的transform组件。

    Main Camera,Directional Light,game_root这些节点都是没有父节点的,他们的transform组件也没有父亲的transform组件

    七、使用GameObject查找节点

    // 基于GameObject的查找,来找GameObject,全局查找,GameObject.Find静态函数
    Debug.Log(GameObject.Find("game_root/Sphere/test").name);

    八、使用Tag查找节点
    // 基于Tag的全局查找,如果有多个节点的Tag是一样的,那么先找到的,先返回,查找的顺序好像不是是按顺序从上到下的,深的子节点反而先找到
    Debug.Log(GameObject.FindWithTag("game_root").name);
    Debug.Log(GameObject.FindWithTag("test").name);//多层嵌套的没关系,只要用自己的Tag查找就行了

    // 如果有多个节点,都是同样的tag,会发生什么样的事情呢?
    GameObject[] game_sets = GameObject.FindGameObjectsWithTag("test");//返回的是一个放着GameObject类型元素的数组
    for (int i = 0; i < 2; i++) {
      Debug.Log(game_sets[i].name);//先子后父
    }

    九、绝对坐标和相对坐标(世界坐标和局部坐标)

    1.我的家在地球上东经10,北纬10(世界坐标)
    2.我在我家往北100米(相对坐标)
    1+2=我的世界坐标


    获得节点的坐标位置
    Debug.Log(this.transform.position);//(0,2,10)//Unity编辑器里面的postion是相对坐标,可是代码里面的postion是绝对坐标,也就是说这里的position是绝对坐标

    相对坐标是
    Debug.Log(trans.localPosition); // (0, 2, 0)

    十、forward,right,up
    把物体想象成一个人,本来这个人的x,y,z坐标轴的指向是和世界的x,y,z坐标轴的指向是重合的,x代表right,y代表up,z代表forward
    如果把物体旋转一个角度,这时候就像人转一个角度,人的左右上都改变了,所以这时候forward,right,up的方向都变了

    Debug.Log(trans.forward);//结果是一个向量,也就是一个三维坐标
    Debug.Log(trans.right);
    Debug.Log(trans.up);

    十一、距离上一次刷新的时间

    // Update is called once per frame
    void Update () {
      float dt = Time.deltaTime; // 距离上一次刷新的时间
    }

    void FixedUpdate() {
      float dt = Time.fixedDeltaTime; // 物理引擎固定更新的时间间隔
    }

  • 相关阅读:
    Python学习
    我的计算机网络复习笔记(第一章)
    理解DES算法
    彻底理解RSA加密算法
    扩展欧几里得算法求模的乘法逆元
    python的deque(双向)队列详解
    对于暴力枚举的一些优化方法的题解
    python中的多(liu)元(mang)交换 ,赋值
    python定义函数后跟->的意义
    直接暴力做分糖问题
  • 原文地址:https://www.cnblogs.com/HangZhe/p/6822698.html
Copyright © 2011-2022 走看看