文章

Unity 入门之零散知识点

CenterPivot

场景窗口左上角的CenterPivot 表示游戏对象的轴心参考点。

  • Center 表示以所有选中的物体所组成的组合体的几何中心作为游戏对象的轴心参考点(常用于多物体的整体移动);
  • Pivot 表示以最后一个选中的游戏对象的轴心(轴心在模型里决定)为参考点。

模型的轴心在 Unity 中无法修改,但在建模软件里可任意设置


.mat:材质文件 .unity:场景文件 .meta:记录一些文件相关的描述信息


在一个fbx模型文件中,一般包含:

  • Mesh:网格数据,定义物体的形状
  • Material:材质,定义物体表面的光学特性,包含:贴图、颜色、着色器等属性
  • Texture:表面材质的纹理、贴图,定义表面的像素颜色


模型的平面,都是正面可见,背面不可见,即不渲染 -> 从模型外面看,每个面都可见,但在编辑器里,从模型内部向外看,模型都是透明的

脚本

  • 脚本里的类必须继承自 MonoBehaviour 才能挂载在物体上,脚本也是一个组件
  • this:当前脚本
  • this.gameObject:当前脚本所挂载的物体
  • this.transform 等价于 this.gameObject.transform

  • 脚本的执行顺序和所挂载的游戏对象的顺序无关
  • 脚本执行默认的优先级都是0,值越小优先级越高
  • 可以在 Project Settings -> Script Execution Order 里调整脚本的执行顺序,先添加所需的脚本,再拖动、改值调整顺序
  • 脚本上添加的多个组件的顺序不影响功能

查找游戏对象的几种方法

Unity 中的游戏对象层级是通过 transform 属性来维持,组件的 name 等于组件所在的游戏对象的 name

  1. GameObject.Find 方法
    1
    2
    
     // 效率较低,尤其是场景中对象较多时;找不到隐藏的对象
     GameObject obj = GameObject.Find("ObjectName");
    
  2. GameObject.FindWithTag 方法
    1
    2
    3
    4
    5
    
     // 更高效;如果要查找的 Tag 未定位会报错;找不到隐藏的对象
     GameObject obj = GameObject.FindWithTag("Tag");
    
     // 返回一个数组。找不到隐藏的对象
     GameObject[] objs = GameObject.FindGameObjectsWithTag("Tag");
    
  3. Transform.Find
    1
    2
    3
    4
    5
    6
    7
    
     // 只能在直接子对象中查找,如果查找孙子对象需要用"a/b/c"这种形式;可以找到隐藏的子对象
     Transform t = transform.Find("a/b");
        
     // 如果被查找的对象自身被禁用,则 activeSelf / activeInHierarchy 都是 False
     // 如果被查找的对象自身未被禁用,而其父对象被禁用,那它也不显示,则 activeSelf 是 True,activeInHierarchy 是 False
     Debug.Log(t.gameObject.activeSelf);
     Debug.Log(t.gameObject.activeInHierarchy);
    
  4. GetComponent
    1
    2
    3
    4
    5
    6
    7
    8
    
     // 查找脚本所在的游戏对象上的组件,可以找到隐藏的对象上的组件
     AudioSource component = this.gameObject.GetComponent<AudioSource>();
    
     // 前面的 this 和 gameObject 都可以省去不写,简写成:
     AudioSource component = GetComponent<AudioSource>();
    
     // 判断组件是否启用
     Debug.Log(component.enabled);
    
  5. GetComponentInChildren
    1
    2
    
     // 递归查找所有子对象的组件,效率较低。默认情况下没有传true参数,不会查找被禁用的对象的组件;有传true时会被查找到
     MyComponent component = GetComponentInChildren<MyComponent>(true);
    
本文由作者按照 CC BY 4.0 进行授权