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游戏开发. 应该昨天表示,读了一 ...
随机推荐
- python 图像识别的小应用
前些天看见了几个有趣的python项目,在自己实际测试和理解后贴一下代码. https://www.shiyanlou.com/courses/589/labs/1964/document 算法主要逻 ...
- jmeter+ant+jenkins搭建自动化测试环境(基于linux)
安装CentOS7操作系统 关闭系统防火墙 [root@localhost ~]# systemctl stop firewalld.service [root@localhost ~]# syste ...
- 037_自动添加防火墙规则,开启某些服务或端口(适用于 RHEL7)
#!/bin/bash#设置变量定义需要添加到防火墙规则的服务和端口号#使用 firewall-cmd --get-services 可以查看 firewall 支持哪些服务 service=&quo ...
- tomcat大文件上传
当服务器是Tomcat时,通过POST上传的文件大小的最大值为2M(2097152). 如果想修改该限制,修改方法如下: tomcat目录下的conf文件夹下,server.xml 文件中以下的位置中 ...
- 数据结构实验之图论八:欧拉回路(SDUT 3364)
Problem Description 在哥尼斯堡的一个公园里,有七座桥将普雷格尔河中两个岛及岛与河岸连接起来. 能否走过这样的七座桥,并且每桥只走一次?瑞士数学家欧拉最终解决了这个问题并由此创立了拓 ...
- 1635:【例 5】Strange Way to Express Integers
#include<bits/stdc++.h> #define ll long long using namespace std; ll n,m,a,lcm,now; bool flag; ...
- 中国传统色彩名录及其RGB值
- c isnormal
Returns whether x is a normal value: i.e., whether it is neither infinity, NaN, zero or subnormal. / ...
- PyTricks-使用namedtuple以及dataclass的方式定义类
from collections import namedtuple from dataclasses import dataclass # 以前简单的类可以使用namedtuple实现. Car = ...
- 区间dp括号匹配
POJ2955 匹配则加一,不需要初始化 //#include<bits/stdc++.h> #include<iostream> #include<cstdio> ...