也许这一篇文章的内容有点枯燥,但我要说的是如果你想深入的了解游戏引擎是如何处理动画片断或者素材并

让玩家操控的角色动起来栩栩如生,那么这真是一篇好文章(当然我仅仅是翻译了一下)
 

动画脚本 Animation Scripting

Unity's 动画系统允许你创建一个漂亮的动画蒙皮角色. 动画系统支持动画融合,混合,添加动画,步调周期时间同步.动画层.控制动画回放的所有方面(时间,速度,混合权重) 每个顶点有1.2.4个骨骼影响的mesh,基于物理系统的布娃娃系统,另外还有程序动画.为了获得最佳效果推荐您在制作模型和动画绑定前阅读一下 Modeling Optimized Characters 章节.

制作一个动画角色主要包括两个方面; 在世界中移动  由此产生的动画. 如果你想了解角色移动相关的更多内容, 请参阅Character Controller page.   实际上角色动画是由Unity's 脚本界面完成的 .

你可以下载 example demos 中预设置好的动画角色. 当你学完本页的基础部分你还可以看一看 animation script interface.

如果需要你可以点击并快速转到以下主题:

·         Animation Blending    动画融合

·         Animation Layers      动画层

·         Animation Mixing       动画混合

·         Additive Animation      附加动画

·         Procedural Animation    程序动画

·         Animation Playback 和 Sampling   动画重放和取样

Animation Blending 动画融合

在现今的游戏中Animation Blending是一项保证游戏动画顺畅过渡的基本的特性.动画师创建的动画例如: walk循环, run 循环, idle原地空闲动画 或射击动画.在游戏的任何时间点你都有可能从空闲站立转换到走动,反之亦然. 当然你不希望两个不同的动作之间突然跳转, 你需要动画平滑过渡.

而这个问题的解决就依赖动画融合技术. 在Unity中你可以让同一个角色拥有任意数量的动画.所有这些动画融合添加成为一个总的动画.

首先我们来为一个角色添加两个动画原地空闲站立和走动并平滑的使这两个动画过渡. 为了使我们在写脚本时简单些, 首先我们设置动画的 Wrap Mode为 Loop. 然后关闭 Play Automatically来让我们的脚本来独占动画的播放.

我们第一个动画脚本很简单; 我们需要一些方法来探查角色移动的有多快, 然后在走和站立之间淡入淡出. 在这个简单的测试中我们使用 pre-setup input axes.

function Update () {

if (Input.GetAxis("Vertical") > 0.2)

animation.CrossFade ("walk");

else

animation.CrossFade ("idle");

}

下面我们来让这个脚本运行:

1.       创建一个js脚本 Assets->Create Other->Javascript.

2.       把代码拷贝进去

3.       把脚本拖拽给角色 character (It needs to be the same GameObject as the animation)

点击Play 按钮, 当你按上下键时角色会走动,松开上下键时角色站立不动.

动画层Animation Layers

层是一个非常有用的概念它可以让你将动画片段任意成组并且区分优先顺序.

在Unity's动画系统中, 你可以混合任意数量的动画片段. 你可以手工分配权重或者直接使用animation.CrossFade(),来自动分配权重.

混合权重混合权重总是在应用前被规格化 normalized

比如说我们现在有一个 walk cycle 和一个run cycle, 权重都是1 (100%).当unity计算最终动画时会规格化权重, 这意味着walk占50% 权重,   run cycle占50% 权重.

这在大多数情况下都是不错的, 但当两个动画片段同时运行而其中一个权重明显大于另外一个. 那么你需要手动调整权重值,但如果你使用动画层来解决这个问题过程会容易得多.

制作动画层的范例Layering Example

例如现在你有一个射击动画, 一个空闲站立,一个走动循环  . 你需要在走和站两个动作间持续的淡入淡出(在玩家走动速度的基础上) 但当玩家射击时我们只想展示射击动画. 因而射击动画此时的优先度最高.

为了达到这一目的最简单的方法是在射击时简单的保持 walk 和 idle动画. 接下来需要确定shoot animation在一个比idle 和walk更高的层. 这意味着shoot animation 将首先收到混合权重.   walk 和idle 只有在 shoot animation不使用 100% 混合权重的情况下接收权重. 所以当 CrossFading the shoot animation in, 权重将从0开始很短时间内到达 100%. 在开始阶段 walk 和idle 层将依然可以收到混合权重 但当 shoot animation 完全切入时, 他们就收不到权重了.  这才是我们需要的!

