Unity3D课程学习笔记(一)

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

官方文档对Assets的解释:An asset is representation of any item that can be used in your game or project. An asset may come from a file created outside of Unity, such as a 3D model, an audio file, an image, or any of the other types of file that Unity supports. There are also some asset types that can be created within Unity, such as an Animator Controller, an Audio Mixer or a Render Texture.

官方文档对GameObjects的解释:GameObjects are the fundamental objects in Unity that represent characters, props and scenery. They do not accomplish much in themselves but they act as containers for Components, which implement the real functionality.

解释区别与联系:对象一般是一些资源的集合体,是资源整合的具体表现,而资源可以被多个对象使用。游戏对象一般为玩家,敌人,环境等,而资源可组成游戏中所有的对象,一般包括声音,脚本,材质等,资源可以被多个对象使用,资源作为模版,可实例化游戏中具体的对象。

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

游戏:Beat-Plane:如下图所示结构,资源中可以放置图像、声音、脚本等。

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

测试代码如下所示:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Test : MonoBehaviour {void Awake() {Debug.Log ("In Awake!");}// Use this for initializationvoid Start () {Debug.Log ("In Awake!");}// Update is called once per framevoid Update () {Debug.Log ("In Update!");}void FixedUpdate() {Debug.Log ("In FixedUpdate!");}void LateUpdate() {Debug.Log ("In LateUpdate!");}void OnGUI() {Debug.Log ("In OnGUI!");}void OnDisable() {Debug.Log ("In OnDisable!");}void OnEnable() {Debug.Log ("In OnEnable!");}
}

则该代码运行后在Console中显示如下所示:

MonoBehaviour 基本行为或事件触发的条件(按执行顺序):

Awake() : 当前控制脚本实例被装载的时候调用。一般用于初始化整个事例使用。(建议少用,此刻物体还未实例化出来,会影响程序的执行顺序)

Start() : 当前控制脚本第一次执行Update之前调用。

Update() : 每帧都执行一次,是最常用的时间函数。

FixedUpdate() : 每固定帧绘制时执行一次,和Update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率底下的时候FixedUpdate的调用次数就会下降。FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关,而Update比较适合做控制。(放置游戏基本物理行为的代码,在Update之后执行)

LateUpdate() : 在每帧执行完毕调用,他在所有Update结束后才调用,比较适合于命令脚本的执行。官网上例子是摄像机的跟随,都是在所有Update操作完才跟进摄像机,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。

OnEnable() : 当对象变为可用或激活状态时此函数被调用,OnEnable不能用于协同程序。(物体启动时被调用)

OnDisable() : 当对象变为不可用或非激活状态时此函数被调用。当物体销毁时它被调用,并且可用于任意清理代码。当脚本编译完成之后被重新加载时,OnDisable将被调用,OnEnable在脚本被载入后调用。(物体被禁用时调用)

OnGUI() : 绘制GUI时候触发。一般在这个函数里绘制GUI菜单。(GUI显示函数只能在OnGUI中调用)

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

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

GameObject :GameObjects are the fundamental objects in Unity that represent characters, props and scenery. They do not accomplish much in themselves but they act as containers for Components, which implement the real functionality.

翻译:游戏对象是Unity中表示游戏角色,游戏道具和游戏场景的基本对象。他们自身无法完成许多功能,但是他们构成了那些给予他们实体功能的组件的容器。

Transform :The Transform component determines the Position, Rotation, and Scale of each object in the scene. Every GameObject has a Transform.

翻译: 转换组件决定了游戏场景中每个游戏对象的位置,旋转和缩放比例。每个游戏对象都有转换组件。

Component :Components are the nuts & bolts of objects and behaviors in a game. They are the functional pieces of every GameObject.

翻译: 组件是游戏中对象和行为的细节。它是每个游戏对象的功能部分。

4.2.描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、 table 的部件

Table对象的属性:Tag属性用于区分游戏中不同类型的对象,Tag可以理解为一类元素的标记,可用GameObject.FindWithTag()来查询对象。GameObject.FindWithTag()只返回一个对象,如果想获取多个Tag为某值的对象,应该用GameObject.FindGameObjectsWithTag()。第一个选择框是activeSelf属性。Layer属性默认是Default。

Table的Transform属性:Position、Rotation、Scale

Table的部件:Mesh Filter、Box Collider、Mesh Renderer

4.3.用UML图描述三者的关系:

UML图如下所示:

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

查找对象:

通过名字查找:

public static GameObject Find(string name)

通过标签查找单个对象:

public static GameObject FindWithTag(string tag)

通过标签查找多个对象:

public static GameObject[] FindGameObjectsWithTag(string tag)

添加子对象:

public static GameObect CreatePrimitive(PrimitiveTypetype)

遍历对象树:

foreach (Transform child in transform) {Debug.Log(child.gameObject.name);}

清除所有子对象:

foreach (Transform child in transform) {Destroy(child.gameObject);}

