1、简答题【建议做解释 游戏对象(GameObjects) 和 资源(Assets)的区别与联系。

    •   游戏对象:直接出现在游戏的场景中,是资源整合的具体表现,对象通过层次结构来组织,通过整体-部分的关系构成层次结构。资源:资源通过文件夹的形式组织,包含常用的图像,视频,脚本文件,预制文件等等,可以被一个或者多个对象使用。
  • 下载几个游戏案例,分别总结资源、对象组织的结构(指资源的目录组织结构与游戏对象树的层次结构)
    • 资源的目录组织结构主要包含文件、材质、模型、预制件、场景、脚本、标准资源这几个部分。资源里面又包含了图片,游戏需要用到的音乐等等。游戏对象树就如同Windows的文件资源管理器一样,树目录结构:一个游戏对象(文件夹)包含多个子对象(子文件夹),子对象(子文件夹)又可以继续包含多个子对象(子文件夹)。
  • 编写一个代码,使用 debug 语句来验证 MonoBehaviour 基本行为或事件触发的条件
    • 基本行为包括 Awake() Start() Update() FixedUpdate() LateUpdate()
    • 常用事件包括 OnGUI() OnDisable() OnEnable()
    • using System.Collections;
      using System.Collections.Generic;
      using UnityEngine; public class testBehavior : MonoBehaviour
      {
      void Start(){
      Debug.Log("Start");
      } void Awake(){
      Debug.Log("Awake");
      } 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");
      }
      }

        

  • 查找脚本手册,了解 GameObject,Transform,Component 对象
    • 分别翻译官方对三个对象的描述(Description)

      • GameObject:是Unity场景里面所有实体的基类.
        Transform:物体的位置、旋转和缩放。
        Component:一切附加到游戏物体的基类。
    • 描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、 table 的部件
      • 本题目要求是把可视化图形编程界面与 Unity API 对应起来,当你在 Inspector 面板上每一个内容,应该知道对应 API。
      • 例如:table 的对象是 GameObject,第一个选择框是 activeSelf 属性。
      • activeSelf:修改对象的名称,动静态等属性(图中对象名称是table,动态)
        Transform:调整对象的位置、面向方向、大小(默认位置大小)
        Box Collider:调整坐标系的位置、大小
        Add Component:给对象增加行为

    • 用 UML 图描述 三者的关系(请使用 UMLet 14.1.1 stand-alone版本出图)
  • 资源预设(Prefabs)与 对象克隆 (clone)
  • 预设(Prefabs)有什么好处?

    • 预设 (Prefab) 是一种资源 - 存储在工程视图 (Project View) 中可重复使用的游戏对象 (GameObject)。预设 (Prefabs) 可放入到多个场景中,且每个场景可使用多次。向场景添加一个预设 (Prefab) 时,就会创建它的一个实例。所有预设 (Prefab) 实例都链接到原始预设 (Prefab),实质上是原始预设的克隆。不管您的工程中有多少个实例,您对预设 (Prefab) 作薄出任何更改时,您会看到这些更改应用于所有实例。预设与对象
    • 克隆 (clone or copy or Instantiate of Unity Object) 关系?
    • 在Unity3D当中,为了快速复制出游戏对象,主要有克隆游戏对象与创建预制两种方法。

      两者区别在于:

      1、克隆游戏对象需要场景中有被克隆对象,而创建预制只需事先创建预制即可,允许场景中一开始并不存在该游戏对象。

      2、克隆出来的游戏对象并不会随着被克隆体的变化而发生变化,但是使用预制创建出来的对象会随着预制的改变而发生改变。

    • 制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象
    • 将table预制体放到 Resource 文件夹下使用

      • public GameObject obj;
        void Start () {
        GameObject instance = (GameObject)Instantiate(obj.gameObject, transform.position, transform.rotation);
        }