function Start () {

// Set all animations to loop 设置所有动画为循环

animation.wrapMode = WrapMode.Loop;

// except shooting 除了射击(不循环)

animation["shoot"].wrapMode = WrapMode.Once;

//放置idle 和 walk 进低一级别的 layers  (默认 layer 总是 0)

// This will do two things这将作两件事情

// - 当 calling CrossFade时,

Unity3d动画脚本 Animation Scripting(深入了解游戏引擎中的动画处理原理)的更多相关文章

  1. 游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)

    (转)游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)   重要:在目前市面上常见的游戏引擎中,主要采用以下三种灯光实现方式: 顶点照明渲染路径细节 Vertex Lit Rendering ...

  2. (转)游戏引擎中三大及时光照渲染方法介绍(以unity3d为例)

    重要:在目前市面上常见的游戏引擎中,主要采用以下三种灯光实现方式: 顶点照明渲染路径细节 Vertex Lit Rendering Path Details 正向渲染路径细节 Forward Rend ...

  3. 安卓开发20:动画之Animation 详细使用-主要通过java代码实现动画效果

    AlphaAnimation 透明效果实现: activity_main.xml中仅仅是一个简单的图片,下面的例子都会使用这个xml: <RelativeLayout xmlns:android ...

  4. 3D游戏引擎中常见的三维场景管理方法

    对于一个有很多物体的3D场景来说,渲染这个场景最简单的方式就是用一个List将这些物体进行存储,并送入GPU进行渲染.当然,这种做法在效率上来说是相当低下的,因为真正需要渲染的物体应该是视椎体内的物体 ...

  5. 《Genesis-3D开源游戏引擎--横版格斗游戏制作教程02:关键帧动画导入与切割》

    2. 关键帧动画导入与切割 动画的分割与导入概述: 在游戏当中,游戏角色在不同状态下会有不同的动作,这些动作在引擎里相当于一段段的动画片段.当导入模型资源的时候,连同模型动画都会一并导入到引擎中.开发 ...

  6. unity从模型中抽取动画文件(animation)

    http://www.cnblogs.com/leng-yuye/archive/2013/01/11/2856144.html 由于模型是由第三方的软件制作的,用unity不能直接编辑模型里的动画文 ...

  7. 第一章-第二题Unity3D游戏引擎相关--By林培文

    1) 此类软件是什么时候开始出现的, 这些软件是怎么说服你(陌生人)成为他们的用户的?  他们的目标都是盈利么?  他们的目标都是赚取用户的现金么?还是别的? 2004年,Unity3D诞生于丹麦哥本 ...

  8. 微信小程序:动画(Animation)

    简单总结一下微信动画的实现及执行步骤. 一.实现方式 官方文档是这样说的:①创建一个动画实例 animation.②调用实例的方法来描述动画.③最后通过动画实例的 export 方法导出动画数据传递给 ...

  9. .net mvc 站点自带简易SSL加密传输 Word报告自动生成(例如 导出数据库结构) 微信小程序:动画(Animation) SignalR 设计理念(一) ASP.NET -- WebForm -- ViewState ASP.NET -- 一般处理程序ashx 常用到的一些js方法,记录一下 CryptoJS与C#AES加解密互转

    .net mvc 站点自带简易SSL加密传输   因项目需要,传输数据需要加密,因此有了一些经验,现简易抽出来分享! 请求:前端cryptojs用rsa/aes 或 rsa/des加密,后端.net ...

随机推荐

  1. MyBatis学习总结(三)——优化MyBatis配置文件中的配置

    一.连接数据库的配置单独放在一个properties文件中 之前,我们是直接将数据库的连接配置信息写在了MyBatis的conf.xml文件中,如下: <?xml version="1 ...

  2. python基础07 函数

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 函数最重要的目的是方便我们重复使用相同的一段程序. 将一些操作隶属于一个函数,以后 ...

  3. 用PHP获取系统时间时,时间比当前时间少8个小时

    自PHP5.0开始,用PHP获取系统时间时,时间比当前时间少8个小时.原因是PHP.ini中没有设置timezone时,PHP是使用的UTC时间,所以在中国时间要少8小时. 解决办法: 1.在PHP. ...

  4. MSBuild简单介绍

    背景 托博客园的福,上周六,有家开发医疗行业系统的初创公司联系我,说在博客园上看到我关于WPF的几篇文章,邀请我去他们那里交流WPF相关的技术知识和心得体会.作为非大拿的我自然是受宠若惊,但对方好意相 ...

  5. 关于隐藏input输入内容问题

    如果想通过获取焦点输入改变内容,type不能是hidden的 <input type="hidden" id="test"> // 这种是不行的,只 ...

  6. MFC的自定义消息的定义与使用

    自定义消息的响应和资源消息的响应有很多类似之处:资源消息的响应是以资源的ID号作为标识的:自定义的消息要自己声明消息ID. 一.           定义: 第一步要声明消息: #define WM_ ...

  7. maven提示invalid LOC header (bad signature)的解决办法

    今天执行mvn test的时候提示: 错误:读取 /home/subaochen/.m2/repository/org/slf4j/slf4j-api/1.6.1/slf4j-api-1.6.1.ja ...

  8. redis info参数详解

    redis 127.0.0.1:6381> info redis_version:2.4.16                                  # Redis 的版本redis ...

  9. {POJ}{树状数组}

    总结一下树状数组的题目: {POJ}{3928}{Ping Pong} 非常好的题目,要求寻找一个数组中满足A[i]<A[k]<A[j]的个数,其中i<k<j(或者相反).很巧 ...

  10. centos7.2下编译安装git

    centos最新的7.2版本,git居然是1.8,而最新的git版本是2.9 差的太多了,何况git2.0后有大更新.于是,我决定编译安装.中间有一点小破折,记录一下,备忘. 1,下载最新的源码,网址 ...