热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Unity3D第一次作业

目录解释游戏对象(GameObjects)和资源(Assets)的区别和联系下载几个游戏实例,分别总结资源、对象组织的结构编写一个代

目录

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

下载几个游戏实例,分别总结资源、对象组织的结构

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

查找脚本手册,了解 GameObject,Transform,Component 对象

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

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

总结

井字棋全部代码




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

 

游戏对象(GameObjects):游戏中的每个对象都是一个游戏对象 (GameObject),游戏对象是统一体中代表人物、道具和场景的基本对象。它们本身并没有完成多少工作,但是它们充当组件的容器,组件实现真正的功能。

 

资源(Assets):游戏中可能用到的各种东西,比如模型、声音文件、贴图文件等等都是资源(Assets)。资源(Assets)是可以在游戏或项目中使用的任何项目的表示。资源(Assets)可能来自Unity之外创建的文件,例如3D模型、音频文件、图像或Unity支持的任何其他类型的文件。还有一些资产类型可以在Unity中创建,比如动画控制器、音频混频器或渲染纹理。在unity3d中的Project部分就对应了项目文件夹里的assets文件夹,就是专门用来存储项目中使用到的各种东西。在Project里添加模型、声音文件、贴图文件时assets文件夹里的东西也会改变。

 

区别:对象由资源组成,资源组成对象,且可以被多个对象使用。对象是资源的具体化的实例,资源是对象的组成成分。

 

联系:资源可以作为模板,实例化成具体的游戏对象,也可以作为游戏对象中的某种属性,同时也可以被多个游戏对象同时使用。

 


下载几个游戏实例,分别总结资源、对象组织的结构

在GitHub上下载了一个叫tappyplane的游戏

该游戏资源的内容分为预制、场景、脚本、纹理,资源的结构如下:

对象组织的结构,这个游戏只有一个main camera的对象。


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


基本行为包括 Awake() Start() Update() FixedUpdate() LateUpdate()


常用事件包括 OnGUI() OnDisable() OnEnable()

