求教unity 使用Animator 控制unity spine动画画

unity 在代码中创建spine动画组件 - 建站 - IT精英团
当前位置:&>&&>&
unity 在代码中创建spine动画组件
时间: 15:56:15&&
来源:晨树&&
编辑:涛涛&&
& 项目中用到了spine动画,使用Assetbundle打包后,在手机上运行会出现丢材质的情况。如果不进行打包,直接放到Resources目录下是可以正常加载的,但是,这样包就会很大,而且也不能进行热更新。进过测试,发现在代码中创建spine组件是可以解决这个问题,于是就有了下面的方案。
我们先说方案,再说问题。
spine动画制作人员提供的spine动画三个文件分别是.json,.atlas,.png,把这三个文件放到unity(我用的unity版本是5.3.4f1)中,会自动生成atlas.asset,.mat,skeletondata.asset三个文件,我们只使用.mat文件,因为mat文件上已经关联了.png文件,所以我们实际要打包的文件是三个源文件.json,.atlas,.png和.mat文件,而.png文件实际上是作为.mat的依赖打包的,下面在代码中创建spine组件如下:
GameObject addSpineComponent(UnityEngine.Object obj)
& & & & GameObject go = GameObject.Instantiate(obj) as GameO
& & & & go.name = obj.
& & & & GameObject.DontDestroyOnLoad(go);
& & & & SkeletonA
& & & & SkeletonDataA
& & & & sda = ScriptableObject.CreateInstance&SkeletonDataAsset&();
& & & & sda.fromAnimation = new string[0];
& & & & sda.toAnimation = new string[0];
& & & & sda.duration = new float[0];
& & & & sda.scale = 0.01f;
& & & & sda.defaultMix = 0.15f;
&&&&& //SpineNameInfo中存着.json,.atlas,.mat的名称
& & & & SpineNameInfo sni = dicMonsterSpineInfos[go.name];
& & & & AtlasAsset[] arrAtlasData = new AtlasAsset[sni.AtlasFileNames.Length];
& & & & for (int i = 0; i & arrAtlasData.L i++)
& & & & & & string atlasFileName = sni.AtlasFileNames[i];
& & & & & & AtlasAsset atlasdata = ScriptableObject.CreateInstance&AtlasAsset&();
& & & & & & atlasdata.atlasFile = GetObj(atlasFileName) as TextA
& & & & & & string[] mNames = sni.GetMaterialNames(atlasFileName);
& & & & & & atlasdata.materials = new Material[mNames.Length];
& & & & & & for (int j = 0; j & mNames.L j++)
& & & & & & {
& & & & & & & & //Material m &= dicPreloadAssets[mNames[j]] as M
& & & & & & & & atlasdata.materials[j] = GetObj(mNames[j]) as M
& & & & & & }
& & & & & & //atlasdata.materials =
& & & & & & atlasdata.Reset();
& & & & & & arrAtlasData[i] =
& & & & sda.atlasAssets = arrAtlasD
& & & & sda.skeletonJSON = GetObj(sni.JsonFileName) as TextA
& & & & sa = go.AddComponent&SkeletonAnimation&();
& & & & sa.skeletonDataAsset =
& & & & sa.calculateNormals =
& & & & sa.skeletonDataAsset.Reset();
& & & & sa.AnimationName = &run&;
& & & & sa.loop =
& & & & sa.Initialize(false);
& & public class SpineNameInfo
& & & & private Dictionary&string, string[]& dicAtlasFileNames = new Dictionary&string, string[]&();
&&&&& //.json文件名
& & & & public string JsonFileName = string.E
&&&&& //.atlas文件名,可能有多个.atlas文件(虽然我的项目中只有一个)
& & & & public string[] AtlasFileNames
& & & & & & get
& & & & & & {
& & & & & & & & string[] s = new string[dicAtlasFileNames.Count];
& & & & & & & & dicAtlasFileNames.Keys.CopyTo(s, 0);
& & & & & & & &
& & & & & & }
&&&&& //.mat文件名,可能有多个mat文件
& & & & public string[] GetMaterialNames(string atlasFileName)
& & & & & & if (dicAtlasFileNames.ContainsKey(atlasFileName))
& & & & & & & & return dicAtlasFileNames[atlasFileName];
& & & & & & return new string[0];
& & & & public void Add(string atlasFileName, string[] m)
& & & & & & if (!dicAtlasFileNames.ContainsKey(atlasFileName))
& & & & & & & & dicAtlasFileNames.Add(atlasFileName, m);
& &//这里是我项目中用到的对象池,根据资源名,获取资源对象
& & public UnityEngine.Object GetObj(string name)
& & & & if (pool.ContainsKey(name))
& & & & & & return pool[name];
可能您会注意到,怎么没有.png文件呢,我刚才在上面也提到,png文件会作为mat文件的依赖打包进assetbundle,所以在加载mat文件的时候png自然也已经被加载好了。
下面说一下问题:
使用上述方案以后,发现一个问题,就是创建spine动画很耗时。因为有大量的怪物要创建,这样就导致原先的场景预加载时间很长,长到不能接受。好在虽然怪物数量庞大,但种类不是很多,复用也很高,所以就把spine动画的创建和预加载放到了游戏数据初始化中,时间虽然会有点长,但因为游戏刚开始初始化的东西不多,就还能接受,后面再加载场景怪物的时候,直接获取预加载的种类的对象,然后实例化就OK了。
到此,问题解决。
看过本文的人还看过
一个文化艺术垂直电子商务网站。
一个文化艺术垂直电子商务网站。
优秀网页设计联盟(SDC),是有着良好职业交流氛围的网页设计行业联盟。与优设哥
鲁春利的工作笔记,好记性不如烂笔头通过微信小程序访问https的域名时报错:说明:S
一直办公用win7系统习惯了,最近买了个IdeaPad-100s-14IBR搞头疼了,用了半个小时
CopyRight (C)
网站名称 版权所有. All Rights Reserved.备案号:浅谈Unity自带的Animation与骨骼动画Spine的优劣 - BuladeMian - 博客园
随笔 - 6, 文章 - 3, 评论 - 0, 引用 - 0
Unity自带Animation,Animator是可以实现精灵的变化,位置移动,位置旋转,精灵不同时间段的变换为其他精灵
骨骼动画Spine的优势是当游戏中人体复杂的动画体现,需要骨骼动画的存在
如果使用Unity自带的Animation,Animator也是可以实现 简单的人体骨骼动画 ,但是会有很多毛病
比如说:如果身体和腿部有很小的缝隙,同时放大就会出现异常大的缝隙
骨骼动画Spine可以模拟人体复杂的动画运行,使得 游戏的 动画 细节更加精美
国内有个免费的 骨骼动画软件DragonBones支持 骨骼动画Spine,可以实现复杂的人体骨骼动画
而且如果要实现不同角色不同衣服的体现,就必须使用骨骼动画,来做 基础
可以看下DragonBones里面的实际例子,每个骨骼的变化,以及每个时间点& 关键帧& 的设置很多很繁琐,如果使用Unity自带的Animator则相对复杂
我认为Unity自带的Animator可以有以下的实现:
1.简单的特效处理(2D或者3D)
2.游戏剧情的变换
3.简单的NPC表情的变换
4.怪物简单的动作
5.非骨骼 动画游戏,简单的游戏,可以使用Unity自带的Animator来制作动画
如下所示的都可以使用unity自带的animator来制作,帧动画特效
像素风格的简单帧动画,也可以使用 ,Steam有卖
Aseprite自带帧的时间轴,每一个关键帧都可以直接在Aseprite上面绘制unity编辑器拓展unity spriteRender图层管理工具支持Spine
使用unity做2d游戏的时候有个地方非常烦人而且经常出错,就是使用Sprite Renderer进行场景编辑的时候,图层老是重叠,或者有两个Sorting Order一样所以有时候A图层在前有时候B图层在前。
那么有没有一种方式能避免这些错误呢???于是想到做一个把所有Sprite Renderer(不局限于Sprite Render,同样对于Spine也支持)收集起来统一管理编辑的工具,下图是完成品截图:
功能如下:
1、单个显示/隐藏Sprite,确定当前编辑的是那个Sprite很有帮助
2、更加方便的更改Sorting Layer Id
3、更加方便的比对并编辑各个Order
4、直接选中当前编辑的Sprite
这样在编辑场景图层顺序时就一目了然知道有哪些相同图层或者顺序相同,也避免因为粗心导致的bug。
代码如下:
using UnityE
using System.C
using UnityE
using System.Collections.G
using System.R
public class LayerManagerEditor : EditorWindow {
private static MethodInfo EditorGUILayoutSortingLayerF
Dictionary&string,List&Renderer&& renders=new Dictionary&string, List&Renderer&&();
Dictionary&string,bool& selectDic=new Dictionary&string, bool&();
SerializedObject spRenderSerializedO
Vector2 scrollP
Renderer[] spR
void OnEnable(){
if(EditorGUILayoutSortingLayerField==null)
EditorGUILayoutSortingLayerField = typeof(EditorGUILayout).GetMethod(&SortingLayerField&, BindingFlags.Static | BindingFlags.NonPublic, null, new Type[] { typeof(GUIContent), typeof(SerializedProperty), typeof(GUIStyle) }, null);
spRenders = GameObject.FindObjectsOfType&Renderer& ();
Resort ();
void OnGUI(){
Refresh ();
void Resort(){
renders.Clear ();
foreach (Renderer spRender in spRenders) {
if(!renders.ContainsKey(spRender.sortingLayerName)){
renders[spRender.sortingLayerName]=new List&Renderer&();
renders[spRender.sortingLayerName].Add(spRender);
void Refresh(){
scrollPos = EditorGUILayout.BeginScrollView (scrollPos);
EditorGUILayout.Space ();
foreach (KeyValuePair&string,List&Renderer&& keyValue in renders) {
string layerName=keyValue.K
bool isSelected=
if(!selectDic.ContainsKey(layerName)){
selectDic[layerName]=
isSelected=selectDic[layerName];
isSelected = EditorGUILayout.Foldout (isSelected, layerName);
selectDic[layerName]=isS
if(isSelected){
int length=keyValue.Value.C
for (int i = 0; i & i++) {
Renderer spRender=keyValue.Value[i];
if(spRender==null)
EditorGUILayout.BeginHorizontal();
bool isActive=spRender.gameObject.activeS
isActive=EditorGUILayout.Toggle(isActive,GUILayout.Width(10f));
spRender.gameObject.SetActive(isActive);
EditorGUILayout.LabelField(spRender.name,GUILayout.MaxWidth(200f));
SerializedObject serializedObject = new SerializedObject (spRender);
SerializedProperty serializedProperty=serializedObject.FindProperty(&m_SortingLayerID&);
if(EditorGUILayoutSortingLayerField != null && serializedProperty != null) {
EditorGUILayoutSortingLayerField.Invoke(null, new object[] { new GUIContent(&&), serializedProperty, EditorStyles.popup } );
spRender.sortingLayerID = EditorGUILayout.IntField(&Sorting Layer ID&, spRender.sortingLayerID);
spRender.sortingOrder=EditorGUILayout.IntField(spRender.sortingOrder);
if(GUILayout.Button(&Select&)){
Selection.activeGameObject=spRender.gameO
EditorGUILayout.EndHorizontal();
serializedObject.ApplyModifiedProperties();
EditorUtility.SetDirty(spRender);
EditorGUILayout.Space ();
EditorGUILayout.Space ();
EditorGUILayout.Space ();
EditorGUILayout.Space ();
EditorGUILayout.BeginHorizontal ();
EditorGUILayout.Space ();
if (GUILayout.Button (&Resort&,GUILayout.MaxWidth(100f))) {
EditorGUILayout.Space ();
EditorGUILayout.EndHorizontal ();
EditorGUILayout.EndScrollView ();
[MenuItem(&Platform/Tool/LayerManager&)]
public static void Init() {
LayerManagerEditor window = GetWindow&LayerManagerEditor&(&LayerManager&);
window.Show();
使用方法:
1、将上面代码保存到项目Asset/Editor目录下(没有则创建)
2、在菜单栏找到Platform/Tool/LayerManager打开工具
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
如果您使用Unity 游戏引擎,则可以使用官方支持的插件在 Unity 开发环境中编写脚本,以将横幅广告和插页式广告投放到 Android游戏中.一:要求1:Unity 4 或更高版本2:Google 移动广告 SDK二:将插件导入到游戏中1:在 Unity 编辑器中打开您的项目.选择“Assets”(资源)&“Import Package”(导入程序 ...
一:IOS 1:转到“File”(文件)→“Build Settings”(构建设置),依次选择IOS平台和Build(构建).这将会导出Xcode项目.
2:打开导出的 Xcode 项目,并按照IOS快速入门指南中的手动导入部分来添加 Google 移动广告 SDK.
3:在Xcode中,转到“Product”(产品)→“Run”(运行)以运行您 ...
在Unity编辑器的Scene视图进行控制播放Animator,可以借助方法StartPlayback.StopPlayback.StartRecording和StopRecording,具体可以参照以下例子: 创建一个带Controller的Animator对象,可以看到此时人物呈现T型姿势.附上新脚本EditAnimator,此为空脚本,如下: ...
在unity编辑器中给Hierarchy列表中的GameObject加icon 最近在研究unity的编辑器类,在项目中增加一些标记,辅助线什么的引擎扩展,对项目结构清晰度的提升不是一点半点,不过网上对编辑器类介绍的文章都不是太全面,只能自己一点一点看了~ 希望这篇文章可以帮到有需要的人,有时候我们常常只是注意到了项目本身,但是却忽略很多有用的细节. 不废话 ...
作为一名死coder,每天最常见的动作就是查看各种API文档,你一定也有过同时打开N个窗口(HTML.PDF.CHM),不停的在编辑器与文档之间切换的感受吧?怎么说呢,其实我很讨厌这种枯燥无味的动作,那么如何才能提高效率,减少无用功呢?下面就给大家介绍一款非常好用的Mac小工具:Dash,相比这个英文名,我跟喜欢叫它“叮当猫”,嘿嘿. 点我直达App ...后使用快捷导航没有帐号?
只需一步,快速开始
&加载中...
查看: 8121|回复: 3
unity游戏动画控制(状态机)
TA的其他好贴
马上注册,加入CGJOY,让你轻松玩转CGJOY。
才可以下载或查看,没有帐号?
做游戏少不了动画,我把我的一些在蛮牛教育上学的控制动画上的经验分享给大家,希望大牛能给我提出不足~~
&&首先,创建一个animator controller(动画控制),在你的模型上添加一个组件(animator),把animator controller绑定到controller选项栏中,双击打开你新建的animator controller,会出现下图所示①
0.jpg (18.69 KB, 下载次数: 79)
15:28 上传
,单击右键创建一个空的状态,然后把你所要展现的动画拖到这个新建的状态上,需要用几个状态,就拖几个,在你最初始的状态上,单击右键,选择make transtion,会出现一条线,连到你下一个状态下,这里给大家解释一下,打个比方,一个动画人物从站立到把敌人杀死,所需要的动画为 站立-》跑动-》攻击-》站立,这就形成了一个循环(当然了,有的也可逆向播放,比如跑动后站住不动,就是跑动-》站立),在那你animator controller中提现出来,如图所示②
1.jpg (19.48 KB, 下载次数: 77)
15:28 上传
,大家注意了!!看左下角③
2.jpg (20.9 KB, 下载次数: 82)
15:28 上传
,这就是我们今天的主角,状态机,点击那个“+”号,选择你根据那种数据类型来控制这个动画的播放,然后点击状态跟状态之间的连线,会出现如下界面④
3.jpg (8.94 KB, 下载次数: 84)
15:28 上传
,注意我拿红线圈起来的地方,就是决定控制动画的地方,这里我选择了用布尔类型来控制,这就代表我可以在我的代码中控制这个状态的值到底为true或者false,来控制我这个动画是否要播放,这就是状态机,其他的数据类型根据需求来改变,比如要做一个三连击的动画,你也可以用float类型的数据,靠数值来判断两个招式之间的间隔时间的长短是否达成连招的效果。
&&接下来就是给大家展示一下代码:/**
using UnityE
using System.C
public class animatorController : MonoBehaviour {
& & private A
& & & & // Use this for initialization
& & & & void Start () {
& && &&&player = GameObject.Find(&Player&).GetComponent&Animator&();
& && &&&//初始状态,不播放移动的动画
& && &&&player.SetBool(&move&, false);
& & & & }
& & & &
& & & & // Update is called once per frame
& & & & void Update () {
& && &&&//如果按下“w”键,执行前进的动画
& && &&&if (Input.GetKey(KeyCode.W)) {
& && && && &//动画的布尔值为true,执行动画
& && && && &player.SetBool(&move&, true);
& && &&&}
& & & & }
}复制代码如果有我讲的不清楚的地方,欢迎提问或者去蛮牛教育的网站上看看,自己动手记得比较牢~~
如何勾引别人关注你?
感謝分享這麼好的資源!
本楼回复(<span id="dp_count_)
如何勾引别人关注你?
谢谢 正好学到
本楼回复(<span id="dp_count_)
如何勾引别人关注你?
谢谢正好学到这里了
本楼回复(<span id="dp_count_)
如何勾引别人关注你?
找CG工作,上CG招聘网!
Powered by程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之在项目中使用Unity4新Mecanim动画(五十三)
Unity3D研究院之在项目中使用Unity4新Mecanim动画(五十三)
围观83149次
编辑日期: 字体:
Unity4的Mecanim动画很早以前就有体验过,迟迟没有加到项目中有两个原因,今天写这篇博客来记录我在做的过程中遇到的一些问题。
1.以前的代码代码量比较多,修改起来动的地方太多了。
2.使用Mecanim动画,还得需要美术的动画做配合才行。
在3.x中播放动画的时候使用Play()或CrossFade(),直接播放动画 或淡入淡出播放动画。
animation.Play("name"); animation.CrossFade("name");
也可以使用队列播放,让动画形成一个队列。
animation.PlayQueued("name"); animation.CrossFade("name1");
我举一个我现在项目的例子。主角攻击敌人是一套连招,连招一共分为4套动画。也就是当玩家连续按下4次攻击键时这四套动画是连续播放的,假如玩家只连续按下2次攻击,可能只会播放前两套动画。代码中你需要判断其中某个动画是否播放完毕,只有播放完毕才能继续播放下一个动画。
if(animation.isPlaying)
if(animation.IsPlaying("attack1"))
大家在仔细想想这个命题,我们可以把动画分成4中可能的队列,也只可能分为这几种队列。
站立动画- 》攻击动画0 -》站立动画
站立动画- 》攻击动画0 -》攻击动画1 -》站立动画
站立动画- 》攻击动画0 -》攻击动画1 -》攻击动画2-》站立动画
站立动画- 》攻击动画0 -》攻击动画1 -》攻击动画2-》攻击动画3-》站立动画
此时如果用unity3以前的动画方式,无非就是上面这几种方法加上一些逻辑判断完成。现在Unity4加入了Mecanim动画,可以很好的帮我们解决这个问题。详细的动画使用教程我就不多说了,网上已经有很多人写过了。
如下图所示,以前我们在使用模型的时候。一个原始模型,原始模型中没有动画。然后是动画模型,每一个动画都会依赖原始模型。动画的名称末尾用 名称 + @name来表示。 这样的做法使用起来非常方便,但是由于每一个动画都会依赖原始模型所以文件会非常大。
Unity4已经将默认模型与动态导入的类型做了修改,你会发现你的模型拖拽入Hierarchy视图中没有Animation组件而是Animator组件。如果你还是想在Unity4中使用以前的动画系统。你需要把每个模型和动画的类型改成 Rig-& Animation Type -& Legacy,如下图所示。
手动的改起来会非常的累。建议你将下面这条脚本放在项目Editor文件夹下(没有创建一个)。这样当你将模型或动画拖入Project视图中,程序会自动帮你修改它的类型,显然Unity已经不建议大家继续使用以前的动画系统了。
12345678910
using UnityEditor;&public class MyEditor : AssetPostprocessor{&&&&public void OnPreprocessModel()&&&&{&&&&&&&&ModelImporter modelImporter = (ModelImporter) assetImporter;&&&&&&&&
modelImporter.animationType = ModelImporterAnimationType.Legacy;&&&&}&& }
下面开始说说新的动画。在Animations选项卡中先勾掉Import Animation 点击Apply。如下图所示,在Rig选项卡中修改Animation Type的类型为Humanoid。 如果你希望现在选择的这个模型做为标准模型的话,在Avatar Definition中选择Create From This Model。点击下方的Configure可以预览你的骨骼。
让美术修改一下以前的动画,将动画中的原始模型去掉,这样还可以减少文件的大小。然后在Porject视图中找一个原始模型拖拽入右侧Preview中,可以看到这个模型已经播放奔跑动画。
此时换一个模型拖入同样可以预览奔跑效果。
如下图所示,在动画的.fbx中 因为动画需要用刚刚生成的骨骼。所以这里Avatar Definition中你需要选择Copy From Other Avatar 。在Source中选择刚刚生成的Avatar 以后所有动画都需要这样来设置。。
下面我们来让这个女模型和男模型共用男模型的那一套动画,在游戏视图中播放。在Project视图中选择Crate-&AnimatorController。然后把Project中男模型和女模型都拖拽入Hierarchy视图中。 将刚刚创建的AnimatorController放置在Controller处。
此时在Unity导航菜单栏中选择Window -》 Animator。 将动画文件拖入Animator窗口中,你会发现两个模型都开始发生运动。如下图所示,黄颜色表示它为原始动画,也就是根动画。用箭头将它们一一前后相连,箭头实际上就是动画播放的条件。请注意看图中两个蓝色的箭头,A播放完后将会播放B动画,可是B却对应了两个箭头,也就是说B播放完后可以播放C也可以回过头来播放A。
那么B播放完到底是播放C还是播放A呢?用鼠标点击一下箭头,看看这这两个箭头的条件吧。分别点开BA 和BC的两个箭头,在右侧监测面板视图中你都会发现Conditions下有一个Exit Time的条件。根据动画的不同对应数值也会不同,我的数值是0.94。也就是当B动画播放0.94s后将播放下一个动画。默认BA和BC的动画时间是一样的,Unity会有限选择下一个动画,也就是A -》 B-》-》C-》D-》A这样循环播放下去。假设我现在需要动画是 A-》B-》A这样循环播放,只需要修改一下BA箭头的条件,将Exit Time改小一点只要比BC箭头上的小就可以。。 其它的播放虚列原理类似。。
接着还有问题了,用时间来做动画切换的条件是不是有点太限制了。Animator还支持自定义条件,在Animator窗口的左下角处,点击“+”按钮就可以添加变量。这里我添加三组变量, float 、int、bool。
变量添加完毕后,继续点击箭头的条件,箭头上可以有一个条件 或者多个条件。如果是多个条件需要多个条件同时满足才可以。 Conditons左键是变量名称,中间是变量条件,右边是变量值。
Greater 表示左边变量大于右边时触发
Less 表示左边变量小于右边时触发
Equals 表示左边变量等于右边时触发
NotEquals表示左边变量不等于右边时触发。
int 变量上述四种都有,float变量只有Greater 和Less, bool变量只有true和false。
此时我们在加深一下理解。选择AB的箭头,也就设置A动画切换B动画的条件。
5 表示 当ft的值大于5的时候触发。
3 表示 当 it的值小于3的时候触发。
表示 当ib的值等于true的时候触发。
只有上述三种条件全部达成时将A动画将切换播放B动画。否则将一直停留在播放A动画处。
那么ft it ib的这三个变量到底在那里设置呢?如下图所示,才记得前面我们创建的三个变量吗? 这三个变量对应的值就是右边的 0.0 0 false 。在编辑器中你可以通过修改这三个数值来满足播放动画的条件。可是在代码中怎么办呢?
在代码中你可以这样来设置或变更它们的条件。 如果说你需要在程序中判断当前动画的一些信息,可以使用 GetCurrentAnimatorStateInfo(0),我查了一下Animator不能直接拿到当前播放动画的名称, 只能拿到它对应的Has值,也就是说你需要将原始的动画名称转换成Hash来判断。
1234567891011121314151617181920212223242526272829303132333435363738
using UnityEngine;using System.Collections;&public class NewBehaviourScript : MonoBehaviour {& private Animator animator ; void&&Start() {
//得到Animator对象
animator = GetComponent&Animator&(); }& void OnGUI() {
if(GUILayout.Button("play",GUILayout.Width(50)))
&&&&//在这里设置变量的条件
animator.SetFloat("ft",6f);
animator.SetInteger("it",2);
&&&&animator.SetBool("ib",true);&
} }& void Update() {
AnimatorStateInfo animatorState = animator.GetCurrentAnimatorStateInfo(0);&
if(animatorState.IsName("Base Layer.Run_FastStop_Idle"))
Debug.Log("动画相等");
Debug.Log("动画不等");
另外Mecanim还支持多个动画的混合。目前Mecanim还有一个最大的难题,也是文章最上面我说的需要美术配合的那部分。之前我们看到的动画都是应用于人型模型,也就是说它支持人形的骨骼, 举个例子我们的项目人和武器是两个骨骼,这样在用Mecanim就悲剧了。因为不同模型武器的骨骼不一样所以公用模型的话会出现武器位置不对的情况。最后我想到的办法就是美术将以前做的武器骨骼重新导出,每个人对应一套自己武器骨骼(或者一些特殊的骨骼)最后生成武器的动画 ,比如 站立动画、攻击动画、死亡动画等。当Mecanim播放动画的时候,同时在播放该模型对应的武器动画,我想这样就可以解决这个问题吧。。
最后欢迎大家一起讨论。。
今天有朋友QQ上问了我已下,是不是非人形动画还得使用老的动画系统?如下图所示,当你把模型导入Unity的时候,这里可以选择它的类型。
legacy:是老的动画系统,这里就多说了。
Generic:是新的动画系统,它就是支持非人形的动画,建议使用它。但是它不能向Humanoid重定向动画。
Humanoid:就是新的人形重定向动画系统。
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!

我要回帖

更多关于 unity3d动画animator 的文章

 

随机推荐