Unity-3D-H2
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:一切附加到游戏物体的基类。
- GameObject:是Unity场景里面所有实体的基类.
- 描述下图中 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版本出图)
- 分别翻译官方对三个对象的描述(Description)
- 资源预设(Prefabs)与 对象克隆 (clone)
- 预设 (Prefab) 是一种资源 - 存储在工程视图 (Project View) 中可重复使用的游戏对象 (GameObject)。预设 (Prefabs) 可放入到多个场景中,且每个场景可使用多次。向场景添加一个预设 (Prefab) 时,就会创建它的一个实例。所有预设 (Prefab) 实例都链接到原始预设 (Prefab),实质上是原始预设的克隆。不管您的工程中有多少个实例,您对预设 (Prefab) 作薄出任何更改时,您会看到这些更改应用于所有实例。预设与对象
- 克隆 (clone or copy or Instantiate of Unity Object) 关系?
在Unity3D当中,为了快速复制出游戏对象,主要有克隆游戏对象与创建预制两种方法。
两者区别在于:
1、克隆游戏对象需要场景中有被克隆对象,而创建预制只需事先创建预制即可,允许场景中一开始并不存在该游戏对象。
2、克隆出来的游戏对象并不会随着被克隆体的变化而发生变化,但是使用预制创建出来的对象会随着预制的改变而发生改变。
- 制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象
public GameObject obj;
void Start () {
GameObject instance = (GameObject)Instantiate(obj.gameObject, transform.position, transform.rotation);
}
预设(Prefabs)有什么好处?
将table预制体放到 Resource 文件夹下使用
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;
}
}
3、思考题【选做】
- 微软 XNA 引擎的 Game 对象屏蔽了游戏循环的细节,并使用一组虚方法让继承者完成它们,我们称这种设计为“模板方法模式”。
- 为什么是“模板方法”模式而不是“策略模式”呢?
- 将游戏对象组成树型结构,每个节点都是游戏对象(或数)。
- 尝试解释组合模式(Composite Pattern / 一种设计模式)。
- 使用 BroadcastMessage() 方法,向子对象发送消息。你能写出 BroadcastMessage() 的伪代码吗?
- 一个游戏对象用许多部件描述不同方面的特征。我们设计坦克(Tank)游戏对象不是继承于GameObject对象,而是 GameObject 添加一组行为部件(Component)。
- 这是什么设计模式?
- 为什么不用继承设计特殊的游戏对象?
作业提交要求
- 仅能用博客或在线文档提交作业,建议使用 Github 提交代码和作业。不能使用docx、pdf等需要下载阅读的格式
- deadline 问课程 TA
Unity-3D-H2的更多相关文章
- Circular progress bar in Unity 3D
Circular progress bar in Unity 3D - UnityScripthttp://stackoverflow.com/questions/22662706/circular- ...
- Unity 3D 游戏上线之后的流水总结
原地址:http://tieba.baidu.com/p/2817057297?pn=1 首先.unity 灯光烘焙 :Unity 3D FBX模型导入.选项Model 不导入资源球.Rig 不导入骨 ...
- C#程序员整理的Unity 3D笔记(十五):Unity 3D UI控件至尊–NGUI
目前,UGUI问世不过半年(其随着Unity 4.6发布问世),而市面上商用的产品,UI控件的至尊为NGUI:影响力和广度(可搜索公司招聘Unity 3D,常常能看到对NGUI关键词). NGUI虽然 ...
- C#程序员整理的Unity 3D笔记(十三):Unity 3D基于组件的思想
如果你接触过<设计模式>.软件架构的编程思想,就会知道优秀的设计准则:“组合优于继承的”. 这句话很简短,但开始学习OOP的时候,真切的是—-不太好理解(以我个人当初学习为例). OOP的 ...
- 【图说】Eclipse与Unity 3D协同工作
原地址:http://blog.csdn.net/h570768995/article/details/9355313 Eclipse开发过程中总会碰到很多的难题,如何利用好工具帮助我们更快捷的开发也 ...
- C#程序员整理的Unity 3D笔记(十):Unity3D的位移、旋转的3D数学模型
遇到一个想做的功能,但是实现不了,核心原因是因为对U3D的3D数学概念没有灵活吃透.故再次系统学习之—第三次学习3D数学. 本次,希望实现的功能很简单: 如在小地图中,希望可以动态画出Player当前 ...
- 再议Unity 3D
一年前,偶发冲动,翻译了<[译] Unity3D游戏和facebook绑定(1:简介)>系列文章. 现在看有2个明显的好处, 一:给这个不温不火的博客带了top 3的人气: 二:我个人由此 ...
- [Unity 3D] Unity 3D 里的碰撞检测
Unity 3D里两个碰撞体之间发生碰撞可以用OnCollision族函数和OnTrigger族函数来获知和处理.Unity官方给出了两张可发生碰撞的组合表: Collision detection ...
- [Unity 3D] Unity 3D 性能优化 (一)
听到过很多用Unity 3D开发游戏的程序员抱怨引擎效率太低,资源占用太高,包括我自己在以往项目的开发中也头疼过.最近终于有了空闲,可以仔细的研究一下该如何优化Unity 3D下的游戏性能.其实国外有 ...
- Unity 3D 建立开发环境
之后的基本方向 ios游戏开发,基础教程http://www.devdiv.com/unity_d_-thread-128068-1-1.html,学习Unity 3D游戏开发. 应该昨天表示,读了一 ...
随机推荐
- .NET Core 3时代DevExpress Winforms v19.2增强TreeList控件
DevExpress Winforms Controls内置140多个UI控件和库,完美构建流畅.美观且易于使用的应用程序.无论是Office风格的界面,还是分析处理大批量的业务数据,DevExpre ...
- Eclipse使用技巧小结
前言:自学Java以来,就一直用eclipse,这款ide深受广大新手和大牛喜爱.学会使用其中的技巧,越用越熟练,开发也就越快捷方便.话不多说,直接上小结吧. 一.快捷键 1.提示 :A|t+/ 2. ...
- Docker搭建Redis一主两从三哨兵
作者:oscarwin juejin.im/post/5d26b03de51d454fa33b1960 这次实验准备了三台云主机,系统为Debian,ip分别为:35.236.172.131 ,35. ...
- Oracle 11g关闭用户连接审计
sys.aud$表数据量增长较快.这时,不想关闭数据库的审计,但是又不想频繁的清理sys.aud$表.可进行如下操作关闭数据库连接的审计 noaudit connect;
- VS tools
官方下载,有免费也有试用的 http://visualstudiogallery.msdn.microsoft.com/ VS2012简单的使用感受+插件推荐 http://blog.sina.com ...
- 电路IO驱动能力
驱动能力 电源驱动能力 -> 输出电流能力 -> 输出电阻 指输出电流的能力,比如芯片的IO在高电平时的最大输出电流是4mA -> 该IO口的驱动驱动能力为4mA 负载过大(小电阻) ...
- error:Cannot pull with rebase
原文文链接:https://blog.csdn.net/u012385190/article/details/70670213git 执行git pull –rebase报错误如下: error: C ...
- python 简单了解一下 描述器
1.描述器是什么? 在Python中描述器也被称为描述符, 1)描述器实际上是任何新式类(新式类是继承自 type 或者 object 的类),这种类至少实现了3个特殊的方法__get__, __se ...
- 对官网vue事件修饰符串联的顺序如何理解?
官网有一个提醒:使用修饰符时,顺序很重要:相应的代码会以同样的顺序产生.因此,用 v-on:click.prevent.self 会阻止所有的点击,而 v-on:click.self.prevent ...
- Coarse-to-Fine超分辨率相关
1.A Coarse-to-Fine Subpixel Registration Method to Recover Local Perspective Deformation in the Appl ...