资源加载是必备的知识点,这里就说说Mecanim动画的资源如何打包及加载。

注意,Unity4.x和Unity5.x的AssetBundle打包策略不一样,本笔记是基于Unity4.x的AssetBundle进行打包的。

我们一般使用FBX类型的模型及动画文件,而动画文件的储存一般有两种情况,一是所有的动画和模型都一起存放到一个文件中,还有一种情况是模型单独一个文件而动画单独一个文件。这里我们就两种情况都看一下。

使用的资源是Unity3D自带的以及从一本教材中取出的两种类型的动画资源,同时需要对其动画创建对应的Animator Controller。

模型动画都存放在一个文件中的情况

一个FBX文件保存了模型、骨骼和动画,如下图:

下面是配置的Animator Controller:

需要注意的是,官方并没有提供为Animator设置Animator Controller的接口,所以我们必须将配置好的GameObject制作为一个预制件进行加载。

Resources加载

 using UnityEngine;
using System.Collections; public class AllInOneResourcesLoad : MonoBehaviour
{
private Animator _animator; void Start()
{
GameObject go = Resources.Load<GameObject>("AllInOne/ConstructorPrefab"); GameObject man = Instantiate(go) as GameObject;
_animator = man.GetComponent<Animator>();
} void OnGUI()
{
if(GUI.Button(new Rect(, , , ), "idle"))
{
_animator.SetBool("walk", false);
_animator.SetBool("run", false);
}
if(GUI.Button(new Rect(, , , ), "walk"))
{
_animator.SetBool("walk", true);
_animator.SetBool("run", false);
}
if(GUI.Button(new Rect(, , , ), "run"))
{
_animator.SetBool("walk", false);
_animator.SetBool("run", true);
}
if(GUI.Button(new Rect(, , , ), "jump"))
{
_animator.SetTrigger("jump");
}
}
}

AssetBundle加载

打包

 using UnityEngine;
using UnityEditor; public class CreateAllInOneAB
{
[MenuItem("Tool/CreateAllInOneAB")]
private static void Create()
{
BuildPipeline.BuildAssetBundle(null, new[]
{
AssetDatabase.LoadAssetAtPath("Assets/Resources/AllInOne/ConstructorPrefab.prefab", typeof(GameObject))
},
Application.streamingAssetsPath + "/AllInOne.assetbundle",
BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets | BuildAssetBundleOptions.UncompressedAssetBundle,
BuildTarget.StandaloneWindows64);
}
}

加载

 using UnityEngine;
using System.Collections; public class AllInOneAssetBundleLoad : MonoBehaviour
{
private Animator _animator; void Start()
{
AssetBundle assetBundle = AssetBundle.CreateFromFile(Application.streamingAssetsPath + "/AllInOne.assetbundle"); GameObject go = assetBundle.Load("ConstructorPrefab", typeof(GameObject)) as GameObject; GameObject man = Instantiate(go) as GameObject;
_animator = man.GetComponent<Animator>();
} void OnGUI()
{
if(GUI.Button(new Rect(, , , ), "idle"))
{
_animator.SetBool("walk", false);
_animator.SetBool("run", false);
}
if (GUI.Button(new Rect(, , , ), "walk"))
{
_animator.SetBool("walk", true);
_animator.SetBool("run", false);
}
if (GUI.Button(new Rect(, , , ), "run"))
{
_animator.SetBool("walk", false);
_animator.SetBool("run", true);
}
if (GUI.Button(new Rect(, , , ), "jump"))
{
_animator.SetTrigger("jump");
}
}
}

模型动画分开存放的情况

还有一种情况是模型和动画是分为多个FBX文件存放的,比如下面是模型文件:

虽然有一个Take 001的动画,但是实际上我们并不使用该动画,而是使用下面仅保存了动画的FBX文件:

下面是配置的Animator Controller:

除了没有提供设置Animator Controller的接口,也无法在运行时对动画剪辑进行增加删除的操作,所以我们一般打包时就收集所有的依赖项一起打包,归根结底还是只需要一个制作好的预制件即可。

从这个角度看,其实是否将动画进行拆分最终的使用方式都是一样的。

Resources加载

 using UnityEngine;
using System.Collections; public class ResourcesLoad : MonoBehaviour
{
private Animator _animator; void Start()
{
GameObject go = Resources.Load<GameObject>("ZombieNurse/ZombieNursePrefab"); GameObject man = Instantiate(go) as GameObject;
_animator = man.GetComponent<Animator>();
} void OnGUI()
{
if(GUI.Button(new Rect(, , , ), "idle"))
{
_animator.SetBool("run", false);
}
if(GUI.Button(new Rect(, , , ), "run"))
{
_animator.SetBool("run", true);
}
if(GUI.Button(new Rect(, , , ), "attack"))
{
_animator.SetTrigger("attack");
}
if(GUI.Button(new Rect(, , , ), "dead"))
{
_animator.SetTrigger("dead");
}
}
}

AssetBundle加载

打包

 using UnityEditor;
using UnityEngine; public class CreateAB
{
[MenuItem("Tool/CreateAB")]
private static void Create()
{
BuildPipeline.BuildAssetBundle(null, new[]
{
AssetDatabase.LoadAssetAtPath("Assets/Resources/ZombieNurse/ZombieNursePrefab.prefab", typeof(GameObject))
},
Application.streamingAssetsPath + "/AB.assetbundle",
BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets | BuildAssetBundleOptions.UncompressedAssetBundle,
BuildTarget.StandaloneWindows64);
}
}

加载

 using UnityEngine;
