项目中用到了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 GameObject;

go.name = obj.name;

GameObject.DontDestroyOnLoad(go);

SkeletonAnimation sa;

SkeletonDataAsset sda;

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.Length; i++)

{

string atlasFileName = sni.AtlasFileNames[i];

AtlasAsset atlasdata = ScriptableObject.CreateInstance<AtlasAsset>();

atlasdata.atlasFile = GetObj(atlasFileName) as TextAsset;

string[] mNames = sni.GetMaterialNames(atlasFileName);

atlasdata.materials = new Material[mNames.Length];

for (int j = 0; j < mNames.Length; j++)

{

//Material m  = dicPreloadAssets[mNames[j]] as Material;

atlasdata.materials[j] = GetObj(mNames[j]) as Material;

}

//atlasdata.materials = mats;

atlasdata.Reset();

arrAtlasData[i] = atlasdata;

}

sda.atlasAssets = arrAtlasData;

sda.skeletonJSON = GetObj(sni.JsonFileName) as TextAsset;

sa = go.AddComponent<SkeletonAnimation>();

sa.skeletonDataAsset = sda;

sa.calculateNormals = true;

sa.skeletonDataAsset.Reset();

sa.AnimationName = "run";

sa.loop = true;

sa.Initialize(false);

return go;

}

public class SpineNameInfo

{

private Dictionary<string, string[]> dicAtlasFileNames = new Dictionary<string, string[]>();

//.json文件名

public string JsonFileName = string.Empty;

//.atlas文件名,可能有多个.atlas文件(虽然我的项目中只有一个)

public string[] AtlasFileNames

{

get

{

string[] s = new string[dicAtlasFileNames.Count];

dicAtlasFileNames.Keys.CopyTo(s, 0);

return s;

}

}

//.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];

return null;

}

可能您会注意到,怎么没有.png文件呢,我刚才在上面也提到,png文件会作为mat文件的依赖打包进assetbundle,所以在加载mat文件的时候png自然也已经被加载好了。

以上是我的解决方案。可能有点乱,如果有什么不明白的,我再提供两个链接,也是网上的一些解决方案。

http://answers.unity3d.com/questions/710571/spine-creating-spine-skeletonanimation-using-cscri.html

http://zh.esotericsoftware.com/forum/Creating-Spine-SkeletonAnimation-using-c-3091

下面说一下问题:

使用上述方案以后,发现一个问题,就是创建spine动画很耗时。因为有大量的怪物要创建,这样就导致原先的场景预加载时间很长,长到不能接受。好在虽然怪物数量庞大,但种类不是很多,复用也很高,所以就把spine动画的创建和预加载放到了游戏数据初始化中,时间虽然会有点长,但因为游戏刚开始初始化的东西不多,就还能接受,后面再加载场景怪物的时候,直接获取预加载的种类的对象,然后实例化就OK了。

到此,问题解决。

转载于:https://blog.51cto.com/chenshuhb/1836481

unity 在代码中创建spine动画组件相关推荐

  1. 后台CS代码中创建四种常用的SL动画效果

    http://www.cnblogs.com/chengxingliang/archive/2011/03/07/1974436.html后台CS代码中创建四种常用的动画效果[附带源码实例] 转载于: ...

  2. 【Flutter】Animation 动画 ( AnimatedWidget 动画使用流程 | 创建动画控制器 | 创建动画 | 创建 AnimatedWidget 动画组件 | 动画运行 )

    文章目录 ◯.AnimatedWidget 组件引入 一.创建 AnimatedWidget 动画组件 二.创建动画控制器 三.创建动画 四.动画运行 五.完整代码示例 六.相关资源 Animated ...

  3. 在UE4中创建CG动画 How to create a movie in Unreal Engine 4 using Metahuman

    MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:1.55 GB |时长:1h 16m 你会学到什么 如何在 ...

  4. WPF在代码中创建DataTemplate时候的异常

    原文:WPF在代码中创建DataTemplate时候的异常 今天写段程序用到了在代码中手动创建DataTemplate, var factory = new FrameworkElementFacto ...

  5. Unity 在代码中 动态改变RectTransform位置及宽高 的方法整理

    原文链接(尊重原著):[100个 Unity实用技能] | Unity 在代码中 动态改变RectTransform位置及宽高 的方法整理_unity 修改recttransform_呆呆敲代码的小Y ...

  6. Unity将物体绑定在spine动画骨骼节点上

    实现 1.在目标spine动画下新建一个空物体. 2.给空物体添加BoneFollwer脚本(sprite动画添加BoneFollwer, ui动画添加BoneFollowerGraphic).此时s ...

  7. Unity 在代码中利用Mesh实时生成圆环/空心圆柱

    本篇文章主要介绍了利用Unity中的mesh 实时生成圆环的过程以及思想,我会在开头直接放出源码.如若有任何疑问,可向后继续观看详细解说~~~ (PSPSPS:Mesh生成的顺序,方式等有很多,当前代 ...

  8. [Unity][FairyGUI]场景中龙骨骨骼动画设置播放

    Spine和DragonBones都是FairyGUI可以显示的骨骼动画. DragonBones骨骼动画显示. 首先得在Unity项目中配置 DragonBones的SDK. 在FairyGUI编辑 ...

  9. 中点击按钮新建widget_如何在iOS14中创建堆叠小组件?

    在iOS14中,苹果对iPhone和iPad的主屏幕进行了一些前所未有的的改变.它引入了一个叫"主屏幕小部件"的概念. 在以前的界面上,可以从左边的widgets访问小组件.然而, ...

最新文章

  1. 处理机调度的性能准则
  2. c语言p gt name,c语言中strcmp(p-name,s)是什么意思?
  3. 安装程序无法创建新的系统分区也无法定位现有分区的解决方法
  4. Visual Studio将原生支持WSL 2
  5. LeetCode之Remove Element
  6. File如何转换成MultipartFile
  7. 构造方法的应用 0107 c#
  8. mysql group_concat null_MySQL教程之concat以及group_concat的用法
  9. Web服务中延时对QoE(体验质量)的影响
  10. 数字证书(Certificate)
  11. eclipse创建测试apk文件的测试工程,报错java.lang.NullPointerException
  12. Mocker API 2.7.0 为 REST API 创建模拟 API
  13. 公交车座位的坐垫设计成可替换,冬夏两用
  14. Java 虚拟机详解
  15. 东南大学计算机考研数学教材,考东南大学计算机的看这里,双非学长逆袭!
  16. 全国计算机等级考试专用辅导教程,全国计算机等级考试专用辅导教程:二级Visual FoxPro...
  17. 图书管理系统详细设计说明
  18. 【Java 8 新特性】Java LocalDate 详解
  19. Java成员变量初始化
  20. 眼光独到便能发现刷脸支付带来的商机

热门文章

  1. 图灵71年前就已提出神经网络!《智能机器》再掀热议却一生未发表
  2. AI人脸识别 生物识别 活体检测 的发展历程
  3. 人工智能科普|自然语言处理(NLP)
  4. 关于AI方面创业公司的分析
  5. 监督学习和无监督学习
  6. 干货丨详解世界各国的人工智能布局
  7. Python 之 Numpy (七)copy
  8. 2021 年不可错过的 40 篇 AI 论文,你都读过吗?
  9. 杨振宁:宇宙有没有造物者?
  10. 谷歌对2021年的六个预测:数据和云技术的革命即将到来