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平台游戏和运行方法

U3D编译Web PC IOS Android平台游戏和运行方法

U3D+ET5.0 网络战棋游戏开发

U3D游戏开发工程师正确入行姿势指南