using System.Collections; public class AssetBundleLoad : MonoBehaviour
{
private Animator _animator; void Start()
{
AssetBundle assetBundle = AssetBundle.CreateFromFile(Application.streamingAssetsPath + "/AB.assetbundle"); GameObject go = assetBundle.Load("ZombieNursePrefab", typeof(GameObject)) as GameObject; GameObject man = Instantiate(go) as GameObject;
_animator = man.GetComponent<Animator>();
} void OnGUI()
{
if(GUI.Button(new Rect(, , , ), "idle"))
{
_animator.SetBool("run", false);
}
if(GUI.Button(new Rect(, , , ), "run"))
{
_animator.SetBool("run", true);
}
if(GUI.Button(new Rect(, , , ), "attack"))
{
_animator.SetTrigger("attack");
}
if(GUI.Button(new Rect(, , , ), "dead"))
{
_animator.SetTrigger("dead");
}
}
}

Unity3D之Mecanim动画系统学习笔记(十):Mecanim动画的资源加载相关的更多相关文章

  1. 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址

    驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...

  2. Unity3D之Legacy动画系统学习笔记

    Unity3D的Mecanim动画系统是非常强大的,而且作为Unity推荐的动画系统,其未来会完全代替老的一套动画系统,即Legacy动画系统.目前的情况是Mecanim与Legacy两套动画系统同时 ...

  3. Unity3D之Mecanim动画系统学习笔记(一):认识Mecanim动画系统

    Mecanim简介 Mecanim动画系统是Unity3D4.0开始引入的一套全新的动画系统,主要提供了下面4个方面的功能: 针对人形角色提供一套特殊的工作流. 动画重定向的能力,可以非常方便的把动画 ...

  4. Unity3D之Mecanim动画系统学习笔记(十一):高级功能应用

    动作游戏 还记得读书的时候熬夜打<波斯王子>的时光,我们的王子通过跳跃穿过墙壁的小洞.在高层建筑上进行攀爬和跳跃,还有在操作失误掉下高楼和触发必死机关后使用时之沙的时光倒流功能回归死亡之前 ...

  5. Unity3D之Mecanim动画系统学习笔记(九):Blend Tree(混合树)

    认识Blend Tree 我们在Animator Controller中除了可以创建一个State外还可以创建一个Blend Tree,如下: 那么我们看下新创建的Blend Tree和State有什 ...

  6. Unity3D之Mecanim动画系统学习笔记(二):模型导入

    我们要在Unity3D中使用上模型和动画,需要经过下面几个阶段的制作,下面以一个人形的模型开发为准来介绍. 模型制作 模型建模(Modelling) 我们的美术在建模时一般会制作一个称为T-Pose( ...

  7. Unity3D之Mecanim动画系统学习笔记(四):Animation State

    动画的设置 我们先看看Animation Clip的一些设置: Loop time:动画是否循环播放. 下面出现了3个大致一样的选项: Root Transform Rotation:表示为播放动画的 ...

  8. Unity3D之Mecanim动画系统学习笔记(八):Animator Layers(动画分层)

    解决什么问题? 动画分层可以用来解决什么样的问题呢?试想一下如果你要开发一款第三人称的射击游戏,那么肯定是希望身体的动画分为上下两部分,上方根据瞄准的位置和是否射击进行动画播放,下方根据移动播放动画. ...

  9. Entity Framework学习笔记(五)----Linq查询(2)---贪婪加载

    请注明转载地址:http://www.cnblogs.com/arhat 在上一章中,我们使用了Linq对Entity Framework进行了一个查询,但是通过学习我们却发现了懒加载给我来的性能上的 ...

随机推荐

  1. Java实现RC4加解密

    package com.vrv.paw.utils; public class RC4Util { public static String decry_RC4(byte[] data, String ...

  2. 强势解决:windows 不能在本地计算机中起动Tomcat参考特定错误代码1

    Tomcat添加系统服务:service.bat install 启动本服务的时候却提示“windows 不能在本地计算机中起动 Apache Tomcat参考特定错误代码1,若不是Microsoft ...

  3. UVa 10780 (质因数分解) Again Prime? No Time.

    求mk整除n!,求k的最大值. 现将m分解质因数,比如对于素数p1分解出来的指数为k1,那么n!中能分解出多少个p1出来呢? 考虑10!中2的个数c:1~10中有10/2个数是2的倍数,c += 5: ...

  4. Brew 编译mod错误Error: L6265E: Non-RWPI Section libspace.o(.bss) cannot be assigned to PI Exec region ER_ZI

    Error: L6265E: Non-RWPI Section libspace.o(.bss) cannot be assigned to PI Exec region ER_ZI.: Error: ...

  5. LintCode: isSubTree

    Title: 有两个不同大小的二进制树: T1 有上百万的节点: T2 有好几百的节点.请设计一种算法,判定 T2 是否为 T1的子树 class Solution { public: /** * @ ...

  6. Android01--开发环境搭建

    1 -- 下载所需软件 Android SDK下载地址:http://developer.android.com/sdk/index.html Eclipse下载地址:http://www.eclip ...

  7. 解决Jsoup网页抓取过程中需要cookie的问题

    最近在做城觅网的信息抓取,发现城觅网上海与北京的url是一样的.那怎样才确定信息的来源呢?折腾了半天,才发现城觅网是使用cookie的,如果你把网站的cookie禁用了,就无法在上海与北京之间切换了. ...

  8. Android-监听sdcard状态

    public class MyService extends Service { private static final String TAG = "MyService"; Fi ...

  9. 写的cursor demo仅作记录

    declare @objectID int; declare objcur cursor for object_id from m_object open objcur fetch next from ...

  10. wait函数返回值总结

    之前在学习wait和waitpid函数的时候,就对使用宏WIFEXITED来检查获取的进程终止状态产生过疑惑:一般我们在程序中是调用的exit或者_exit函数来退出的,那么wait和waitpid函 ...