博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
U3D游戏开发框架(九)——事件序列
阅读量:1985 次
发布时间:2019-04-27

本文共 2141 字,大约阅读时间需要 7 分钟。

一:目的

游戏开发中,经常会执行一连串的事件。例如在第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;/// /// 事件序列/// public class Sequence{    ///     /// 事件    ///     public class Event    {        public float eventTime;//事件时间        public List
eventList;//事件列表 public Event(float eventTime) { this.eventTime = eventTime; eventList = new List
(); } public void Invoke() { foreach (var e in eventList) { e?.Invoke(); } } } Dictionary
eventOriginalCache = new Dictionary
();//事件原始列表 Dictionary
eventPlayCache = new Dictionary
();//事件播放列表(从事件原始列表拷贝一份) bool isPlay;//是否播放序列 ///
/// 播放事件序列 /// public void PlaySequence() { if (isPlay) return; CopyEvents(); sequenceTimer = 0; isPlay = true; } ///
/// 添加事件 /// 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
deleteEventNodeCache = new List
();//要删除的事件节点 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; } } ///
/// 拷贝事件 /// void CopyEvents() { eventPlayCache.Clear(); foreach (var temp in eventOriginalCache) { eventPlayCache.Add(temp.Key, temp.Value); } }}

 

转载地址:http://hpyvf.baihongyu.com/

你可能感兴趣的文章
JQuery使用validate插件完成校验
查看>>
关于java的继承
查看>>
关于java的内部类
查看>>
关于java的枚举
查看>>
一个简单的layui登陆界面
查看>>
SQL考试常见题目
查看>>
使用Spring Boot写一个简单的Hello World
查看>>
Spring Boot整合Servlet使用
查看>>
SpringBoot 文件上传
查看>>
我居然在Github上找到了一个完整的停车系统(附源码地址)
查看>>
大厂经典面试题:Redis为什么这么快?
查看>>
精通Spring?请吃我一狗腿!
查看>>
培训班老师说可以用这个干掉一大批面试者
查看>>
花了 500块大洋 ,买来的677页Java性能调优笔记,感觉4年Java性能调优都白学了
查看>>
靠这本,在某宝花了399大洋的宝典,熬夜七天,吊打面试官,终进大厂
查看>>
阿里四面,居然栽在一道排序算法上
查看>>
【Java编码规范】《阿里巴巴Java开发手册(正式版)》发布!
查看>>
如何在二三线城市月薪过万(一)看完这篇后端简历优化,包你面试不断
查看>>
源码不止Spring!发布GitHub一天,获赞7.5K 阿里Java程序员源码进修指南我粉了
查看>>
阿里P8大神教你十分钟构建好SpringBoot + SSM框架 成功晋升
查看>>