使用AnimatorOverrideController动态更换animationclip注意事项

本文详细介绍了在Unity中使用AnimatorOverrideController动态更换AnimationClip的方法及注意事项。通过代码示例,展示了如何正确设置overrideController来替换特定动画片段,强调了替换名称对应的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**

使用AnimatorOverrideController动态更换animationclip注意事项

**
public AnimationClip clip;
Animator anim;
void Awake()
{
anim = GetComponent();
}
void Start () {
AnimatorOverrideController overrideController = new AnimatorOverrideController();
overrideController.runtimeAnimatorController = anim.runtimeAnimatorController;
overrideController[“testCip”] = clip;
anim.runtimeAnimatorController = overrideController;
}

这里一定要注意, overrideController[“testCip”] = clip;里面的testClip不是状态机里面的状态名,而是实际要替换的clip的名字…

也可以用AnimationClipPair得到clip的名字

RuntimeAnimatorController tempController = anim.runtimeAnimatorController;
AnimatorOverrideController overrideController = new AnimatorOverrideController();
overrideController.runtimeAnimatorController = tempController;
overrideController.PerformOverrideClipListCleanup();//这个函数在U5.3和5.0都不存在应该是去掉了吧

overrideController[overrideController.clips[0].originalClip.name] = clip;
overrideController[overrideController.clips[1].originalClip.name] = clip2;

foreach (AnimationClipPair pairs in overrideController.clips)
{
Debug.Log(pairs.originalClip.name );
if (pairs.overrideClip!=null)
{
Debug.Log(pairs.overrideClip.name );
}
}

anim.runtimeAnimatorController = overrideController;

### 如何在 Unity 中仅导出 AnimationClip 为 FBX 文件 当尝试从 Unity 导出仅包含 `AnimationClip` 的文件时,直接通过简单的复制粘贴操作并不能实现目标[^2]。为了成功完成此过程,可以采用间接方法来处理这个问题。 #### 方法一:重新创建并导出带有动画的角色模型 1. 创建一个新的 GameObject 并附加 Animator 组件。 2. 将所需的 `AnimationClip` 应用于该对象上的 Animator 控制器。 3. 使用第三方工具如 Blender 或 Autodesk Maya 打开原始的 FBX 模型文件,并删除所有的现有动画轨道。 4. 接着再把新的动画数据应用到这个清理过的模型上。 5. 最终保存修改后的项目并将更新好的资产重新导入回 Unity 工程中作为单独的 FBX 动画资源。 这种方法虽然有效但是相对繁琐,因为它涉及到外部编辑软件的操作以及多次往返于不同应用程序之间的工作流程。 #### 方法二:利用 AssetBundle 技术打包和分发特定资源 另一种更高效的方式是借助 Unity 提供的 AssetBundles 特性: - 配置好要发布的平台环境; - 编写脚本定义哪些类型的资源应该被打包在一起——这里指的就是那些独立存在的 `.anim` 文件或者是已经关联了骨骼结构信息的人形角色控制器下的剪辑项; - 调用 API 函数构建自定义的 Bundle 包含指定条件匹配的所有符合条件的对象实例; - 发布这些 Bundles 到服务器端或者本地存储位置以便后续加载使用; 然而值得注意的是,这种方式最终产生的并不是严格意义上的标准 FBX 文件格式,而是一个经过特殊定制化封装之后形成的 bundle 归档文档形式。对于某些特殊情况来说可能不够理想。 ```csharp using UnityEngine; using UnityEditor; public class ExportSelectedAnimations : MonoBehaviour { [MenuItem("Tools/Export Selected Animations")] static void DoExport() { Object[] selectedObjects = Selection.GetFiltered(typeof(AnimatorOverrideController),SelectionMode.DeepAssets); foreach (Object obj in selectedObjects){ string path = AssetDatabase.GetAssetPath(obj); ModelImporter modelImporter = AssetImporter.GetAtPath(path) as ModelImporter; if(modelImporter != null){ // 设置只导出动画面 modelImporter.importAnimation = true; modelImporter.animationType = ModelImporterAnimationType.Human; // 只保留选定的动画片段 var clips = ((AnimatorOverrideController)obj).OverridesMap.Values.ToArray(); modelImporter.clipAnimations = new ModelImporterClipAnimation[clips.Length]; for(int i=0;i<clips.Length;i++){ modelImporter.clipAnimations[i].name = clips[i].name; modelImporter.clipAnimations[i].firstFrame = 0; modelImporter.clipAnimations[i].lastFrame = Mathf.FloorToInt(clips[i].length * modelImporter.defaultSampleRate)-1; } EditorUtility.SetDirty(modelImporter); AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceUpdate); }else{ Debug.LogError("Selection is not a valid Animator Override Controller."); } } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值