(一)Unity3D离散仿真引擎基础

1.解释游戏对象(GameObjects)和资源(Assets)的区别与联系

  • 游戏对象:游戏对象直接出现在游戏场景(scence)中,是资源整合的具体表现。游戏对象一般有玩家、敌人、游戏场景、摄像机等虚拟父类,这些父类没有实例化,而他们的子类实例化并包含了这些游戏对象,我们可以对这些对象进行操作。
    Tips:父类对象由子类实例化,涉及C#多态。
  • 资源:资源可以是我们自定义或者下载下来的素材,可以被多个游戏对象使用。有些资源可以作为模版并实例化为游戏对象。资源(Asset)文件夹通常包含:脚本(Scripts)、预设(Prefabs)、场景(Scences)、声音等。

2.分别总结资源、对象组织的结构(指资源的目录组织结构和游戏对象树的层次结构)

  • 资源的目录组织结构:每个Unity的项目包含一个资源文件夹。此文件夹的内容呈现在项目视图。这里存放着游戏的所有资源,在资源文件夹中,通常有对象、材质、场景、声音、预设、贴图、脚本、动作,在这些文件夹下可以继续进行划分。
  • 游戏对象树的层次结构:包含了每一个当前场景的所有游戏对象。其中一些是资源文件的实例,如3D模型和其他预制物体的实例。可以在层次结构视图中选择对象或者生成对象。当在场景中增加或者删除对象,层次结构视图中相应的对象则会出现或消失。想让一个游戏对象成为另一个的子对象,只需在层次视图中把它拖到另一个上即可。一个子对象将继承其父对象的移动和旋转属性。

3.查找脚本手册,了解 GameObject,Transform,Component 对象

1.分别翻译官方对三个对象的描述(Description)

  • GameObject:游戏对象是Unity中表示人物、道具、场景的基础物体,它们本事并没有实现任何功能,而只是一个容器,通过包含实现具体功能的Components,来完成相关的功能。每一个GameObjects必需含有Transform组件。本质上每一个组件是一个类的实例()。
  • Transform: transform变换组件决定了每个对象在场景中的位置,比例和旋转,每个对象都有一个变换组件。
  • Component: 组件(Component)是用来绑定到游戏对象(GameObject)上的一组相关属性。本质上每个组件是一个类的实例。

2.描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、 table 的部件

(本题目要求是把可视化图形编程界面与 Unity API 对应起来,当你在 Inspector 面板上每一个内容,应该知道对应 API。)
这里写图片描述
table的对象是GameObject,第一个选择框是activeSelf 属性,第二个文本框是对象名称,第三个选择框为static属性。第二行有Tag属性和Layer属性,第三行为prefabs(预设)属性。Transform属性包括position(位置),Rotation(旋转),Scale(比例)。Component对象有Transform,Mesh Filter,Box Collider,Mesh Renderer。

3.用 UML 图描述 三者的关系

这里写图片描述

4.整理相关学习资料,编写简单代码验证以下技术的实现:

  • 查找对象
  • 添加子对象
  • 遍历对象树
  • 清除所有子对象
//**查找对象**
//按名字查找
var cubeF = GameObject.Find("Cube");
if(null != cubeF){
    Debug.Log("find cube");
}
cubeF = GameObject.Find("/Cube") //Cube必须无父物体
if(null != cubeF){
    Debug.Log("find cube~");
}
//按标签查找
var sphere = GameObject.FindWithTag("Sphere");
if(null != sphere){
    Debug.Log("Sphere");
}

public GameObject[] respawns;
respawns = GameObject.FindGameObjectsWithTag("Respawn");

//**添加子对象** 
GameObject circle = GameObject.CreatePrimitive (PrimitiveType.Sphere);
circle.transform.position = new Vector3 (2, 2, 2);
circle.transform.parent = father.transform; // 这句是核心,father可换成任意父类

//**遍历对象树**
GameObject[] game = GameObject.FindObjectsOfType<GameObject>();
foreach (GameObject tem in game) {
    Debug.Log (tem.name);
}
//**清除所有子对象**
foreach (GameObject tem in game) {
    GameObject.Destroy (tem);
}

5.资源预设(Prefabs)与 对象克隆 (clone)

1.预设(Prefabs)有什么好处?

1.使对象和资源能够重复利用。
2. 相同的游戏对象可以用同一个预制来创建。
3. 对预设进行修改后,所有的游戏对象都会发生改变。
总体而言,预设资源储存了完整储存了对象的组件和属性,相当于模板,使用预制能够方便我们创建相同的游戏对象并赋予他们相同的行为,比如用一块砖创建一堵墙。

2.预设与对象克隆 (clone or copy or Instantiate of Unity Object) 关系?

1.克隆游戏对象需要场景中有被克隆对象,而创建预制只需事先创建预制即可,允许场景中一开始并不存在该游戏对象。
2.克隆出来的游戏对象并不会随着被克隆体的变化而发生变化,但是使用预制创建出来的对象会随着预制的改变而发生改变。

3.制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象

GameObject prefab = (GameObject)Instantiate (prefab1); // Instantiate返回类型为Object

6.尝试解释组合模式(Composite Pattern / 一种设计模式)。使用 BroadcastMessage() 方法, 向子对象发送消息。

组合模式又称为整体-部分模式,其将对象组织到树结构中,可以用来描述整体和部分的关系。组合模式可以使客户端将单纯元素和复合元素同等的看待。
组合模式的关键点是单纯对象和复合对象必须实现相同的接口,这也是组合模式能够将组合对象和简单对象进行一致处理的原因。

子对象:

    void ApplyDamage(float damage) {
        print(damage);
    }

父对象:

//public void BroadcastMessage(string methodName, object parameter = null, SendMessageOptions options = SendMessageOptions.RequireReceiver);
//Calls the method named methodName on every MonoBehaviour in this game object or any of its children.
    void Example() {
        gameObject.BroadcastMessage("ApplyDamage", 5.0F);
    }

猜你喜欢

转载自blog.csdn.net/vc43vc/article/details/81952615