知识点一、枚举
枚举是C#中的一种值类型,它允许你定义一组命名的常量。枚举成员通常是相关的常量,它们被定义在同一个枚举类型中。枚举提供了一种类型安全的方法来使用一组相关的常量,使得代码更加清晰和易于维护
用法
在C#中,你可以使用enum
关键字来定义一个枚举类型。以下是一个简单的枚举定义示例:
private enum Mode
{
LookAt,
LookAtInverted,
CameraForward,
CameraForwardInverted,
}
在这个例子中,它定义了四种相机视角,并且在Unity生成了一个下拉框
private enum Mode
{
LookAt,
LookAtInverted,
CameraForward,
CameraForwardInverted,
}
[SerializeField] private Mode mode;
private void LateUpdate()
{
switch (mode)
{
case Mode.LookAt:
transform.LookAt(Camera.main.transform);break;
case Mode.LookAtInverted:
Vector3 dirFromCamera = transform.position - Camera.main.transform.position;
transform.LookAt(dirFromCamera);break;
case Mode.CameraForward:
transform.forward = Camera.main.transform.forward;break;
case Mode.CameraForwardInverted:
transform.forward = -Camera.main.transform.forward;break;
}
}
应用场景
-
状态管理:枚举常用于表示对象的状态,例如游戏中的角色状态(站立、行走、跑步)或设备的状态(开启、关闭、故障)。
-
菜单选项:在图形用户界面(GUI)编程中,枚举可以用来表示菜单选项或按钮命令。
-
方向和方位:在游戏开发中,枚举可以用来表示方向(上、下、左、右)或更复杂的方位(东北、东南、西南、西北)。
知识点二、状态机
状态机是一种设计模式,用于管理对象在不同状态之间的转换。在状态机中,对象的行为取决于其当前状态,并且状态之间的转换通常由特定的事件触发。状态机可以是有限状态机(Finite State Machine, FSM)或无限状态机,但在游戏开发和软件工程中,有限状态机更为常见。
有限状态机由以下几个部分组成:
-
状态(State):对象可能处于的不同情况或条件。
-
事件(Event):导致状态转换的触发器。
-
转换(Transition):从一个状态到另一个状态的转移。
-
初始状态(Initial State):状态机开始时的状态。
视频演示
用法
定义状态:使用枚举类型定义所有可能的状态。
使用枚举 State
定义了四种状态:Idle
(空闲)、Frying
(煎炸中)、Fired
(煎炸完成)、Burned
(炸糊了)。
public enum State
{
Idle, // 空闲
Frying, // 煎炸中
Fired, // 煎炸完成
Burned // 炸糊了
}
实现状态转换逻辑:编写代码来处理状态转换,通常在状态枚举中的每个状态对应一个处理方法。
-
在
Update
方法中,根据当前状态和计时器的值来决定是否转换到另一个状态。
private void Update()
{
if (HasKitchenObject())
{
switch (state)
{
case State.Idle:
break;
case State.Frying:
fryingTimer += Time.deltaTime;
OnProgressChanged?.Invoke(this, new IHasProgress.OnProgressChangedEventArgs
{
progressNormalized = fryingTimer / fryingRecipeSO.fryingTimerMax
});
if (fryingTimer > fryingRecipeSO.fryingTimerMax)
{
GetKitchenObject().DestroySelf();
KitchenObject.SpawnKitchenObject(fryingRecipeSO.output, this);
state = State.Fired;
burningTimer = 0f;
burningRecipeSO = GetBurningRecipeSOWithInput(GetKitchenObject().GetKitchenObjectSO());
OnStateChanged?.Invoke(this, new OnStateChangedEventArgs { state = state, });
}
break;
case State.Fired:
burningTimer += Time.deltaTime;
OnProgressChanged?.Invoke(this, new IHasProgress.OnProgressChangedEventArgs
{
progressNormalized = burningTimer / burningRecipeSO.burningTimerMax
});
if (burningTimer > burningRecipeSO.burningTimerMax)
{
GetKitchenObject().DestroySelf();
KitchenObject.SpawnKitchenObject(burningRecipeSO.output, this);
state = State.Burned;
OnStateChanged?.Invoke(this, new OnStateChangedEventArgs { state = state, });
OnProgressChanged?.Invoke(this, new IHasProgress.OnProgressChangedEventArgs { progressNormalized = 0f });
}
break;
case State.Burned:
break;
}
Debug.Log(state);
}
}
事件触发
状态转换由计时器超过特定阈值触发,例如,当 fryingTimer
超过 fryingRecipeSO.fryingTimerMax
时,状态从 Frying
转换到 Fired
。这种转换是通过更新 state
变量并触发 OnStateChanged
事件来实现的。
初始化状态机:设置状态机的初始状态。在 Start
方法中,将初始状态设置为 Idle
。
private void Start()
{
state = State.Idle;
}
触发状态转换:在适当的时机(例如,当事件发生时)触发状态转换。使用事件 OnStateChanged
通知订阅者状态发生了变化。
public event EventHandler<OnStateChangedEventArgs> OnStateChanged;
应用场景
-
游戏角色控制:管理角色的不同行为,如站立、行走、跑步、跳跃等。
-
用户界面管理:控制UI元素的不同显示状态,如隐藏、显示、禁用等。
-
设备控制:管理设备的运行状态,如开机、待机、关机等。
三、粒子动画
粒子动画是一种利用众多微小粒子进行建模、仿真和渲染的动画效果。这些粒子通常具有位置、速度、大小、颜色等属性,它们遵循一定的规则进行运动,从而创造出各种各样的视觉效果,如爆炸、雨雪、烟雾、火焰等。
粒子动画效果的原理是通过模拟粒子的物理特性和运动规律来实现的,每个粒子都被赋予了质量、速度、加速度等属性,并根据这些属性在三维空间中运动。
粒子动画是通过在限定区域内随机生成大量粒子的运动,进而组合成的动画效果,通过Particle组件来实现。动画的基本构成元素为单个粒子,这些粒子可以表现为圆点或图片等形式。开发者能够通过对粒子在颜色、透明度、大小、速度、加速度、自旋角度等多个维度上的动态变化做动画,以营造特定的氛围
用法
粒子系统基本设置
粒子系统模块化设置
-
创建粒子系统:在Unity中,可以通过添加
ParticleSystem
组件到一个游戏对象上来创建粒子系统。 -
配置粒子发射器:在
ParticleSystem
组件中,可以配置粒子发射器的属性,如发射类型、速率、生命周期等。 -
设置粒子渲染:可以设置粒子的渲染模式,如点、线或网格,并调整材质以控制粒子的外观。
-
添加动画:使用Unity的动画系统为粒子系统添加动画,如改变粒子的大小、颜色或位置随时间变化。
-
触发粒子效果:可以通过脚本在特定条件下触发粒子效果,如在玩家触发某个事件时播放粒子动画。
-
调整和优化:在预览和测试粒子动画时,根据需要进行调整,并优化性能以确保流畅的动画效果。
应用场景
-
游戏开发:在游戏中模拟自然现象,如火焰、水流、烟雾等,增强游戏的真实感和沉浸感。
-
视觉效果:在电影、电视、广告中模拟爆炸、烟雾、火焰等特效,提升视觉效果。
-
用户界面设计:在UI设计中使用粒子动画作为背景、按钮效果或过渡动画,增加界面的吸引力和互动性。
-
虚拟现实:在虚拟现实应用中创建逼真的虚拟环境,增强用户的沉浸感。
-
网页设计:在网页上使用粒子动画作为背景或交互元素,提升用户体验