本节中我们来介绍Unity的动画系统以及管理动画剪辑(Animation Clip)的组件Animator。
Unity的动画系统又称为Mecanim,是一个基于动画剪辑(AnimationClip)的系统。在此系统中,我们可以通过对游戏对象的一系列属性进行操作从而制作关键帧,进而制作动画。
同时,由于Unity的动画是基于游戏对象(GameObject)的,动画中
-本节相关内容请读者参考:
-Animator 窗口 - Unity 手册,《Animator窗口》
Animator在Unity中分别可以指一个组件和一个查看、编辑Animator Controller的面板(在Scene面板旁边)。当Animator作为一个组件时,它可以向对应的GameObject添加一个Animator Controller用来管理GameObject的动画行为。
Animation则分别指Animator Controller管理的对象之一Animation Clip,Animation组件,或Animation面板(在Game面板旁边)。
为一个GameObject对象添加Animator组件或Animation组件(不添加二者之一没法创建Animation Clip),然后转到Animation选项卡,为其新建一个Animation Clip。然后点击Add Property,选择要在Clip中编辑的对象属性,例如Transform、Sprite,或是搭载脚本中的参数,然后以类似关键帧的形式编辑。例如,我编辑了一段角色向右走的简易关键帧动画,如下图所示:

除了这些直观的属性,还可以为其添加事件,或手动添加关键帧。
为一个GameObject对象添加Animator组件并创建一个空的Animator Controller,然后在Animator面板中查看,如下图所示:

可以看到,面板左侧为Layer层(可以理解为类似图层的东西)和Parameters参数列表,右边为Layer层的内容。初始的空Layer层有Any State、Entry和Exit三个状态,其中Any State连接到的状态只需满足过渡条件即可播放。而Parameters选项卡允许我们添加四种类型的变量,并在GameObject搭载的Script中调用,调用方式如下所示,例如我调用一个名为Right的Bool类型变量:
this.GetComponent<Animator>().GetBool("Right");
为GameObject创建一个Animation Clip,然后回到Animator选项卡中,你将会发现新的Animation Clip已经出现在Layer中,并且与Entry状态有一条黄色的连接线,且Clip的颜色是黄色,这说明了这个Clip已经作为默认播放的动画存在了。由于Layer必须要有一个默认Clip(在有Clip的状态下),你可以通过创建新的Clip然后点击Entry状态选择“Set StateMachine Default State”然后连接新Clip来修改默认Clip。
-本节相关内容请读者参考:
-状态机过渡 - Unity 手册,《状态机过渡》
在Layer中,不光能够连接State与Animation Clip,两个Animation Clip之间也可以互相连接。事实上,Animation Clip也是一个State,而Layer也可以被称为“State Machine”,顾名思义是控制GameObject动画状态的机器。右击一个State选择“Make Transition”,然后选择要连接到的State,即可完成一条State与State之间的连线。选择连线,查看Inspector面板,可以看到这条连线的相关信息,如过渡条件,过渡时间等。
结合Animator中的Parameters,我们可以将其作为过渡条件:
首先,创建一个空GameObject并搭载Animator与Sprite Renderer(Sprite Renderer负责显示精灵图)。
然后分别制作角色向四方向走动的Clip与四方向静止的Clip,以下二图为例:


在Animator的Parameters选项卡中创建“Up”、“Down”、“Left”、“Right”四个Bool类型的变量。然后为GameObject挂载脚本,监听键盘WASD的按下,根据键盘的动作修改Animator变量的取值,如:
void PlayerAnimController(){ //动画控制器
//同时按下的情况,先结算下左方向的移动
//不能同时往相反方向移动
if(this.cantMove){return;}
this.Down=Input.GetKey(KeyCode.S)&this.Up!=true;
this.Up=Input.GetKey(KeyCode.W)&this.Down!=true;
this.Left=Input.GetKey(KeyCode.A)&this.Right!=true;
this.Right=Input.GetKey(KeyCode.D)&this.Left!=true;
}
现在,让我们思考,如何才能让角色的行走动作更为自然?有人可能认为:将Any State与四方向行走的Clip连接在一起,将过渡条件分别设置为四个变量为真,然后在Clip后分别连接四方向的静止Clip,过渡条件为四个变量为假即可,如下图所示:

但如果如此,一旦按下对应的行走键,就将反复进入对应的行走Clip,而放下行走键就会直接静止,Clip根本不能够播完,这就会使得角色的行走方式十分生硬。
正确的State Machine则如下所示:

这样看确实眼花缭乱,那就让笔者用语言描述一下。由于四种行走方式是相互等价的,只需要描述其中一种行走方式即可,所以让我们拿左方向行走和站立举例:
可以看到,从左方向站立可以过渡到所有的行走状态(这是可以理解的,无论你以什么方向站立,都可以向任意方向走),其过渡条件则分别为对应的变量为真。而左方向行走状态则会过渡到左方向站立状态,过渡条件为对应的变量为假。

而对左方向行走来说,它可以由所有站立状态过渡而来,过渡条件为变量“Left”为真,而当“Left”为假时,它会过渡到左方向站立状态。
至于行走带来的角色位置变化,可以像笔者一样监听键盘,根据键盘状态每帧更新位置,也可以使用Clip改变Transmit或使用Clip事件。
到这里四方向行走的设置就基本完毕了,还有两个需要注意的点:为了让角色的转向更干净利落,需要关掉过渡的Exit Time与Transition Duration(下方方框中的值,一个去掉打勾,一个移动过渡条到消失),当然也可以使用记事本打开Animator文件,查找m_ExitTime与m_TransitionDuration,然后将其全部替换为0。
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po