189 8069 5689

unity在代码中创建spine动画组件-创新互联

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

      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();

          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();

      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 dicAtlasFileNames = new Dictionary();

     //.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了。

到此,问题解决。

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


新闻名称:unity在代码中创建spine动画组件-创新互联
文章位置:http://cdxtjz.cn/article/dcsepj.html

其他资讯