6.资源预设(Prefabs)与 对象克隆 (clone)

6.1.预设(Prefabs)有什么好处?

预设类似于一个模板,通过预设可以创建相同属性的对象,这些对象和预设关联。一旦预设发生改变,所有通过预设实例化的对象都会产生相应的变化(适合批量处理)。

6.2.预设与对象克隆 (clone or copy or Instantiate of Unity Object) 关系?

对象克隆不受克隆本体的影响,因此A对象克隆的对象B不会因为A的改变而相应改变。

6.3.制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class shilihua : MonoBehaviour {public GameObject MyTable; // Use this for initializationvoid Start () {GameObject instance = (GameObject)Instantiate(MyTable, transform.position, transform.rotation);}// Update is called once per framevoid Update () {}
}

7.尝试解释组合模式(Composite Pattern / 一种设计模式)。使用 BroadcastMessage() 方法向子对象发送消息

组合模式允许用户将对象组合成树形结构来表现”部分-整体“的层次结构,使得客户以一致的方式处理单个对象以及对象的组合。组合模式实现的最关键的地方是——简单对象和复合对象必须实现相同的接口。这就是组合模式能够将组合对象和简单对象进行一致处理的原因。

子类对象方法:

  void recallMessage() {print("Hello!");}

父类对象方法:

 void Start () {this.BroadcastMessage("recallMessage");}

8.编程实践,井字棋小游戏

井字棋小游戏其实只是一个2D游戏,具体实现过程并不是很难,主要是要掌握GUI的一些API的使用

本次作业主要用到GUI的一些API,GUI是指Graphic User Interface,是图形用户接口,主要提供可视化界面方面的接口

具体代码实现如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Chess : MonoBehaviour {private int [,] chessBoard = new int[3,3];private int turn = 1;// Use this for initializationvoid Start () {Reset ();}void OnGUI() {if(GUI.Button(new Rect(400,50,150,50),"RESET GAME")) {Reset();}//First judge the result.int State = checkWhetherIsWin ();if (State == 2) {GUI.Label (new Rect (400, 105, 50, 50), "X Win!");} else if (State == 1) {GUI.Label (new Rect (400, 105, 50, 50), "O Win!");} else if (State == 0) {GUI.Label (new Rect (400, 105, 50, 50), "Tied!");}//The Game is not over,continue.for(int i = 0 ; i < 3 ; i++) {for (int j = 0; j < 3; j++) {//If the number of the chessboard is 1, it represents O, else 2 represents X.if (chessBoard[i,j] == 1) {GUI.Button (new Rect (400 + 50 * i, 130 + 50 * j, 50, 50), "O");} else if (chessBoard[i,j] == 2) {GUI.Button (new Rect (400 + 50 * i, 130 + 50 * j, 50, 50), "X");}//Click operation.if(GUI.Button(new Rect(400+50*i,130+50*j,50,50),"")) {if(State == 3) {if (turn == 1) {chessBoard [i, j] = 1;} else if (turn == -1) {chessBoard [i, j] = 2;}turn = -turn;}}}}}int checkWhetherIsWin() {//Check the rows.for (int i = 0; i < 3; i++) {if (chessBoard[i,0] == chessBoard[i,1] && chessBoard[i,0] == chessBoard[i,2] && chessBoard[i,0] != 0) {return chessBoard[i,0]; //1}}//Check the columns.for (int j = 0; j < 3; j++) {if (chessBoard[0,j] == chessBoard[1,j] && chessBoard[0,j] == chessBoard[2,j] && chessBoard[0,j] != 0) {return chessBoard[0,j]; //2}}//Check the diagonals.if(chessBoard[0,0] == chessBoard[1,1] && chessBoard[0,0] == chessBoard[2,2] && chessBoard[0,0] != 0) return chessBoard[0,0];if(chessBoard[0,2] == chessBoard[1,1] && chessBoard[0,2] == chessBoard[2,0] && chessBoard[0,2] != 0) return chessBoard[0,2];//Judge whether the game is tied.int count = 0;for(int i = 0 ; i < 3 ; i++) {for (int j = 0; j < 3; j++) {if (chessBoard[i,j] != 0) {count++;}}}if (count == 9) {return 0;}return 3; //3}// Update is called once per framevoid Update () {}void Reset() {turn = 1;for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {chessBoard[i,j] = 0;}}}
}

游戏的UI如下所示:

