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游戏开发. 应该昨天表示,读了一 ...
随机推荐
- POP3与SMTP以及python实现邮件的发送
什么是POP3协议: POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议.它是因特网 ...
- BZOJ 3864 Hero meet devil (状压DP)
最近写状压写的有点多,什么LIS,LCSLIS,LCSLIS,LCS全都用状压写了-这道题就是一道状压LCSLCSLCS 题意 给出一个长度为n(n<=15)n(n<=15)n(n< ...
- ZrOJ #882. 画画
最后染成的图形一定一样的. 那么只用考虑两条路径在那些地方重合,重合的地方可以交换,这样答案就是2的重合次数次方.直接模拟就行了. qiang- CODE #include <bits/stdc ...
- 在 Linux 下使用 scp 命令
将文件或文件夹从网络上的一个主机拷贝到另一个主机当中去. here:在 Linux 下使用 scp 命令 摘要: scp 是安全拷贝协议(Secure Copy Protocol)的缩写, scp 是 ...
- php 中秒杀
控制器层 2 //秒杀 首先要判断库存 其次高并发 然后入库 3 public function goods_do() 4 { 5 $gid=input("get.gid"); 6 ...
- npm install、npm install --save与npm install --save-dev (转)
仅供学习参考,侵权删 以npm安装msbuild为例: npm install msbuild: 会把msbuild包安装到node_modules目录中 不会修改package.json 之后运行n ...
- CF788C The Great Mixing BFS+思维
这个模型十分巧妙啊,好题好题~ code: #include <bits/stdc++.h> #define N 3006 #define setIO(s) freopen(s" ...
- http 内容协商返回最适合的内容
内容协商返回最命适的内容AcceptAccept-CharsetAccept-EncodingAccept-LanguageContent-Language内容协商技术有以下 3 种类型.服务器驱动协 ...
- The 10th Shandong Provincial Collegiate Programming Contest
目录 Contest Info Solutions A. Calandar B. Flipping Game C. Wandering Robot D. Game on a Graph E. BaoB ...
- ansible的become
# ansible sudo 问题 官方下载centos7.6fcow2镜像不给直接远程ssh了,所以必须sudo,但是有的命令sudo也解决不了的如管道重定向还有多个命令组合. 解决办法: vim ...
