实现暂停一秒输出的效果_从暂停游戏联想到的

你希望玩家按下暂停键时就可以暂停游戏,如果你使用 Unity,最关键的的操作就是把 Time.timeScale 设置为 0。后来,你又希望应用程序失去焦点时也能暂停游戏,这时聪明的你想到一个问题:那么应用程序重新获得焦点后可以自动取消暂停吗?之所以这是个问题,是因为你想到了这样一种情况:玩家按了暂停键,然后将鼠标点到QQ窗口里和群友聊了两句,然后回到游戏窗口——发现游戏自己取消暂停了!这肯定是不可接受的。

问题出在哪?

暂停游戏是一件事,但触发暂停的因素有多种;恢复暂停也是如此。这就是一种典型的“多输入源对应单一输出”问题。要解决这个问题有个简单的办法:加上计数即可。

    public struct TimeManager
    {
        static int _pausedCount = 0;

        public static void Pause()
        {
            if (_pausedCount == 0) Time.timeScale = 0f;
            _pausedCount++;
        }

        public static void Resume()
        {
            _pausedCount--;
            if (_pausedCount == 0) Time.timeScale = 1f;
        }
    }

在使用这个时间管理器时,需要保证每个模块都成对调用 Pause/Resume,比如负责窗口焦点变化监听的代码在失去焦点时调用 Pause,在获得焦点时调用 Resume;负责玩家输入处理的代码在检测到暂停请求时调用 Pause,在检测到恢复请求时调用 Resume……由于计数的存在,只要正确的成对调用就能保证游戏正常运行。

涉及 bool 状态的代码可能用这种办法就可以解决“多输入源对应单一输出”问题,但更复杂的数据/需求就行不通了,比如手柄震动,涉及震动的强弱,float 类型。你希望玩家受到攻击时手柄可以震动,游戏世界发生地震时手柄也会震动,那么:玩家在地震中同时受到多个敌人不同程度的攻击时,手柄该怎么震?

简化问题:假设手柄只有一个震动电机。很明显,这也是“多输入源对应单一输出”问题。要解决这个问题,用自然语言描述的话,可能是“将不同输入源的震动系数叠加”或者“取所有震动源的震动系数中最大的那一个”。用程序语言描述的话,你需要为每个震动源分配一个震动通道,在最终输出之前你遍历所有通道然后计算最终输出的震动系数。

“多输入源对应单一输出”问题在游戏开发时非常常见,除了上面提到的两个例子,像音效、全屏后期效果、用户界面等方面都可能遇到这样的问题。这种问题的特点是,一开始看起来好像很简单而不被注意,但遇到问题时才发现要解决的话很麻烦,你可能会面临“是打个补丁还是重构代码”这样的选择。

更新:这是最近改进的 Unity Package,内含有 Blender 专用于解决此类问题:

Unity Extensions Extra​github.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值