Unity3D课程学习笔记(一)相关推荐

  1. 台湾大学林轩田机器学习技法课程学习笔记4 -- Soft-Margin Support Vector Machine

    红色石头的个人网站:redstonewill.com 上节课我们主要介绍了Kernel SVM.先将特征转换和计算内积这两个步骤合并起来,简化计算.提高计算速度,再用Dual SVM的求解方法来解决. ...

  2. 台湾大学林轩田机器学习技法课程学习笔记1 -- Linear Support Vector Machine

    红色石头的个人网站:redstonewill.com 关于台湾大学林轩田老师的<机器学习基石>课程,我们已经总结了16节课的笔记.这里附上基石第一节课的博客地址: 台湾大学林轩田机器学习基 ...

  3. 台湾大学林轩田机器学习基石课程学习笔记13 -- Hazard of Overfitting

    红色石头的个人网站:redstonewill.com 上节课我们主要介绍了非线性分类模型,通过非线性变换,将非线性模型映射到另一个空间,转换为线性模型,再来进行分类,分析了非线性变换可能会使计算复杂度 ...

  4. c语言课程笔记格式,C语言课程学习笔记.docx

    C语言课程学习笔记 C语言基础语言排行榜C--java--objective-C进制:进制:进位机制.用普通的话讲,应该为人为的定义一种度量来标识一样东西.计算机常用的进制有:十进制.二进制.八进制和 ...

  5. 斯坦福大学CS520知识图谱系列课程学习笔记:第三讲高级的知识图谱是什么样的

    这一讲的主题是:一些高级的知识图谱是什么样的.三位讲者分别从他们各自带领的团队构建出来的高质量的知识图谱实例出发,从中我们可以认识到一些大佬们构建的优秀的知识图谱产品有哪些特点和优势,从中对我们自己构 ...

  6. 斯坦福大学CS520知识图谱系列课程学习笔记:第二讲如何构建知识图谱

    上一讲我们学习了知识图谱的一些基本概念: 斯坦福大学CS520知识图谱系列课程学习笔记:第一讲什么是知识图谱 本节课程关于如何构建知识图谱,因为知识图谱的构建是整个知识图谱领域的一个非常核心且基础的工 ...

  7. gram矩阵的性质_第十七课:正交矩阵和GramSchmidt正交化——MIT线性代数课程学习笔记...

    公众号关注  "DL_NLP" 设为 "星标",重磅干货,第一时间送达! ◎ 原创 | 深度学习算法与自然语言处理 ◎ 作者 | 丁坤博 一. 知识概要 这一节 ...

  8. cs224w(图机器学习)2021冬季课程学习笔记16 Community Detection in Networks

    诸神缄默不语-个人CSDN博文目录 cs224w(图机器学习)2021冬季课程学习笔记集合 文章目录 1. Community Detection in Networks 2. Network Com ...

  9. GAMES101课程学习笔记—Lec 14(2)~16:Ray Tracing(2) BRDF、渲染方程、全局光照、路径追踪

    GAMES101课程学习笔记-Lec 14(2)~16:Ray Tracing(2) BRDF.渲染方程.全局光照.路径追踪 0 引入--辐射度量学概述 1 相关概念 1.1 Radiant Ener ...

最新文章

  1. python http接口_python实现http接口测试
  2. 从LSTM到GRU基于门控的循环神经网络总结
  3. 第十六届全国大学智能车竞赛全国总决赛竞速组别成绩与奖项
  4. 点击链接微信html代码怎么写,html5微信分享代码怎么写呢?
  5. myeclipse集成jad
  6. 中获取文件名不要扩展名_如何批量修改文件名,3s时间够不够
  7. Myeclipse 更改web项目的访问名
  8. 函数局部有界性定理_数学分析第四章《函数连续性》备考指南
  9. Docker教程小白实操入门(9)--基于export导出容器与基于import导入一个镜像
  10. 优秀的代码是如何分层的?
  11. python tkinter画布_Python tkinter Canvas画布完全攻略(超级详细)
  12. 2020-11-03 oracle sql根据身份证号来判断性别
  13. IDEA修改某个文件的编码
  14. 答题微信小程序实现(5):大功告成,整个模板,题库导入/切换/积分/选择对错判断/闯关成功
  15. 火车头采集器php,火车头采集器3.0采集图文教程
  16. linux搭建tht框架,教程 中标麒麟linux硬盘安装图解
  17. 如何使用Python抓取移动端APP的评论(小白篇)
  18. 用JavaScript写的一个摇号程序(随机数)
  19. 计算机主机光驱弹不出来怎么办,电脑光驱弹不出来的原因及解决方法
  20. 【密码学|算法设计】拓展的欧几里得算法及理论证明 (Extended Euclidean Algorithm)

热门文章

  1. 支付宝14岁生日,蚂蚁金服井贤栋表示技术创新要解决实际问题
  2. pythonopencv测距_如何在opencv中测量两点之间的距离(像素到厘米)
  3. 怎样做出一份优秀的数据可视化大屏| 推荐收藏
  4. java aspose 加水印_Aspose.Words使用教程之如何在文档中添加水印
  5. 有意思!细长件物料的自动搬运机器人/AGV
  6. ads1118实现热电偶测温
  7. 考公专业科目计算机,2019国家公务员考试专业科目考试大纲(计算机类)
  8. c++ 线程 std::thread
  9. 软件测试工程师职业规划,讲诉当初是怎么突破的瓶颈。少走弯路!
  10. 惊!终于知道为什么我的电脑在升级之后磁盘容量看起来让人心忧