-
游戏对象(GameObjects)和资源(Assets)的区别与联系:
-
游戏对象是在Unity场景中实际存在的实体,可以是角色、道具、相机等。它们可以拥有组件,如Transform、Renderer、Collider等,控制它们的行为和外观。
-
资源是在Unity项目中的文件,如纹理、声音、模型、脚本等,用于创建游戏对象。资源可以在多个场景和游戏对象之间共享。
-
联系:资源用于创建游戏对象。游戏对象可以引用资源,将资源实例化为实际游戏对象。游戏对象本身也可以被保存为资源,以便在不同场景中重用。
-
-
资源和游戏对象组织结构示例:
这里以一款射击游戏为例:-
戏根目录结构:
-
Assets:包含游戏中使用的所有资源,如模型、纹理、声音、动画等。
-
Scripts:包含游戏的脚本文件,用于定义游戏逻辑和行为。
-
Scenes:包含游戏场景文件,每个场景代表游戏中的一个关卡或界面。
-
Prefabs:包含预制件(Prefab),这是可以在多个场景中重复使用的游戏对象。
-
Materials:包含游戏材质的文件,用于定义游戏对象的外观。
-
UI:包含与用户界面相关的资源,如按钮、面板、字体等。
-
Audio:包含游戏中使用的音频文件。
-
Animations:包含游戏对象的动画文件。
-
-
游戏对象树的层次结构:
-
GameManager
:负责整个游戏的逻辑控制。
-
Player
:代表玩家角色。
-
PlayerModel:包含玩家的3D模型和动画。
-
PlayerController:处理玩家输入和行为。
-
PlayerHealth:管理玩家的生命值和伤害。
-
-
Enemies
:包含敌人。
-
Enemy1:一个具体的敌人对象。
-
Enemy2:另一个敌人对象。
-
-
Items
:包含游戏中的可交互物品。
-
HealthPickup:用于恢复玩家生命值的道具。
-
AmmoPickup:用于玩家武器的弹药道具。
-
-
-
-
-
使用Debug语句验证MonoBehaviour基本行为或事件触发的条件:
csharpCopy codeusing UnityEngine; public class ExampleScript : MonoBehaviour { private void Awake() { Debug.Log("Awake() called"); } private void Start() { Debug.Log("Start() called"); } private void Update() { Debug.Log("Update() called"); } private void FixedUpdate() { Debug.Log("FixedUpdate() called"); } private void LateUpdate() { Debug.Log("LateUpdate() called"); } private void OnGUI() { Debug.Log("OnGUI() called"); } private void OnDisable() { Debug.Log("OnDisable() called"); } private void OnEnable() { Debug.Log("OnEnable() called"); } }
-
GameObject、Transform和Component对象的官方描述:
-
GameObject:Unity中的基本对象,它可以包含组件,用于构建场景中的实体。
-
Transform:控制游戏对象的位置、旋转和缩放。每个游戏对象都有一个Transform组件。
-
Component:Unity游戏对象的组成部分,用于添加功能和行为。例如,Collider组件用于检测碰撞,Script组件用于编写自定义脚本。
-
-
图中table对象的属性、Transform属性和部件:
-
table对象的属性:activeSelf(激活状态)、name(名称)、tag(标签)等。
-
table的Transform属性:position(位置)、rotation(旋转)、scale(缩放)等。
-
table的部件:Renderer(渲染器)、Collider(碰撞器)、Script组件等。
-
-
UML图描述GameObject、Transform和Component的关系:
-
资源预设(Prefabs)与对象克隆(Instantiate):
-
预设(Prefabs)是Unity中的一个功能,允许您创建可重复使用的游戏对象模板。预设包括游戏对象及其组件,可以在多个场景中实例化。
-
对象克隆(Instantiate)是在运行时创建游戏对象的过程,可以通过实例化预设或已存在的游戏对象来创建新的游戏对象。
-
-
预设的好处:
-
可重复使用性:预设允许您在多个场景和不同情况下使用相同的游戏对象模板,减少了重复工作。
-
维护性:如果您需要对游戏对象模板进行更改,只需更新预设,所有引用该预设的实例都会受到影响。
-
-
预设与对象克隆的关系:
-
预设是游戏对象的模板,对象克隆是在运行时创建的实例。对象克隆可以基于预设创建,也可以克隆现有的游戏对象。
-
-
制作table预制并实例化成游戏对象的代码示例:
csharpCopy codeusing UnityEngine; public class GameManager : MonoBehaviour { public GameObject tablePrefab; // 拖拽table预制到这个字段中 private void Start() { // 实例化table预制成游戏对象 GameObject tableObject = Instantiate(tablePrefab, new Vector3(0f, 0f, 0f), Quaternion.identity); } }
上述代码首先在Unity编辑器中将table预制拖放到GameManager脚本的tablePrefab字段中,然后在游戏开始时使用Instantiate函数创建一个table游戏对象的实例,设置其位置为(0, 0, 0)并使用默认旋转。
2.编程实践,小游戏
这里实现了一个简单的计算器,代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class calmulator : MonoBehaviour { // Start is called before the first frame update private string operand1 = ""; private string operand2 = ""; private string result = ""; private void OnGUI() { // 创建输入框和按钮 GUI.Label(new Rect(10, 10, 80, 20), "Operand 1:"); operand1 = GUI.TextField(new Rect(100, 10, 100, 20), operand1, 5); GUI.Label(new Rect(10, 40, 80, 20), "Operand 2:"); operand2 = GUI.TextField(new Rect(100, 40, 100, 20), operand2, 5); if (GUI.Button(new Rect(10, 70, 50, 30), "Add")) { CalculateSum(); } if (GUI.Button(new Rect(60, 70, 50, 30), "Minus")) { CalculateMinus(); } if (GUI.Button(new Rect(110, 70, 50, 30), "Times")) { CalculateTimes(); } if (GUI.Button(new Rect(160, 70, 50, 30), "Divided")) { CalculateDivided(); } // 显示计算结果 GUI.Label(new Rect(10, 100, 200, 20), "Result: " + result); } private void CalculateSum() { float num1, num2; if (float.TryParse(operand1, out num1) && float.TryParse(operand2, out num2)) { float sum = num1 + num2; result = sum.ToString(); } else { result = "Invalid Input"; } } private void CalculateMinus() { float num1, num2; if (float.TryParse(operand1, out num1) && float.TryParse(operand2, out num2)) { float sum = num1 - num2; result = sum.ToString(); } else { result = "Invalid Input"; } } private void CalculateTimes() { float num1, num2; if (float.TryParse(operand1, out num1) && float.TryParse(operand2, out num2)) { float sum = num1 * num2; result = sum.ToString(); } else { result = "Invalid Input"; } } private void CalculateDivided() { float num1, num2; if (float.TryParse(operand1, out num1) && float.TryParse(operand2, out num2)) { float sum = num1 / num2; result = sum.ToString(); } else { result = "Invalid Input"; } } }
首先有三个全局变量:
operand1:操作数1 operand2:操作数2
result:输出结果。
在OnGUI()事件中,先创建了对应的标签(Label)和输入框(TextField)。接着还创建了对应的4个按钮。当用户按下对应的按钮后就会触发对应的函数来进行结算结果值。
最终的界面如下:
运行后在对应的输入框中输入数字后按下按钮即可输出结果值,案例如下:
b站演示视频链接:摆烂计算器_哔哩哔哩_bilibili