找回密码
 立即注册
楼主: 路丝丝

[脚本] Unity3d时间、计时管理器简介

[复制链接]
发表于 2015-11-2 16:27 | 显示全部楼层 |阅读模式
在之前文章我们提到过定时器的做法《unity教程-自定义Clock定时器类 》,在平时的游戏开发过程中,我们或多或少的会用到时间类,比如技能的冷却时间,角色的生命回复等等都会用到,而处理方式也有很多种,我们可以在每个技能上面挂载一个时间类,也可以提供一个时间管理器,来统一管理技能的冷却,个人推荐第二种做法,因为这样会更加精准!
时间管理器的类主要包括 TimerManager.cs,代码如下:
using Unity Engine;
using System;
using System.Collections.Generic;
///
/// 移动管理
///
public class TimerManager
{
public static float time;
public static Dictionary timerList = new Dictionary();
public static void Run()
{
// 设置时间值
TimerManager.time = Time.time;
TimerItem[] objectList = new TimerItem[timerList.Values.Count];
timerList.Values.CopyTo(objectList, 0);
// 锁定
foreach(TimerItem timerItem in objectList)
{
if(timerItem != null) timerItem.Run(TimerManager.time);
}
}
public static void Register(object objectItem, float delayTime, Action callback)
{
if(!timerList.ContainsKey(objectItem))
{
TimerItem timerItem = new TimerItem(TimerManager.time, delayTime, callback);
timerList.Add(objectItem, timerItem);
}
}
public static void UnRegister(object objectItem)
{
if(timerList.ContainsKey(objectItem))
{
timerList.Remove(objectItem);
}
}
}
TimerItem.cs,代码如下:
using UnityEngine;
using System;
public class TimerItem
{
///
/// 当前时间
///
public float currentTime;
///
/// 延迟时间
///
public float delayTime;
///
/// 回调函数
///
public Action callback;
public TimerItem(float time, float delayTime, Action callback)
{
this.currentTime = time;
this.delayTime = delayTime;
this.callback = callback;
}
public void Run(float time)
{
// 计算差值
float offsetTime = time - this.currentTime;
// 如果差值大等于延迟时间
if(offsetTime >= this.delayTime)
{
float count = offsetTime / this.delayTime - 1;
float mod = offsetTime % this.delayTime;
for(int index = 0; index < count; index ++)
{
this.callback();
}
this.currentTime = time - mod;
}
}
}
测试用例代码如下:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Demo : MonoBehaviour
{
public GameObject roleObject;
void Awake()
{
TimerManager.Register(this, 0.3f, ()=>
{
Debug.Log("0.3 -> " + System.DateTime.Now.ToString("hh:mm:ss.fff"));
});
TimerManager.Register(this.gameObject, 1f, ()=>
{
Debug.Log("1 -> " + System.DateTime.Now.ToString("hh:mm:ss.fff"));
});
}
void Update()
{
TimerManager.Run ();
}
}
好了,本篇unity3d教程到此结束,下篇我们再会!
资源地址: http://cg.silucg.com/dongman/unity3d/7981.html (分享请保留)

发表于 2016-7-6 00:47 | 显示全部楼层

感谢楼主的无私分享!
发表于 2016-7-9 18:27 | 显示全部楼层
这些unity3d视频教程都学下来,估计什么都会了!
[000088]《Unity3D 游戏插件 Daikon Forge GUI 视频教程》[47课时]
[000089]《Unity3D 筑梦天下 高级应用 视频教程》[5课时]
[000090]《Unity3D 脚本语言学习之C#语言》[9课时]
[000091]《Unity3D 基础入门之进入Unity的世界》[15课时]
[000092]《Unity3D 脚本语言学习之Javascript语言》[59课时]
[000093]《Unity3D 脚本语言学习之Python语言》[61课时]
[000094]《Unity3D 知识体系入门课程》[18课时]
[000095]《Unity3D RPG游戏黑暗之光案例视频教程》[110课时]
[000096]《Unity3D 动作游戏全攻略视频教程》[29课时]
[000097]《Unity3D 经典入门课程基础打砖块实例教程》[7课时]
[000098]《Unity3D 炉石传说制作全套视频教程》[24课时]
[000099]《Unity3D 屠龙战机全套制作视频教程》[15课时]
[000100]《Unity3D 游戏蛮牛 编程系列教程》[第五季][61课时]
[000101]《Unity3D 游戏蛮牛 公开课》[第一季][108课时]
[000102]《Unity3D 游戏蛮牛 2D进阶公开课》[第二季][37课时]
[000103]《Unity3D 游戏蛮牛 游戏开发中高级美术》[第三季][26课时]
[000104]《Unity3D 游戏蛮牛 插件系列教程》[第四季][83课时]
[000105]《Unity3D 游戏蛮牛 手机游戏实战类完整实例》[第六季][63课时]
[000106]《Unity3D 游戏蛮牛 虚拟现实系列实例》[第七季][49课时]
[000107]《Unity3D 游戏蛮牛 游戏开发中高级美术》[第八季][40课时]
[000108]《Unity3D CS之战局域网射击游戏案例视频教程》[28课时]
[000110]《Unity3D 黑暗奇侠RPG剧情类游戏案例视频教程》[55课时]http://11801497.blog.51cto.com/11791497/1794567
发表于 2016-8-2 14:41 | 显示全部楼层
吊吊吊顶顶顶顶顶
发表于 2017-2-17 11:12 | 显示全部楼层
楼主是超人
发表于 2017-2-17 10:25 | 显示全部楼层
真心顶
发表于 2017-2-17 10:41 | 显示全部楼层
难得一见的好帖
发表于 2017-2-17 11:14 | 显示全部楼层
很好哦
发表于 2017-2-17 10:27 | 显示全部楼层
LZ真是人才
发表于 2017-3-13 08:28 | 显示全部楼层
很不错
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-4-28 00:45 , Processed in 0.215472 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表