本帖最后由 Amo 于 2013-5-3 15:32 编辑
昨晚,头目在群里说了一下关于动作名称的内容,我整理了一下记录:
规则是这样。actor消息里面有AnimGroupApply这个消息,这个消息用来给actor播放的所有动作名插入一个关键字,而动作名是由关键字组成的,可以不止一个词,通常来说,站立的时候会播放stand,而你用了AnimGroupApply A。那么这个actor在试图播放stand的时候。会先去搜索这样的动作:
A Stand xxxx
Stand A xxxx
Stand xxxx A
不止是stand, 一旦接受了AnimGroupApply A,那么不管它播放什么动画都会试图带上个A。,如果要播放Stand,却找不到A Stand 或者Stand A之类的关键字。那么就会放弃A,再来单独找Stand。
数字是特例,最好不要作为标签。后面会有更详细的介绍。
如果,你有4个不同的变形,每个都有不同的stand动作,那么就分别叫他们Stand StageFirst一直到Stand StageFourth或者Stand A一直到Stand D,如果每个组有不同开火动作,也可以加Attack A这样的。然后,不带A、B、C、D的动作可以作为默认动作。比如Sleep,如果模型本身没有Sleep A动画的话,就可以单独用Sleep,那么在A状态下播放Sleep会直接播放Sleep,如果没有了Apply A或B,C,D,就那只播放Stand,除非找不到Stand和Stand 01、Stand 02这些。
基本上,标签加在什么位置都可以,但是不能加在数字后面,数字必须在最后,另外,比较建议的方案是,把标签放在第二个位置。最后,标签同样要遵守命名规则。比如Stand apdsd xxxxxx是不行的,组成动作名的关键字必须在固定列表里选择,只能使用固定单词来组成词组。
动画名顺序中,有意义的其实只是第一个关键字。其它关键字的顺序是没意义的。比如你有一动画,Stand Work A Start,那么你让它播放这个动作Stand A Start Work,结果还是会放Stand Work A Start。但是如果模型只有一个Start Stand Work A,那么匹配就会失败,因为找不到以Stand开头的动作,除非你先给它加一句AnimGroupApply Start,那么这时候Start被认为是组关键字,Stand就成了第一个关键字了,这时候它就会播放 Start Stand Work A。Stand Work A和Stand A Start Work有三个关键字相同,所以能被播放。也就是抽取group tag之后,在剩下的动作名里面找。总而言之,最好不要把Tag放在最前面。
第一个放动作名,第二个放标签,剩下的放第三位。
下面举个例子,如果我要播放 Stand Work Upgrade Start,而目标模型有
Stand
Stand Work
Stand Upgrade Start
那么它会播放哪个动作?
答案是第三个,最大匹配,但是不计算顺序,Stand Work和Stand Start Upgrade之间选择的话,结果还是Stand Start Upgrade。
简单来说,匹配规则是:
1.抽掉tag
2.匹配第一个关键字,如果找不到以第一个关键字开头的动画名,匹配失败
3.将剩下的关键字进行最大匹配,不计顺序
所以,一个模型里面不可以同时出现Stand Work Start和Stand Start Work,因为本质上它们就是一回事。
若需要同时存在,那么把它们命名为Stand Work Start,Stand Start Work 01这样就可以了,这样就是随机抽个,所有不带数字的动画名,其实都相当于省略了00
例如:
Morph
Morph 01
Morph 02
Morph 03
如果有以上这四个动画,那么我只想播放第一个,答案是播放Morph 00,如果播放Morph,就是随机抽了。
虽然Stand Work Start和Stand Start Work是一样的,但
Stand Work Start
Stand Work
Stand Work End
这三个动作通常是成对出现的,Stand Work是一个状态,而且有开始和结束动作,要让他们依次播放我可以说出十几种方案来,甚至刚才说的那个AnimGroupApply也可以通过加参数获得这样的效果,了解些实用的actor消息对模型制作也很有帮助,可以知道自己想要实现的东西这样弄是否能被实现等等。
对于一个动作名,只要能匹配第一个关键字,接下去全都能作,不过有一种情况才是真正束手无策的,就是动画名的关键字不对,结果根本认不出来,那就无从播放了,只要组成名字的还是关键字,就有办法任意播放它们。
另外,数字其实可以拿来当group tag的,比如你有stand 00、stand 01、attack 00、attack 01,那么加上01的tag以后呢,它播放stand的时候就会去放01了,不过实际使用大概不常用,因为,如果我要播放stand 01我直接播放它就好了,而连着播放attack 01,比较难匹配好。此外,数字只能出现一次。最后不要忘记,第一关键字的优先级大于组tag,用户看到01,02,肯定不会想到它们是一对一对的。所以如果加了A以后播放stand的时候,找不到Stand A,那就会播放Stand,这一点刚才说过了,不过我觉得有必要重申一下。
组Tag可以是复数个关键字,如AnimGroupApply {B,Work},中间用逗号,并用大括号括起来。AnimGroupApply {A,B}这时候就要求动作名里同时有A和B,这时各组名字都带的动作就同时算在{A,B}组,正确来说AnimGroupApply {A,B},和发送两条消息等价
AnimGroupApply A
AnimGroupApply B
Apply了A再Apply B,和Apply {A,B}是一样的,如果有Stand A B那么就会放Stand A B,如果只有A或者B,那么两个平权,但是Stand A比单独的Stand优先,这时候如果再发一句AnimGroupRemove B,那么就相当于只发了AnimGroupApply A。Actor里面标准的播放动画消息其实也是像这样带括号的。
AnimGroupApply 是不看顺序的,tag无视顺序,而播放动画的时候第一个关键字很重要。
说最后一个我觉得值得一提的地方吧,走和跑的动画,Run这个关键字是存在的,所以你可以做一个Run动画和一个Walk动画,这样用户可以根据移动速度来播放合适的动画,但是Run这个动画名,和Walk Fast这个动画名哪个好?答案是后者。毫无疑问的。单位Actor存在一个叫Baseline的东西,简单地说就是为了给用户简化操作而设的,用不着你写些复杂的actor消息,通常来说移动的baseline我们会设成Walk,站立的baseline我们会设成Stand,但是baseline是唯一的,不能同时是Walk和Run,所以如果你想要移动的时候播放Run,那可就麻烦了,自己从头写事件消息吧,而且要考虑各种打断状况。actor可以判断单位移动速度,所以你判断速度然后添加和删除Fast就好了。
最后,请头目一定一定注意身体!按时睡眠,千万别再熬夜了!别在电脑前持续时间太久,多休息。
|