说明:以下都是本人个人见解,如有错误请自行进行纠正
四、优缺点
优点:
1.首先就是对GameObject属性的控制,可以像Unity的Animation动画一样通过关键帧动画控制GameObject的位置、旋转、数值变化、开关等,简直就是Animation的替代品;
2.然后就是源生支持Mecanim动画系统,不论是简单的动画播放或者多层动画控制都是得心应手,信手拈来;
3.其次当然是强大的事件系统,几乎可以控制所有的东西,无所不能;
4.最后当然是USequencer可以直接在不Play的情况下预览剧情、播放动画和特效等,这极大的方便了美术的制作和使用,而对于那些与场景交互密切的剧情,就更加需要这个功能,想象一下不用每修改一次参数就要Play一下去看修改的对不对,靠的紧不紧等
缺点:
1.首先依然还是属性控制,在保存为Prefab的时候,会生成很多的小文件,几乎是一个关键帧对应一个小文件,对项目目录结构不友好,保存完后重新打开需要一个个的解析这些小文件,还常常失败,导致要重新制作等;
2.然后就是源生的播放Mecanim那套东西,也常常出各种问题,不是Animator找不到,就是Animation找不到,一些动画控制器状态的增删改查也会引起做好的剧情打不开等等;
3.其次是事件系统,这个到没出什么BUG,只是原版的瞬时事件和持续事件在原版默认情况下显示不够准确,有时会造成美术的误读等(后面有解决方法,但是只有源码版的可以修改),事件系统除了这个就没有其他问题
4.最后还是编辑模式下的预览,编辑模式下,毕竟不具备我们游戏运行时所需要的那些环境(比如当前玩家Animator),也因此我们常常要写两份代码,一份在编辑时执行,一份在运行时执行,这点非常的考验人。有的是编辑下能看到效果,有的是运行时才能看到效果。
5.工程容易崩溃,东西可能要从头开始做
五、未解决问题
1. 如何倒着播放
2.02 AdditivelyLoading Cutscene场景中的 怎么加载出来的
3. BasicExample01-PropertiesAndEvents场景中摄像机的路径是怎么设置的
4.动态加载另一个场景时,有错误:You have added an AutoPlaySequence, however you haven't assigned it asequence
六、能使用的类有:USEventBase USEventBaseEditor USSequencer
七、其他功能实现:事件的扩展
using UnityEngine;
using System.Collections;
namespace WellFired
{
///<summary>
/// A custom event that allows you to alter thegame's TimeScale over a given time period with the specified curve.
///</summary>
[USequencerFriendlyName("Time Scale")]//用来做事件的GameObject名称和剧情面板中的名字
[USequencerEvent("Time/Time Scale")]//该事件的菜单Item
[USequencerEventHideDuration()]//表示该事件是否为瞬时事件(有这个命令会被标识为瞬时事件,没有则为持续事件)
public classUSTimeScaleEvent :USEventBase
{
///<summary>
/// This curve defines the TimeScale over agiven time period.
///</summary>
public AnimationCurve scaleCurve = new AnimationCurve(new Keyframe(0.0f, 1.0f), new Keyframe(0.1f, 0.2f), new Keyframe(2.0f, 1.0f));
private float currentCurveSampleTime = 0.0f;
private float prevTimeScale = 1.0f;
//事件开始时执行,类似于Enable,只执行一次
public override void FireEvent()
{
prevTimeScale = Time.timeScale;
}
//事件持续执行时调用,类似于Update,多次执行
public override void ProcessEvent(float deltaTime)
{
currentCurveSampleTime = deltaTime;
Time.timeScale = Mathf.Max(0f,scaleCurve.Evaluate(currentCurveSampleTime));
}
//事件结束时执行,类似于Disable,只执行一次(结束时自动调用)
public override void EndEvent()
{
float sampleTime = scaleCurve.keys[scaleCurve.length - 1].time;
Time.timeScale = Mathf.Max(0f, scaleCurve.Evaluate(sampleTime));
}
//事件被停止时执行,整个剧情Sequence被Stop时执行
public override void StopEvent()
{
UndoEvent();
}
//事件被暂停时执行一次
public override void PauseEvent()
{
base.PauseEvent();
}
//事件继续播放时执行(有问题)
public override void ResumeEvent()
{
base.ResumeEvent();
}
//事件被撤销时执行(有问题)
public override void UndoEvent()
{
currentCurveSampleTime = 0.0f;
Time.timeScale = prevTimeScale;
}
}
}
对于每个事件,FireEvent和ProcessEvent是必须要实现的,其他方法可选。
EndEvent、StopEvent和UndoEvent都最好实现以下,用来对FireEvent和ProcessEvent进行逆操作,因为剧情很大一部分事件都是在不运行游戏下执行,如果不执行逆操作,运行几遍后,整个场景就真的惨不忍睹,编辑不下去了。
八、制作一个小demo
新建一个场景,将Auto Play uSequence拖入场景,Ctrl+u 新建一个Sequence,将摄像机拖入
右击鼠标添加关键帧,进行编辑,完成摄像机的简单移动
九、热键
Ctrl+U 打开
Ctrl+I 关闭
Alt+, 上一帧
Alt+. 下一帧
, 减0.01秒
. 加0.01秒
p 开始或暂停
S 停止
十、相关文章参考
文章一ttp://www.seven-fire.cn/archives/186
文章二http://www.seven-fire.cn/archives/199
文章三 http://blog.uwa4d.com/archives/Usequencer3.html
联系客服