2、 编程实践,小游戏

  • 游戏内容: 井字棋 或 贷款计算器 或 简单计算器 等等
  • 技术限制: 仅允许使用 IMGUI 构建 UI
  • 作业目的:
    • 了解 OnGUI() 事件,提升 debug 能力
    • 提升阅读 API 文档能力
    • using System.Collections;
      using System.Collections.Generic;
      using UnityEngine; public class Chess : MonoBehaviour { private int turn = 1;
      private int[,] grid = new int[3, 3]; // 重新开始游戏
      void Start () {
      Restart();
      } void Restart()
      {
      turn = 1;
      for (int i = 0; i < 3; ++i)
      {
      for (int j = 0; j < 3; ++j)
      {
      grid[i, j] = 0;
      }
      }
      } void OnGUI()
      {
      //设置button中字体的大小
      GUI.skin.button.fontSize = 20; //设置label中字体大小和颜色
      GUIStyle style = new GUIStyle();
      style.fontSize = 40;
      style.normal.textColor = new Color(255, 255, 255); //判断是否点击Restart按钮
      if(GUI.Button(new Rect(360, 500, 80, 80), "Restart")){
      Restart();
      } //判断游戏是否结束
      int result = judge();
      if (result == 1)
      {
      GUI.Label(new Rect(340, 170, 100, 50), "O wins!", style);
      }
      else if (result == 2)
      {
      GUI.Label(new Rect(340, 170, 100, 50), "X wins!", style);
      }else if (result == 3)
      {
      GUI.Label(new Rect(300, 170, 100, 50), "GameOver!", style);
      } //生成棋盘并判断格子是否被点击
      for (int i=0; i<3; i++)
      {
      for(int j=0; j<3; j++) {
      if (grid[i, j] == 1)
      {
      GUI.Button(new Rect(280 + i * 80, 220 + j * 80, 80, 80), "O");
      }else if (grid[i, j] == 2)
      {
      GUI.Button(new Rect(280 + i * 80, 220 + j * 80, 80, 80), "X");
      }else if (GUI.Button(new Rect(280 + i * 80, 220 + j * 80, 80, 80), "")&&result==0)
      {
      if (turn == 1)
      {
      grid[i, j] = 1;
      }else
      {
      grid[i, j] = 2;
      }
      turn = -turn;
      }
      }
      }
      } int judge()
      {
      // 横向连线
      for (int i = 0; i < 3; ++i)
      {
      if (grid[i, 0] != 0 && grid[i, 0] == grid[i, 1] && grid[i, 1] == grid[i, 2])
      {
      return grid[i, 0];
      }
      }
      //纵向连线
      for (int j = 0; j < 3; ++j)
      {
      if (grid[0, j] != 0 && grid[0, j] == grid[1, j] && grid[1, j] == grid[2, j])
      {
      return grid[0, j];
      }
      }
      //斜向连线
      if (grid[1, 1] != 0 &&
      grid[0, 0] == grid[1, 1] && grid[1, 1] == grid[2, 2] ||
      grid[0, 2] == grid[1, 1] && grid[1, 1] == grid[2, 0])
      {
      return grid[1, 1];
      }
      //全部格子都被点击
      bool allClick = true;
      for (int i=0; i<3; i++)
      {
      for (int j=0; j<3; j++)
      {
      if (grid[i, j] == 0)
      {
      allClick = false;
      }
      }
      }
      if (allClick)
      return 3; return 0;
      }
      }

        视频链接:https://github.com/IYreality/Homework/blob/master/3-1/unity-3D/second/%E4%BA%95%E5%AD%97%E6%A3%8B%E6%BC%94%E7%A4%BA.wmv

3、思考题【选做】

  • 微软 XNA 引擎的 Game 对象屏蔽了游戏循环的细节,并使用一组虚方法让继承者完成它们,我们称这种设计为“模板方法模式”。

    • 为什么是“模板方法”模式而不是“策略模式”呢?
  • 将游戏对象组成树型结构,每个节点都是游戏对象(或数)。
    • 尝试解释组合模式(Composite Pattern / 一种设计模式)。
    • 使用 BroadcastMessage() 方法,向子对象发送消息。你能写出 BroadcastMessage() 的伪代码吗?
  • 一个游戏对象用许多部件描述不同方面的特征。我们设计坦克(Tank)游戏对象不是继承于GameObject对象,而是 GameObject 添加一组行为部件(Component)。
    • 这是什么设计模式?
    • 为什么不用继承设计特殊的游戏对象?

作业提交要求

  • 仅能用博客或在线文档提交作业,建议使用 Github 提交代码和作业。不能使用docx、pdf等需要下载阅读的格式
  • deadline 问课程 TA