using System.Collections;using System.Collections.Generic;using UnityEngine;public class intbesh : MonoBehaviour {// 初始化private void Awake(){Debug.Log("It is an awake!");}void Start () {Debug.Log("It is a start!");}//每帧调用一次更新void Update () {Debug.Log("It is an update!");}//固定更新private void FixedUpdate(){Debug.Log("It is a fixedupdate!");}private void OnGUI(){Debug.Log("It is ONGUI!");}private void OnDisable(){Debug.Log("It is OnDisable!");}private void OnEnable(){Debug.Log("It is OnEnable!");}}

运行结果如下图:

 

 

分析可得

awake:当一个脚本实例被载入时被调用

start:在所有update函数之前被调用一次

update:当行为启用时,其update在每一帧被调用

fixedupdate:当行为启用时,其fixedupdate在每一时间片被调用

OnGUI:渲染和处理GUI事件时调用

OnEnable:当对象变为可用或激活状态时被调用

OnDisable:当对象变为不可用或非激活状态时被调用

 

 

 


查找脚本手册,了解 GameObject,Transform,Component 对象


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


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


本题目要求是把可视化图形编程界面与 Unity API 对应起来,当你在 Inspector 面板上每一个内容,应该知道对应 API


例如:table 的对象是 GameObject,第一个选择框是 activeSelf 属性。


用 UML 图描述 三者的关系(请使用 UMLet 14.1.1 stand-alone版本出图)

 

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.

翻译:游戏对象是代表人物、道具和风景的基本统一对象。它们本身并不能完成很多工作,但它们充当组件的容器,实现真正的功能。

 

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.

翻译: 组件是游戏中对象和行为的螺母和螺栓。它们是每个游戏对象的功能部件。

 

第一个选择框是activeSelf:定义对象的名称,动静态等属性;

第二个选择框是Transform:定义对象的位置、面向方向、大小;

第三个选择框是Box Collider:调整坐标系的位置、大小;

第四个选择框是Component:给对象增加行为。

 

 

 

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

预设(Prefabs)有什么好处?

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

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

 

预设(Prefabs)的好处:

预设可以提前将设计游戏中所需要的游戏对象进行设计打包,成为一个模板。在我们需要用到这些模板时,可以直接从资源当中加载,成为一个游戏对象,使我们在设计游戏中更加便捷。

预设和克隆之间的关系:

克隆是出来的对象独立于原来的对象,在修改的过程中不会影响原有的对象。但是通过预设实例化的对象是相互关联的,修改预设会改变通过该预设实例化出来的对象。

 

 

table 预制:

public GameObject table;void Start () {GameObject newTable = (GameObject)Instantiate(table.gameObject);}

 

 

 

编程实践,小游戏

游戏内容: 井字棋 或 贷款计算器 或 简单计算器 等等

技术限制: 仅允许使用 IMGUI 构建 UI

作业目的:

了解 OnGUI() 事件,提升 debug 能力

提升阅读 API 文档能力

 

 

首先是几个参数的使用

Button用来记录井字棋里填的内容如X或者O;

Result用来记录胜负结果;

Button_state用来记录格子的使用情况,0表示为使用,1表示填入X,2表示填入O;

Turn用来记录轮次。

 

Init函数

用来初始化格子

 

生成底下的结果和重新开始按钮,调用init函数进行初始化

 

 

 

生成井字格

 

 

检测玩家的选择,并做相应的处理

 

 

ifIsEnd函数检查游戏是否结束,其中又分为四个部分,横排、竖排、对角线检查以及平局检查

总结:这次的作业我收获了很多,对unity3d的了解更深了,对其的基础知识和基本操作有了更多的认识。在井字棋游戏的实现上,我了解 了OnGUI() 事件,也提升 了debug 能力,同时提升了阅读 API 文档的能力。总体来说收获很多。

 

代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class mybutton : MonoBehaviour
{  private string[] button &#61; new string[9];private string result &#61; "";private int[] button_state &#61; new int[9];//0-空&#xff0c;1-X按下&#xff0c;2-O按下private int turn &#61; 0;//1-X的回合&#xff0c;0-O的回合void Start(){init();}void init(){turn &#61; 0;//o先走for (int i &#61; 0; i <9; i&#43;&#43;){button[i] &#61; "";button_state[i] &#61; 0;}}void Update(){}void OnGUI(){GUI.Button(new Rect(20, 320, 100, 40), result);if (GUI.Button(new Rect(160, 320, 100, 40), "重新开始")){init();//调用初始化函数&#xff0c;将棋盘清空result &#61; "";}//若游戏结束则重新创建棋盘int a, b;if (ifIsEnd()){a &#61; 20;b &#61; 20;for (int j &#61; 0; j <3; j&#43;&#43;){for (int k &#61; 0; k <3; k&#43;&#43;){GUI.Button(new Rect(a, b, 80, 80), button[3 * j &#43; k]);a &#43;&#61; 80;}b &#43;&#61; 80;a &#61; 20;}if (GUI.Button(new Rect(160, 320, 100, 40), "重新开始")){init();result &#61; "";}return;}//检测玩家操作a &#61; 20;b &#61; 20;for (int j &#61; 0; j <3; j&#43;&#43;){for (int k &#61; 0; k <3; k&#43;&#43;){if (GUI.Button(new Rect(a, b, 80, 80), button[3 * j &#43; k])){if (button_state[3 * j &#43; k] &#61;&#61; 0 && turn &#61;&#61; 0){button[3 * j &#43; k] &#61; "O";button_state[3 * j &#43; k] &#61; 2;}else if (button_state[3 * j &#43; k] &#61;&#61; 0 && turn &#61;&#61; 1){button[3 * j &#43; k] &#61; "X";button_state[3 * j &#43; k] &#61; 1;}turn &#61; (turn &#43; 1) % 2;}a &#43;&#61; 80;}b &#43;&#61; 80;a &#61; 20;}}//检查游戏是否结束,需要分别检查横竖对角线&#xff0c;结果有X赢、O赢和平局bool ifIsEnd(){//检查横排&#xff0c;012、345、678for (int j &#61; 0; j <7; j &#61; j &#43; 3){if (button_state[j] &#61;&#61; button_state[j &#43; 1] && button_state[j &#43; 1] &#61;&#61; button_state[j &#43; 2]){if (button_state[j] &#61;&#61; 1){result &#61; "X赢!";return true;}else if (button_state[j] &#61;&#61; 2){result &#61; "O赢!";return true;}}}//检查竖排&#xff0c;036、147、258for (int j &#61; 0; j <3; j&#43;&#43;){if (button_state[j] &#61;&#61; button_state[j &#43; 3] && button_state[j &#43; 3] &#61;&#61; button_state[j &#43; 6]){if (button_state[j] &#61;&#61; 1){result &#61; "X赢&#xff01;";return true;}else if (button_state[j] &#61;&#61; 2){result &#61; "O赢&#xff01;";return true;}}}//检查对角线048、246if (button_state[0] &#61;&#61; button_state[4] && button_state[4] &#61;&#61; button_state[8]){if (button_state[0] &#61;&#61; 1){result &#61; "X赢&#xff01;";return true;}else if (button_state[0] &#61;&#61; 2){result &#61; "O赢&#xff01;";return true;}}if (button_state[2] &#61;&#61; button_state[4] && button_state[4] &#61;&#61; button_state[6]){if (button_state[2] &#61;&#61; 1){result &#61; "X赢&#xff01;";return true;}else if (button_state[2] &#61;&#61; 2){result &#61; "O赢&#xff01;";return true;}}//检查是否平局int m &#61; 0;for (int j &#61; 0; j <9; j&#43;&#43;){if (button_state[j] &#61;&#61; 0){m &#61; 1;break;}}if (m &#61;&#61; 0){result &#61; "平局";return true;}return false;}
}


 


推荐阅读
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • Commit1ced2a7433ea8937a1b260ea65d708f32ca7c95eintroduceda+Clonetraitboundtom ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • C#多线程解决界面卡死问题的完美解决方案
    当界面需要在程序运行中不断更新数据时,使用多线程可以解决界面卡死的问题。一个主线程创建界面,使用一个子线程执行程序并更新主界面,可以避免卡死现象。本文分享了一个例子,供大家参考。 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • 本文介绍了如何使用n3-charts绘制以日期为x轴的数据,并提供了相应的代码示例。通过设置x轴的类型为日期,可以实现对日期数据的正确显示和处理。同时,还介绍了如何设置y轴的类型和其他相关参数。通过本文的学习,读者可以掌握使用n3-charts绘制日期数据的方法。 ... [详细]
author-avatar
蜡烛8882007
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有