一. 简答题
GameObjects: 游戏对象,即游戏中的最基本单位,游戏中的每一个对象都是游戏对象。它相当于一个容器,本身并无太多属性,需添加各种组件,资源后才能达到设计者的所希望的游戏行为目的。
Assets: 指可应用于Unity上的各种资源,为游戏添加各种属性,从而实现目标效果;同时,一个Unity Project的Assets文件夹指存储于本地计算机中的各种图片,预制,script等文件的总和。一个Assets中可以包含多个GameObject,GameObject从逻辑上讲存储于Assets文件夹中。
游戏结构目录:
Assets
- Scene 保存游戏场景
- Game 保存美术资源
- Materials 保存材质球,用于调整颜色等
- Prefabs 保存预制,即游戏对象的模板,方便克隆
- Model 模型
- Animations 保存动画文件
- Audio 音频文件
- Textures 贴图文件
- UI UI文件
- Scripts 脚本文件
- Plugins 插件
- Editor 保存编辑器类文件
MonoBehaviour 基本行为触发条件:
代码如下:
// Use this for initialization void Start () { Debug.Log("init Start"); } // Update is called once per frame void Update () { Debug.Log("init Update"); } void Awake() { Debug.Log("init Awake"); } void FixedUpdate() { Debug.Log("init FixedUpdate"); } void LateUpdate() { Debug.Log("init LateUpdate"); } void OnGUI() { Debug.Log("init OnGUI"); } void OnDisable() { Debug.Log("init OnDisable"); } void OnEnable() { Debug.Log("init OnEnable"); }
Start:
Per frame:
End:
结论:
- Awake(): 当脚本实例被载入时调用;
- Start(): 在Update()前被调用一次;
- Update(): 行为启用时,每一帧被调用一次;
- FixedUpdate(): 行为启用时,每一时间片被调用;
- LateUpdate(): 行为启用时,Update()之后被调用;
- OnGUI(): 每帧调用多次,响应GUI事件;
- OnEnable(): 当对象变为启用并激活时,调用该函数;
- OnDisable(): 当对象变为禁用或不活动时,调用该函数。
-
Description
- GameObject: Unity 场景中所有实体的基类。
- Transform: 一个对象的位置,旋转和大小。
- Component: 所有附加到游戏对象的属性的基类。
描述属性
table 的对象是 GameObject :
第一个选择框是 GameObject.activeSelf 属性,表示该对象是否被选中。
- 第二个选择框是 GameObject.isStatic 属性,表示对象是否为静态。
- Tag 是 GameObject.tag 属性,是游戏对象的标签,多选。
- Layer 是 GameObject.layer 属性,游戏对象所在的图层,范围为[0…31]。
prefabs 是 PrefabUtility.GetPrefabObject 属性。
Transform 属性:
第一行属性框为 Transform.position 属性,可以调整游戏对象的空间位置。
- 第二行属性框为 Transform.rotation 属性,调整游戏对象在各个方向上的旋转角度。
第三行属性框为 Transform.localScale 属性,调整游戏对象的大小。
table 的部件:
Mesh Filter: 网格过滤器,从资源中获取网格,并将其传递到网格渲染器,加以渲染后在屏幕上呈现。
- Box Collider: 箱子碰撞器,指定一个立方体的基本原始碰撞范围。
Mesh Renderer: 网格渲染器,从网格过滤器中获取几何图形并将其渲染到由该对象的变换组件定义的位置。
UML
简单代码
查找对象
新建项目,其中有 Sphere 游戏对象,代码如下:
void Start() { Debug.Log("init start"); } void FixedUpdate() { var x = GameObject.Find("Sphere"); if (x.name != null) { Debug.Log("find the gameobject"); } else { Debug.Log("Not found"); } }
结果如下:
添加子对象
代码如下:
void Start() { GameObject sph = GameObject.Find("Sphere"); GameObject child = GameObject.CreatePrimitive(PrimitiveType.Cube); child.transform.parent = sph.transform; Debug.Log("Success"); }
结果如下:
遍历对象树
代码如下:
GameObject obj = GameObject.Find("Sphere"); print("父对象名称为:" + obj.name + " 有" + obj.transform.childCount + "个子对象"); int i = 0; while (i < obj.transform.childCount) { Transform child = obj.transform.GetChild(i); print("这是第: " + i + " 个子对象, 名称为: " + child.name); i++; }
结果如下:
https://img-blog.youkuaiyun.com/20180327110756385?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0R1a2VfU3Rhcg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70” alt=”结果” title=”” />/result3.jpg)
清除所有子对象
代码如下:
GameObject obj = GameObject.Find("Sphere"); print("父对象名称为:" + obj.name + " 有" + obj.transform.childCount + "个子对象"); int i = 0; while (i < obj.transform.childCount) { Transform child = obj.transform.GetChild(i); print("这是第: " + i+1 + " 个子对象, 名称为: " + child.name); GameObject pchild = GameObject.Find(child.name); GameObject.Destroy(pchild); i++; }
预设与对象克隆
Prefabs: 预制可以存储一个带有组件和属性的 GameObject 作为模板,当想创建新的实例时,可以直接拖动模板进行创建。对预制做的修改可以应用到由该模板生成的所有实例中,也可以单独编辑每一个实例。
总的来说,预设和对象克隆都能生成新的对象实例,但相比较而言,由 clone 生成的实例,编辑原对象时,就不能应用到所有实例中。
预制 table :
public GameObject prefab; void Start() { Instantiate(prefab, new Vector3(2.0F, 0, 0), Quaternion.identity); }
组合模式
组合模式:
定义:组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对组合对象和单个对象的使用具有一致性。
包含三个部分:抽象构件,叶子构件和容器构件。
目的即是使得对根节点的调用方法对叶子节点同样适用,使得工作效率更高。
代码:
有三种发送消息的函数,其中BroadcastMessage()由父类发送给子类,括号里面:第一个参数为回应的函数,第二个参数为传递给回应函数的参数。
void Start () { gameObject.BroadcastMessage("MySon","I am your father"); } void MySon(string ss) { Debug.Log("I am your son"); }
结果: