Unity 中实现子弹时间效果

在以前,学习xna游戏框架时,由于xna封装的游戏元素很少,很多功能,只能自己去写一篇;

如:子弹时间效果;

先来介绍一个何为“子弹时间”效果;

这得始源于:著名科幻电影《黑客帝国》中男主角有一幕,敌方子弹扫射中,男主,以超快的速度,对子弹的闪避过程,这一过程,感觉整个世界的时间都变慢了,只是我们观察的人反应没有变慢的感觉---这一过程就是子弹时间;


得知子弹时间的定义后,我们可以知道,游戏多,一些电影,电视,游戏,中的各种摄影效果中,特效中;

都有用到子弹时间的表现方式;


如:

DNF,的BOSS最后致命一击;

孤岛危机 的加速动作;

或是现在有一些2D横版页游,都有制作了子弹时间效果;


那这些效果,在Unity 中,如果实现?

很简单就可以实现Time.timeScale = .1f; // 就以比正常速度,慢10倍的效果来播放;

这得归功于,Unity 的GameObject对象处理流程;


GameObject中,都有:FixedUpdate,Update两个方法;

前者是以,固定的一个时间频率去调整;

后者,则根据前定的FPS速率有影响关系;


Unity 中需要实时的呈现有效的运算效果,那就得写在:FixedUpdate方法,如:物理运算(Unity自带的钢体,都是在这运算),等;

这样,就算,我们把播放速度,变慢,也不会影响到FixedUpdate实时的更新物理逻辑层的呈现效果;


假如,你有一个2D横版的小DEMO;

你有一个主角,给主角加一个脚本控制;


BulletTime.cs

using UnityEngine;
using System.Collections;

public class BulletTime : MonoBehaviour {

    ...

    float timeScaleDelta = .05f;

	// Use this for initialization
	void Start () {
        ...
	}
	
	// Update is called once per frame
	void Update () {
        ...
        float spX = Input.GetAxis("Horizontal");
        float spY = Input.GetAxis("Vertical");
        // spX, spY 处理上下左右

        if (Input.GetKeyDown(KeyCode.W)) // 按下W时,把子弹时间加速播放
        {
            Time.timeScale += timeScaleDelta;
        }
        else if (Input.GetKeyDown(KeyCode.S)) // 按下S时,把子弹时间减速播放
        {
            if (Time.timeScale < 0) Time.timeScale = 0;
            else Time.timeScale -= timeScaleDelta;
        }
	}

    void FixedUpdate()
    {
        ...
    }

    ...
}

这样,如果你有控制,主角跳,飞之类的动作,主角在空中时,多按几次:S键,就可以看到,动作变慢了,可以清晰的看到慢动作的:子弹时间效果;

是不是帅呆了;


2D测试资源包:(包有点大,没有去掉其它多余的:NGUI, PlayMaker,都有,还有对一些动画系统的测试)

Jave's Unity Testing Package


下载了资源包,最新一个空项目,再导入,打个:2DCharactorControllerTesting这个场景,

运行,

再按下:上,下,左,右,跳,或移动;

再按下,W,S键调整子弹时间效果;


提示:这个Time.timeScale 的涉及效果范围是,Unity 中,所有,更新与时间相关的都会有影响;

如:GUI,NGUI,或是其它的一些角色动画等;


如果你实现类似,主角,操作不影响(移动,跳,攻击,等其它的一切操作),其它所有,怪物,场景动画(天气,多背景移动层,等)都变慢;

那么就不应该使用Time.timeScale去实现了;


如果要实现这样的效果,首先就要考虑到,对象的更新时间,你是可控的,最好不是内置的;或是受timeScale影响的;

如:你的主角动画:如果你想Time.timeScale设置之后,依然不影响主角动画;

那么主角动画的播放就应该使用自己写的一套管理方法,可以使用到,Time.realtimeSinceStartup的时间间隔作判断,以播放动画;


解决方案:

如果硬要实现以上的需求:

可以去看一下这两个插件:

http://forum.unity3d.com/threads/136139-Pause-Controller-Released-Group-Pausing-without-timeScale-0

http://forum.unity3d.com/threads/188179-Time-Control-and-Pause-Kit-(inc-Bullet-Time-Freeze-Fast-Motion-etc)-RELEASED


直接开翻墙后,看第二个的视频,就是你想要的效果;

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值