Unity3D之Mecanim动画系统学习笔记(十一):高级功能应用
来源:互联网 发布:影视制作软件app 编辑:程序博客网 时间:2024/05/21 15:44
动作游戏
还记得读书的时候熬夜打《波斯王子》的时光,我们的王子通过跳跃穿过墙壁的小洞、在高层建筑上进行攀爬和跳跃,还有在操作失误掉下高楼和触发必死机关后使用时之沙的时光倒流功能回归死亡之前的开挂技能。
而现在这些功能使用Unity3D的Mecanim都可以非常简单的实现了!
这篇笔记主要记录下Mecanim的3个高级功能:
- Animation Curve:可以根据动画的运行时间自定义一条曲线,在播放动画时可以获得这条曲线对应的值,可以实现跳跃穿过小洞的功能;
- Target Match:匹配一个预先定义好的点进行动画播放,可以实现人物攀爬的功能;
- Animation Record:可以对动画进行录制,然后可以播放录制好的动画,可以实现时之沙的时光倒流功能;
可以说Unity3D现在已经具备了开发一款媲美国际大厂的动作游戏的能力了。
Animation Curve
这里我们直接使用官网给出的示例,打开场景Scale Capsule:
运行游戏,我们发现此时人物是不能通过跳跃穿过墙上的小孔的:
原因很简单,人物的胶囊碰撞体比小孔要大。当我们勾选了右上角的Apply Scale之后,再跳跃试试看:
此时我们发现当人物跳跃时,胶囊碰撞体就会进行缩小,而我们的人物就可以钻过这个小洞了,在跳跃之后胶囊体会进行恢复。
我们找到动画文件Dive,就可以看到其设置了两个Curve:
而其中的ScaleOffsetCapsule就是用来控制胶囊体缩放的曲线,我们可以发现其呈现了1->0->1的一个区间。
然后我们看看参数的设置:
参数必须是Float类型同时名称必须和动画文件中的Curve名称一致,这样当我们播放跳跃动画时该参数就会根据预设好的曲线来取值了,注意该参数后方的输入框已经禁用了,不能输入。
最后我们看下脚本ScaleCapsule的实现:
通过每帧获取参数的值来实现跳跃的碰撞体变小的功能。
Target Match
核心是使用到了Animator的MatchTarget方法,帮助如下:
http://docs.unity3d.com/ScriptReference/Animator.MatchTarget.html
这里我们还是直接使用官网给出的示例,打开场景Target Match:
我们发现在箱子上方已经做好了一个目标点,我们的人物的右手会匹配到这个点进行动画播放。
需要注意的是,使用MatchTarget的动画必须位于Base Layer层。Match Target会将我们人物的一个部位的位置和目标点的位置进行插值来移动我们人物,结果就是可以通过一个指定高度的攀爬动画来匹配任意高度的攀爬。
我们看下调用的脚本:
// Update is called once per framevoid Update () { if (animator) { AnimatorStateInfo state = animator.GetCurrentAnimatorStateInfo(0); if (Input.GetButton("Fire1")) animator.SetBool("Jump", true); if (state.IsName("Base Layer.JumpUp") || state.IsName("Base Layer.FullJump")) { animator.SetBool("Jump", false); animator.MatchTarget(RightHand.position, RightHand.rotation, AvatarTarget.RightHand, new MatchTargetWeightMask(new Vector3(1, 1, 1), 0), animator.GetFloat("MatchStart"), animator.GetFloat("MatchEnd")); hasJumped = true; } if (hasJumped && state.normalizedTime > 1.2) { hasJumped = false; Application.LoadLevel(0); } }}
Animation Record
Unity3D的Animator类为我们提供了4个方法用于录制和播放动画:
- StartRecording:开始录制动画。http://docs.unity3d.com/ScriptReference/Animator.StartRecording.html
- StopRecording:结束录制动画。http://docs.unity3d.com/ScriptReference/Animator.StopRecording.html
- StartPlayback:开始播放录制的动画。http://docs.unity3d.com/ScriptReference/Animator.StartPlayback.html
- StopPlayback:结束播放录制的动画。http://docs.unity3d.com/ScriptReference/Animator.StopPlayback.html
同时我们也可以通过访问Animator提供的一些属性来了解动画录制的一些信息:
- playbackTime:播放时间。http://docs.unity3d.com/ScriptReference/Animator-playbackTime.html
- recorderStartTime:开始录制的时间。http://docs.unity3d.com/ScriptReference/Animator-recorderStartTime.html
- recorderStopTime:结束录制的时间。http://docs.unity3d.com/ScriptReference/Animator-recorderStopTime.html
使用比较简单就不做示例展示了,需要注意的时,回放录制的动画时人物会回到开始录制的坐标点,而不是在当前坐标点开始播放。
原文地址:http://www.cnblogs.com/hammerc/p/4835039.html
- Unity3D之Mecanim动画系统学习笔记(十一):高级功能应用
- Unity3D之Mecanim动画系统学习笔记(一):认识Mecanim动画系统
- Unity3D之Mecanim动画系统学习笔记(一):认识Mecanim动画系统
- Unity3D之Mecanim动画系统学习笔记(一):认识Mecanim动画系统
- Unity3D之Mecanim动画系统学习笔记(十):Mecanim动画的资源加载相关
- Unity3D之Mecanim动画系统学习笔记:Animator Controller
- Unity3D之Mecanim动画系统学习笔记(七):IK(反向动力学)动画
- Unity3D之Mecanim动画系统学习笔记(八):Animator Layers(动画分层)
- Unity3D之Mecanim动画系统学习笔记(六):使用脚本控制动画
- Unity3D之Mecanim动画系统学习笔记(九):Blend Tree(混合树)
- Unity3D之Mecanim动画系统学习笔记(九):Blend Tree(混合树)
- Unity3D之Mecanim动画系统学习笔记(五):Animator Controller
- Unity3D之Mecanim动画系统学习笔记(二):模型导入
- Unity3D之Mecanim动画系统学习笔记(三):Animation View
- Unity3D之Mecanim动画系统学习笔记(四):Animation State
- Unity3D之Mecanim动画系统学习笔记(五):Animator Controller
- Unity3D之Mecanim动画系统学习笔记(五):Animator Controller
- Unity3D之Mecanim动画系统学习笔记(五):Animator Controller
- 工厂模式(简单工厂、工厂方法)
- 线程网络的分配
- 国嵌嵌入式开发板学习笔记-外设的使用
- Linux history命令使用
- Arcgis Server通过发布GP服务实现等值线(实践经验)
- Unity3D之Mecanim动画系统学习笔记(十一):高级功能应用
- 跨域的一个简单方案
- 数据库三大范式
- cpp——复合类型——函数——函数重载
- #undef 的用法及其意义
- POJ 2502 Subway
- 广州 Android 安卓培训一期视频+原课件代码
- 并查集优化下-3
- c# 调用 C++ dll 传入传出 字符串