Unity-3D-H2的更多相关文章

  1. Circular progress bar in Unity 3D

    Circular progress bar in Unity 3D - UnityScripthttp://stackoverflow.com/questions/22662706/circular- ...

  2. Unity 3D 游戏上线之后的流水总结

    原地址:http://tieba.baidu.com/p/2817057297?pn=1 首先.unity 灯光烘焙 :Unity 3D FBX模型导入.选项Model 不导入资源球.Rig 不导入骨 ...

  3. C#程序员整理的Unity 3D笔记(十五):Unity 3D UI控件至尊–NGUI

    目前,UGUI问世不过半年(其随着Unity 4.6发布问世),而市面上商用的产品,UI控件的至尊为NGUI:影响力和广度(可搜索公司招聘Unity 3D,常常能看到对NGUI关键词). NGUI虽然 ...

  4. C#程序员整理的Unity 3D笔记(十三):Unity 3D基于组件的思想

    如果你接触过<设计模式>.软件架构的编程思想,就会知道优秀的设计准则:“组合优于继承的”. 这句话很简短,但开始学习OOP的时候,真切的是—-不太好理解(以我个人当初学习为例). OOP的 ...

  5. 【图说】Eclipse与Unity 3D协同工作

    原地址:http://blog.csdn.net/h570768995/article/details/9355313 Eclipse开发过程中总会碰到很多的难题,如何利用好工具帮助我们更快捷的开发也 ...

  6. C#程序员整理的Unity 3D笔记(十):Unity3D的位移、旋转的3D数学模型

    遇到一个想做的功能,但是实现不了,核心原因是因为对U3D的3D数学概念没有灵活吃透.故再次系统学习之—第三次学习3D数学. 本次,希望实现的功能很简单: 如在小地图中,希望可以动态画出Player当前 ...

  7. 再议Unity 3D

    一年前,偶发冲动,翻译了<[译] Unity3D游戏和facebook绑定(1:简介)>系列文章. 现在看有2个明显的好处, 一:给这个不温不火的博客带了top 3的人气: 二:我个人由此 ...

  8. [Unity 3D] Unity 3D 里的碰撞检测

    Unity 3D里两个碰撞体之间发生碰撞可以用OnCollision族函数和OnTrigger族函数来获知和处理.Unity官方给出了两张可发生碰撞的组合表: Collision detection ...

  9. [Unity 3D] Unity 3D 性能优化 (一)

    听到过很多用Unity 3D开发游戏的程序员抱怨引擎效率太低,资源占用太高,包括我自己在以往项目的开发中也头疼过.最近终于有了空闲,可以仔细的研究一下该如何优化Unity 3D下的游戏性能.其实国外有 ...

  10. Unity 3D 建立开发环境

    之后的基本方向 ios游戏开发,基础教程http://www.devdiv.com/unity_d_-thread-128068-1-1.html,学习Unity 3D游戏开发. 应该昨天表示,读了一 ...

随机推荐

  1. VirtualBox Linux虚拟机 网络设置 centos

    VirtualBox网络设置成桥接 进去系统打开终端 vi /etc/sysconfig/network-scripts/ifcfg-enp0s3 用Vim编辑器打开配置文件,输入命令:vi /etc ...

  2. 你的VCL界面开发不知所措?这款工具绝对超出预料

    DevExpress VCL Controls是 Devexpress公司旗下最老牌的用户界面套包.所包含的控件有:数据录入,图表,数据分析,导航,布局,网格,日程管理,样式,打印和工作流等,让您快速 ...

  3. python字典的增删改查操作

    一.字典  (键值对) 1.字典的基本格式:{key1:1,key2:2} 2.字典里的键必须是不可变的(如:数字,字符串,元组,bool值);值是可变的,可用数字,字符串,列表,字典等. 3.字典里 ...

  4. 富文本编辑器粘贴word内容

    很多时候我们用一些管理系统的时候,发布新闻.公告等文字类信息时,希望能很快的将word里面的内容直接粘贴到富文本编辑器里面,然后发布出来.减少排版复杂的工作量. 下面是借用百度doc 来快速实现这个w ...

  5. P4717 快速沃尔什变换FWT 模板题

    #include <bits/stdc++.h> using namespace std; #define rep(i,a,n) for (int i=a;i<n;i++) #def ...

  6. linux下查看内存频率,内核函数,cpu频率

    查看CPU: cat /proc/cpuinfo # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理 ...

  7. bash基础之三配置文件

    一.shell的两种登录方式: 1.交互式登录:(1)直接通过终端输入账号密码登录(2)使用“su - UserName” 或“su -l Username”切换的用户执行顺序:/etc/profil ...

  8. Jenkins+Ant+Git+Jmeter接口自动化

    一.服务器分别安装JKD.Jenkins.Ant.Git.Jmeter 1.JKD安装参考:https://www.cnblogs.com/xiaoxitest/p/6168045.html 2.Je ...

  9. 基于nodejs将mongodb的数据实时同步到elasticsearch

    一.前言 因公司需要选用elasticsearch做全文检索,持久化存储选用的是mongodb,但是希望mongodb里面的数据发生改变可以实时同步到elasticsearch上,一开始主要使用ela ...

  10. mysql8.0.17gtid方式实现主从同步

    数据库的安装: [root@node1 8.0.17]# rpm -ivh mysql-community-common-8.0.17-1.el7.x86_64.rpm 警告:mysql-commun ...