U3D游戏开发框架——事件序列
Posted Hello Bug.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了U3D游戏开发框架——事件序列相关的知识,希望对你有一定的参考价值。
一:目的
游戏开发中,经常会执行一连串的事件。例如在第2秒的时候播放攻击动画,在第5秒的时候播放走路动画,如果在上层类的Update中编写逻辑会增加代码冗余
所以我们需要一个事件序列类去统一管理
二:解决的问题及优点
——减少代码冗余
三:使用
——创建事件序列
s = new Sequence();
——添加事件序列
s.AddEvent(0, () =>
{
Debug.Log("event1");
});
s.AddEvent(1, () =>
{
Debug.Log("event2");
});
s.AddEvent(2, () =>
{
Debug.Log("event3");
});
——播放事件序列
s.PlaySequence();
——在每帧刷新的方法中调用Update方法
s.Update(Time.deltaTime);
四:代码实现
using System;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 事件序列
/// </summary>
public class Sequence
{
/// <summary>
/// 事件
/// </summary>
public class Event
{
public float eventTime;//事件时间
public List<Action> eventList;//事件列表
public Event(float eventTime)
{
this.eventTime = eventTime;
eventList = new List<Action>();
}
public void Invoke()
{
foreach (var e in eventList)
{
e?.Invoke();
}
}
}
Dictionary<float, Event> eventOriginalCache = new Dictionary<float, Event>();//事件原始列表
Dictionary<float, Event> eventPlayCache = new Dictionary<float, Event>();//事件播放列表(从事件原始列表拷贝一份)
bool isPlay;//是否播放序列
/// <summary>
/// 播放事件序列
/// </summary>
public void PlaySequence()
{
if (isPlay) return;
CopyEvents();
sequenceTimer = 0;
isPlay = true;
}
/// <summary>
/// 添加事件
/// </summary>
public void AddEvent(float eventTime, Action customEvent)
{
if (!eventOriginalCache.ContainsKey(eventTime))
{
Event e = new Event(eventTime);
eventOriginalCache.Add(eventTime, e);
}
eventOriginalCache[eventTime].eventList.Add(customEvent);
}
float sequenceTimer;//事件计时器
List<float> deleteEventNodeCache = new List<float>();//要删除的事件节点
public void Update(float timeDelta)
{
if (!isPlay) return;
deleteEventNodeCache.Clear();
sequenceTimer += timeDelta;
foreach (var temp in eventPlayCache)
{
if (sequenceTimer >= temp.Key)
{
Event sequenceEvent = temp.Value;
sequenceEvent.Invoke();
deleteEventNodeCache.Add(temp.Key);
}
}
foreach (var eventTime in deleteEventNodeCache)
{
eventPlayCache.Remove(eventTime);
}
if (eventPlayCache.Count <= 0)
{
isPlay = false;
}
}
/// <summary>
/// 拷贝事件
/// </summary>
void CopyEvents()
{
eventPlayCache.Clear();
foreach (var temp in eventOriginalCache)
{
eventPlayCache.Add(temp.Key, temp.Value);
}
}
}
以上是关于U3D游戏开发框架——事件序列的主要内容,如果未能解决你的问题,请参考以下文章
U3D:如何使用collision pipeline提升游戏开发优势
2022-02-11 U3D全栈班 002-Unity游戏结构和游戏开发流程
U3D编译Web PC IOS Android平台游戏和运行方法