Unity:学习笔记一
Unity第二次作业
一、GameObjects和Assets的区别和联系
Gameobjects的概念:
The GameObject is the most important concept in the Unity Editor.
Every object in your game is a GameObject, from characters and collectible items to lights, cameras and special effects. However, a GameObject can’t do anything on its own; you need to give it properties before it can become a character, an environment, or a special effect.
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 functionality.
Assets的概念:
An asset is a representation of any item you can use in your project. An asset might come from a file created outside of Unity, such as a 3D Model, an audio file, or an image. You can create some asset types in Unity, such as a ProBuilder Mesh, an Animator Controller, an Audio Mixer, or a Render Texture.
区别和联系:
从上文的概念来看,GameObjects是在游戏中出现的东西,包括角色、道具、灯光和摄像头等等。但是不包括component,即背后运行的逻辑系统(脚本)。所以GameObjects可以认为是assets的子集。
二、下载几个游戏案例,分别总结资源、对象组织的结构(指资源的目录组织结构与游戏对象树的层次结构)
- 资源的目录组织结构:
- 主要包括动画,文本,场景,素材,模型,预设以及使用说明等。
- 游戏对象树的层次结构:
- 主要包括摄像机包,游戏开始位置,场景布局以及文本管理等。
三、编写一个代码,使用 debug 语句来验证 MonoBehaviour 基本行为或事件触发的条件
- 基本行为包括 Awake() Start() Update() FixedUpdate() LateUpdate()常用事
- 件包括 OnGUI() OnDisable() OnEnable()
控制台输出
This Awake
UnityEngine.Debug:Log(Object)
FisrtBeh:Awake() (at Assets/FisrtBeh.cs:10)
This Enabled!
UnityEngine.Debug:Log(Object)
FisrtBeh:OnEnable() (at Assets/FisrtBeh.cs:43)
This Start!
UnityEngine.Debug:Log(Object)
FisrtBeh:Start() (at Assets/FisrtBeh.cs:17)
This FixedUpdate!
UnityEngine.Debug:Log(Object)
FisrtBeh:FixedUpdate() (at Assets/FisrtBeh.cs:28)
This Update!
UnityEngine.Debug:Log(Object)
FisrtBeh:Update() (at Assets/FisrtBeh.cs:23)
This LateUpdate!
UnityEngine.Debug:Log(Object)
FisrtBeh:LateUpdate() (at Assets/FisrtBeh.cs:33)
This FixedUpdate!
UnityEngine.Debug:Log(Object)
FisrtBeh:FixedUpdate() (at Assets/FisrtBeh.cs:28)
This Update!
UnityEngine.Debug:Log(Object)
FisrtBeh:Update() (at Assets/FisrtBeh.cs:23)
This OnGUI
UnityEngine.Debug:Log(Object)
FisrtBeh:OnGUI() (at Assets/FisrtBeh.cs:38)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr, Boolean&)
This FixedUpdate!
UnityEngine.Debug:Log(Object)
FisrtBeh:FixedUpdate() (at Assets/FisrtBeh.cs:28)
This FixedUpdate!
UnityEngine.Debug:Log(Object)
FisrtBeh:FixedUpdate() (at Assets/FisrtBeh.cs:28)
This Enabled!
UnityEngine.Debug:Log(Object)
FisrtBeh:OnEnable() (at Assets/FisrtBeh.cs:43)
This Disabled!
UnityEngine.Debug:Log(Object)
FisrtBeh:OnDisable() (at Assets/FisrtBeh.cs:48)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr, Boolean&)
This Enabled!
UnityEngine.Debug:Log(Object)
FisrtBeh:OnEnable() (at Assets/FisrtBeh.cs:43)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr, Boolean&)
This Enabled!
UnityEngine.Debug:Log(Object)
FisrtBeh:OnEnable() (at Assets/FisrtBeh.cs:43)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr, Boolean&)
This Disabled!
UnityEngine.Debug:Log(Object)
FisrtBeh:OnDisable() (at Assets/FisrtBeh.cs:48)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr, Boolean&)
四、查找脚本手册,了解 GameObject,Transform,Component 对象
- 分别翻译官方对三个对象的描述(Description)
GameObject:
在游戏中的所有物体都是GameObject,从角色、道具到灯光、摄像头和特效等等。但是GameObject不能独自存在。它在成为角色、环境或特效之前,需要加上各种不同的属性。GameObjects是Unity中代表角色、道具和场景的最基础的东西。他们为Component提供容器,通过Component完善功能。
Transform:
Transform用来储存GameObject的位置,旋转,放大缩小,父类状态等信息,是非常重要的。GameObject通常有一个Transform部件绑定着。GameObejct上的Transfom通常是不可删除的,同时创造GameObject的时候,会创建一个Transform。
Component:
GameObject是Components的容器,Components定义了GameObject的属性。
- 描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、 table 的部件
- 本题目要求是把可视化图形编程界面与 Unity API 对应起来,当你在 Inspector 面板上每一个内容,应该知道对应 API。
- 例如:table 的对象是 GameObject,第一个选择框是 activeSelf 属性。
- table 的对象是 GameObject,第一个选择框是 activeSelf 属性。
第二个是名称,第三个是static属性;第二行是tag和layer;第三行的prefab。
Transform包括三个坐标的xyz值,分别是position位置,Rotation旋转和Scale比例。
Component有Transform,Mesh Filter,Box Collider,Mesh Renderer。 - 用 UML 图描述 三者的关系(请使用 UMLet 14.1.1 stand-alone版本出图)
五、资源预设(Prefabs)与 对象克隆 (clone)
- 预设(Prefabs)有什么好处?
预制是文件储存的游戏对象和属性的组合,可一次性方便地加载到内存。
预设可以让开发者使用先前做好的物体,使得开发更加方便,避免重复不必要的工作。
- 预设与对象克隆 (clone or copy or Instantiate of Unity Object) 关系?
- 克隆游戏对象需要场景中有被克隆对象,而创建预制只需要事先创建预制即可。允许场景中一开始并不存在该游戏对象。
- 克隆出来的游戏对象并不会随着克隆体的变化而发生变化,但是使用预制创建出来的对象会随着预制的改变而发生改变。
- 制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象
编写代码
把脚本放在摄像头上
并设定 prefab的值
运行就可以了!设定prefa的值一定要在摄像头的脚本上设置!不然会提示错误。
3、思考题【选做】
- 微软 XNA 引擎的 Game 对象屏蔽了游戏循环的细节,并使用一组虚方法让继承者完成它们,我们称这种设计为“模板方法模式”。
- 为什么是“模板方法”模式而不是“策略模式”呢?
模板方法更接近于一项规则,为程序的算法规定一套流程也就是模板,代码需要遵循这个模板来编写,通过修改流程每个部分内部的实现来改变功能。
而策略模式更强调的是内部变化与外部的分离,及内部的修改不会影响到外部其他部分的功能。
- 将游戏对象组成树型结构,每个节点都是游戏对象(或数)。
- 尝试解释组合模式(Composite Pattern / 一种设计模式)。
- 使用 BroadcastMessage() 方法,向子对象发送消息。你能写出 BroadcastMessage() 的伪代码吗?
组合模式描述了一组被作为一个单一实例来统一对待的对象,目的是将具有相似特征的对象组合在一起形成"部分-整体"的层次结构,使得它们被组合成树结构。组合模式使得客户端可以将一组对象统一的处理。
- 一个游戏对象用许多部件描述不同方面的特征。我们设计坦克(Tank)游戏对象不是继承于GameObject对象,而是 GameObject 添加一组行为部件(Component)。
- 这是什么设计模式?
桥接(Bridge)模式
- 为什么不用继承设计特殊的游戏对象?
- 过多的继承容易导致类与类之间结构混乱。
- 使用桥接模式更有利于同一各组件的接口,统一管理不同类相同行为组件的属性,又不会导致组合爆炸。
- 桥接模式中,当部分功能被修改时,不会影响到外部其他部件的功能。
小程序:计算器
这个程序使用了IMGUI,
查看资料https://docs.unity3d.com/cn/current/Manual/gui-Controls.html
同样也是将脚本绑定到摄像头,把脚本拖动到摄像头上即可
但是要注意更新问题,如果更改脚本后
UI没有发生变化,可以将脚本删除后重新加入,再运行。
gitee地址:
https://gitee.com/woodx9/unity-3D-homework/tree/master/Caculation
脚本代码
using System.Collections; using System.Data; // 使用DataTable using System.Collections.Generic; using System.Reflection.Emit; using UnityEngine; public class GUIx : MonoBehaviour { // Start is called before the first frame update void Start() { } public int selGridInt = -1; public string[] selStrings = new string[] { "AC", "+/-", "%", "/", "7", "8", "9", "*", "4", "5", "6", "-", "1", "2", "3", "+", "0", "←", ".", "=" }; private string textFieldString = "0"; public string operationNum = ""; public string operant = ""; // Update is called once per frame void Update() { if (selGridInt != -1) { // textFieldString += selStrings[selGridInt]; UnityEngine.Debug.Log(selGridInt); if (selGridInt == 0) // AC { textFieldString = "0"; operationNum = ""; operant = ""; } else if (selGridInt == 1) // +/- { if(textFieldString[0] != '-') { textFieldString = "-" + textFieldString; } else { textFieldString = textFieldString.Substring(1, textFieldString.Length - 1); } } else if (selGridInt == 19) // 等号的情况 { DataTable table = new DataTable(); string str = operant + operationNum + textFieldString; UnityEngine.Debug.Log(str); textFieldString = table.Compute(str, "").ToString(); operationNum = ""; operant = ""; UnityEngine.Debug.Log("enter ="); } else if (selGridInt == 2 || (selGridInt + 1)%4 == 0) // 其他操作符的情况 { operationNum = selStrings[selGridInt]; operant = textFieldString; textFieldString = "0"; } else if (selGridInt == 16) { if (textFieldString == "0") ; else { textFieldString += selStrings[selGridInt]; } } else if (selGridInt == 17) { if (textFieldString.Length == 1) textFieldString = "0"; else textFieldString = textFieldString.Substring(0, textFieldString.Length - 2); } else // 除了0之外的数字键 { UnityEngine.Debug.Log("enter Num"); if (textFieldString == "0") textFieldString = selStrings[selGridInt]; else textFieldString += selStrings[selGridInt]; } selGridInt = -1; } } void OnGUI() { textFieldString = GUI.TextField(new Rect(100, 0, 200, 100), textFieldString); // use 2 elements in the horizontal direction selGridInt = GUI.SelectionGrid(new Rect(100, 100, 200, 400), selGridInt, selStrings, 4); //GUILayout.EndHorizontal(); //GUIUtility.ExitGUI(); } }
3、思考题【选做】
- 微软 XNA 引擎的 Game 对象屏蔽了游戏循环的细节,并使用一组虚方法让继承者完成它们,我们称这种设计为“模板方法模式”。
- 为什么是“模板方法”模式而不是“策略模式”呢?
模板方法更接近于一项规则,为程序的算法规定一套流程也就是模板,代码需要遵循这个模板来编写,通过修改流程每个部分内部的实现来改变功能。
而策略模式更强调的是内部变化与外部的分离,及内部的修改不会影响到外部其他部分的功能。
- 将游戏对象组成树型结构,每个节点都是游戏对象(或数)。
- 尝试解释组合模式(Composite Pattern / 一种设计模式)。
- 使用 BroadcastMessage() 方法,向子对象发送消息。你能写出 BroadcastMessage() 的伪代码吗?
组合模式描述了一组被作为一个单一实例来统一对待的对象,目的是将具有相似特征的对象组合在一起形成"部分-整体"的层次结构,使得它们被组合成树结构。组合模式使得客户端可以将一组对象统一的处理。
- 一个游戏对象用许多部件描述不同方面的特征。我们设计坦克(Tank)游戏对象不是继承于GameObject对象,而是 GameObject 添加一组行为部件(Component)。
- 这是什么设计模式?
桥接(Bridge)模式
- 为什么不用继承设计特殊的游戏对象?
- 过多的继承容易导致类与类之间结构混乱。
- 使用桥接模式更有利于同一各组件的接口,统一管理不同类相同行为组件的属性,又不会导致组合爆炸。
- 桥接模式中,当部分功能被修改时,不会影响到外部其他部件的功能。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」