游戏蛮牛学习群(纯技术交流,不闲聊):159852603
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

首页   >   博客   >   随幻Kaller

Unity Update()计时器封装 可实现多种时间的操作 热度 1

个人分类: Unity脚本 | 2018-3-31 15:27
标签:Unity
0 个评论 | 阅读 780 | 收藏 | 举报
说到时间控制 就会想到几种操作方法:
1 Update() 中 不断加Time.timeScale 然后到了 x秒相应什么事件
2 Invoke() 之类的函数 能在一开始设置时间 也可以循环等 但是相比Update要限制很多
3 Coroutine 协程 这个功能可以说是专门为用户方便的控制时间 模拟异步  但是虽然方便 但是内部实现是 用goto来实现看起来像异步的方法 但是用过协程的都知道 有时候会出现一些问题 也就是说协程也会带来一些麻烦 比如说笔者曾经遇到携程中内和外嵌套几个循环 其中的变量 如果你不拿出来  运行的时候就会报错 遇到好几次  然后放到Update中就好使

这里将说一下 1 Update
Update()这个函数虽说在效率上可能会消耗一些 因为Update()没帧都执行 效率也不高 但是却非常方便 不用考虑其他的事情  所以我接下来分享一种简单的时间控制类

[code]csharpcode:

//管理时间
class TimeScript
{
    float currTime;
    float totalTime;
    bool isRuning;
    bool isLooping;
    int loopTime;
    int currLoopTime;

    bool isPause;

    public bool IsPause
    {
        get { return isPause; }
        set { isPause = value; }
    }
    public void StartCountTime(float time, bool isLooping = false,int loopTime = 1)
    {
        totalTime = time;
        currTime = 0;
        if (loopTime > 0)
        {
            isRuning = true;
        }
        else
        {
            Debug.Log("the loopTime can't be less than 1");
        }
      
        this.isLooping = isLooping;
        this.loopTime = loopTime;

       
    }

    public bool CountTime(float time)
    {
        if (isPause)
        {
            return false;
        }

        if (isRuning)
        {

            currTime += time;
            if (currTime >= totalTime)
            {
                currTime = 0;
                if (!isLooping)
                {
                    isRuning = false;
                }
                else
                {
                    currLoopTime++;
                    if (currLoopTime >= loopTime)
                    {
                        isRuning = false;
                    }
                }
              
                return true;
            }
            else
            {
                return false;
            }
        }

        return false;
      
    }

}
上边的类是时间的操控类 可以设置循环(Invoke 之类的函数) 循环次数 暂停  
所以  在例子中不用每次都要设置个计时器的float变量 
示例:

[code]csharpcode:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TimeCalculate : MonoBehaviour {
    TimeScript time1 = new TimeScript();
    TimeScript time2 = new TimeScript();

    bool pauseToggle;
	// Use this for initialization
	void Start () {
     
        
        time1.StartCountTime(2,true,3);
        time2.StartCountTime(4,false);
	}
	
	// Update is called once per frame
	void Update () {

        if (time1.CountTime(Time.deltaTime))
        {
            Debug.Log("time1 is running...");
        }

        if (time2.CountTime(Time.deltaTime))
        {
            Debug.Log("time2 is over...");
        }

        if (Input.GetKeyDown(KeyCode.P))
        {
            pauseToggle = !pauseToggle;
            time1.IsPause = pauseToggle;
        }
     
	}
}
这样每个时间器是并行的 而且不用每次都要 timer += Time.timeScale; if(timer > 3){...}这样的语句
这里扩展的话直接修改 TimeScript 即可  不用再主程序写这样冗余的代码了 比如在时间结束的时候调用的回调函数 等等
希望能给某些人带来帮助
1 0

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册帐号

个人分类

标签

阅读排行

评论排行

推荐博客

最新博客

关闭

站长推荐 上一条 /1 下一条

返回顶部