3D游戏编程与设计 离散仿真引擎基础 作业与练习

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

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

2. 下载几个游戏案例,分别总结资源、对象组织的结构(指资源的目录组织结构与游戏对象树的层次结构)

  • 资源的目录组织结构:
    Assets

    • Editor 自写的灵活方便插件
    • Editor_NGUI 较大型三方的插件(前面加上Editor是为了让所有编辑器都集中在一块)
    • Editor_WaypointTool 较大型三方的插件
    • Gizmos 使用GIZMOS所需要的标志等临时文件
    • StreamingAssets (包括JsonData目录/Assetbundle目录/各种只读文件预储存目录,这个目录将自动打包到导出程序,用Application.streamingAssetsPath读取)
    • Models 模型文件,其中会包括自动生成的材质球文件
    • Others 其他类型的文件(一般作为不常修改的文件类型,例如添加的Shader、物理材质、动画文件。)若认为是比较常用的话,可以提取成一个文件夹。
    • Plugins 主要是DLL的外部插件文件,例如JsonFx、SmartFoxClient等
      Prefabs 预储存文件
    • Resources 动态加载的资源文件,一般这里只用少量,多的话,需要自己打ASSETBUNDLE包,有选择性的动态加载
    • Scenes 场景文件
    • Scripts 脚本代码文件
    • Sounds 音效文件
    • Textures 所有的贴图
    • Z_Test 临时测试文件,加Z是让它放到最下面。放到一起的好处是删除的时候可以任意直接删掉,不会影响其他部分的东西。
  • 游戏对象树的层次结构:
    每个游戏对象由多个组件(component)组成

3。编写一个代码,使用 debug 语句来验证 MonoBehaviour 基本行为或事件触发的条件

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour {
    void Awake () {
        Debug.Log ("Awake");
    }

    // Use this for initialization
    void Start () {
        Debug.Log ("Start");
    }

    // Update is called once per frame
    void Update () {
        Debug.Log ("Update");
    }

    void FixedUpdate () {
        Debug.Log ("FixedUpdate");
    }

    void LateUpdate () {
        Debug.Log ("LateUpdate");
    }

    void OnGUI () {
        Debug.Log ("OnGUI");
    }


    void OnDisable () {
        Debug.Log ("OnDisable");
    }

    void onEnable(){
        Debug.Log("OnEnable");
    }
}

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

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

    1.GameObjects是Unity中代表角色,道具和风景的基本对象。它们本身并不是很完整,但它们充当组件的容器实现了具体的功能。
    2.Transform变换组件决定了每个对象在场景中的位置,比例和旋转,每个对象都有一个变换组件。
    3.组件(Component)是用来绑定到游戏对象(Game Object)上的一组相关属性。本质上每个组件是一个类的实例。

  • 描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、 table 的部件:
    1.table的属性:第一个选择框是activeSelf 属性,第二个文本框是对象名称,第三个选择框为static属性。第二行有Tag属性和Layer属性,第三行是prefabs(预设)属性。
    2.table的transform属性:包括position(位置),Rotation(旋转),Scale(比例)。
    3.table的部件:chair1 chair2 chair3
  • 用 UML 图描述 三者的关系
    3D游戏编程与设计 离散仿真引擎基础 作业与练习_第1张图片

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

  • 查找对象

    using UnityEngine;
    using System.Collections;
    
    public class Test : MonoBehaviour {
         public GameObject a;
         public GameObject b;
         public GameObject[] c;
         void Start() {
             b = GameObject.FindWithTag("Respawn");//通过标签名获取单个对象
             c = GameObject.FindGameObjectsWithTag("Respawn");//通过标签获取多个对象
         }
    }
  • 添加子对象
using UnityEngine;
using System.Collections;

public class example : MonoBehaviour{
    void Start() {
        GameObject plane = GameObject.CreatePrimitive(PrimitiveType.Plane);
        GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
        cube.transform.position = new Vector3(0, 0.5F, 0);
        GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        sphere.transform.position = new Vector3(0, 1.5F, 0);
        GameObject capsule = GameObject.CreatePrimitive(PrimitiveType.Capsule);
        capsule.transform.position = new Vector3(2, 1, 0);
        GameObject cylinder = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
        cylinder.transform.position = new Vector3(-2, 1, 0);
    }
}
  • 遍历对象树
foreach (Transform child in transform) {
    Debug.Log(child.gameObject.name);
}
  • 清除所有子对象
foreach (Transform child in transform) {
Destroy(child.gameObject);
}

资源预设(Prefabs)与 对象克隆 (clone)
预设是一个非常容易复用的类模板,可以迅速方便创建大量相同属性的对象、操作简单,代码量少,减少出错概率。修改的复杂度降低,一旦需要修改所有相同属性的对象,只需要修改预设即可,所有通过预设实例化的对象都会做出相应变化。而克隆只是复制一个一模一样的对象,这个对象独立于原来的对象,在修改的过程中不会影响原有的对象,这样不方便整体改动。

制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象:
GameObject prefab = (GameObject)Instantiate (prefab1);

尝试解释组合模式(Composite Pattern / 一种设计模式)使用 BroadcastMessage() 方法向子对象发送消息
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。组合模式是将对象组合成树形结构以表示“部分-整体”的层次结构,它使得用户对单个对象和组合对象的使用具有一致性。

//父对象:
    void test(){
        Debug.Log ("Hello world");
    }
    // Use this for initialization
    void Start () {
        this.BroadcastMessage ("test");
    }   
//子对象
   void test(){
        Debug.Log ("Hello world");
    }

你可能感兴趣的:(3D游戏编程)