目录
Entity-Component-System (ECS)概念
ECS(Entity Component System)的应用
前言
在这一篇博客中,我将介绍如何使用unity以及Entity-Component-System (ECS)和Model-View-Controller (MVC)概念来制作一个简单的2D游戏——记忆翻牌游戏。在这一个过程中,我们将会了解游戏循环的基本原理,掌握常见游戏事件的使用及其执行顺序,学会使用unity的简单操作与编程,掌握游戏世界的基本概念。同时还对ECS以及MVC概念有一定的深入了解。
游戏循环基本原理
游戏循环是指游戏引擎在每一帧中执行的一系列步骤,以更新游戏状态并呈现画面。下面是Unity游戏循环的基本原理:
1. 初始化阶段(Initialization Phase):
游戏引擎初始化:创建游戏窗口、图形设备的初始化等。
场景加载:加载游戏场景、资源等。
2. 输入处理阶段(Input Phase):
处理输入:监听玩家的输入,例如键盘、鼠标、触摸屏等。
更新输入状态:根据输入更新游戏中的相应状态,例如控制角色移动。
3. 更新阶段(Update Phase):
更新游戏状态:执行游戏逻辑、物理模拟、碰撞检测等。
更新游戏对象:更新游戏中的各个对象的状态,例如移动、旋转、动画等。
处理游戏事件:触发和处理游戏中的事件,例如触发特定条件下的事件回调。
4. 渲染阶段(Render Phase):
准备渲染:设置渲染目标、清除缓冲区等准备工作。
渲染场景:将游戏对象的可视化表现绘制到屏幕上,包括几何形状、材质、光照等。
后期处理:应用各种后期效果,例如颜色校正、模糊、阴影等。
呈现画面:将渲染结果显示在屏幕上,完成一帧的渲染。
5. 循环重复:
上述步骤会在每一帧中依次执行,形成游戏循环,不断更新游戏状态和渲染画面。
常见游戏事件
当了解了游戏循环的基本原理后,我们可以探讨一些常见的游戏事件以及它们的执行顺序。以下是一些常见的游戏事件及其执行顺序的概述:
1. Start(开始)事件:
在游戏对象被激活或场景加载完成后触发。
用于初始化游戏对象的状态、设置初始数值、获取引用等。
只会在游戏对象的生命周期中执行一次。
2. Update(更新)事件:
在每一帧的更新阶段执行。
用于处理游戏逻辑、输入响应、移动、旋转等实时更新的操作。
执行顺序从场景中的每个激活的游戏对象开始,按照它们在场景中的顺序依次执行。
3. FixedUpdate(固定更新)事件:
在每一帧的物理更新阶段执行。
用于处理物理模拟、碰撞检测等与物理相关的操作。
时间间隔固定,不受帧率的影响,通常每秒执行几次(例如默认每秒执行 50 次)。
4. LateUpdate(延迟更新)事件:
在 Update 事件之后执行。
用于处理在 Update 事件中可能会影响到其他对象的操作。
例如相机跟随、动画更新等需要在其他对象更新完毕后再执行的操作。
5. OnCollisionEnter(碰撞进入)事件:
在游戏对象与其他对象发生碰撞时触发。
用于处理碰撞事件的逻辑,例如触发游戏效果、播放音效等。
6. OnTriggerEnter(触发器进入)事件:
在游戏对象进入触发器时触发。
用于处理触发器事件的逻辑,例如触发任务、切换场景等。
7. OnGUI(绘制GUI)事件:
在渲染阶段之后执行。
用于绘制游戏界面、UI 元素等。
需要注意的是,不同的游戏事件在执行顺序上可能会有差异,具体取决于事件的类型和注册方式。例如,MonoBehaviour 中的事件会按照脚本的顺序进行执行,而物理事件则与物理引擎的更新步骤相关联。
即时模式GUI(IMGUI)
即时模式 GUI(IMGUI)是 Unity 引擎提供的一种简单而直接的图形用户界面(GUI)系统。IMGUI 允许你在游戏循环的 OnGUI 事件中直接编写代码来创建和更新用户界面元素。
IMGUI 是基于立即绘制的概念,每当 OnGUI 事件被触发时,GUI 元素将被立即绘制到屏幕上。IMGUI 使用一系列 GUI 函数来创建不同类型的控件,例如按钮、文本框、滑块等。你可以通过调用这些函数来设置控件的属性、处理用户输入和响应事件。
以下是使用 IMGUI 的基本示例:
using UnityEngine;
public class MyGUI : MonoBehaviour
{
private string playerName = "Player";
private int score = 0;
private void OnGUI()
{
// 创建一个标签显示玩家名称和分数
GUI.Label(new Rect(10, 10, 200, 20), "Player Name: " + playerName);
GUI.Label(new Rect(10, 30, 200, 20), "Score: " + score);
// 创建一个按钮,点击后增加分数
if (GUI.Button(new Rect(10, 60, 80, 20), "Add Score"))
{
score += 10;
}
// 创建一个文本框,用于输入玩家名称
playerName = GUI.TextField(new Rect(10, 90, 120, 20), playerName);
}
}
需要注意的是,IMGUI 是一种立即绘制的方式,每一帧都会重新绘制所有的 GUI 元素,这可能会对性能产生一定影响。因此,对于复杂的 GUI 界面或需要频繁更新的情况,Unity 推荐使用新的 UI 系统(例如 Canvas 和 RectTransform)来构建用户界面。
Entity-Component-System (ECS)概念
ECS(Entity Component System)是一种用于构建游戏和应用程序的软件架构模式。它的核心思想是将游戏对象(Entities)拆分为组件(Co