Unity的AssetPostprocessor之Model之动画:深入解析与实用案例 3
Unity AssetPostprocessor的Model的动画相关的函数修改实际应用
在Unity中,AssetPostprocessor是一个非常有用的工具,它可以在导入资源时自动执行一些操作。其中,Model的动画相关的函数修改可以帮助我们在导入模型时自动修改动画相关的函数,从而提高我们的工作效率。本文将介绍如何使用AssetPostprocessor的Model的动画相关的函数修改,并提供多个使用例子。
什么是AssetPostprocessor
AssetPostprocessor是Unity中的一个类,它可以在导入资源时自动执行一些操作。我们可以通过继承AssetPostprocessor并重写其中的方法来实现自己的需求。其中,Model的动画相关的函数修改是AssetPostprocessor中的一个功能,它可以帮助我们在导入模型时自动修改动画相关的函数。
Model的动画相关的函数修改
在Unity中,我们可以通过Animator组件来控制模型的动画。Animator组件中包含了一些动画相关的函数,例如SetBool、SetFloat、SetInteger等。这些函数可以帮助我们控制动画的播放。在导入模型时,我们可以通过AssetPostprocessor的Model的动画相关的函数修改来自动修改这些函数。
修改SetBool函数
我们可以通过修改SetBool函数来控制动画的播放。例如,我们可以在导入模型时自动将所有的SetBool函数中的参数名“isRunning”改为“isWalking”,从而控制动画的播放。具体实现如下:
using UnityEngine;
using UnityEditor;
public class ModelPostprocessor : AssetPostprocessor
{
void OnPostprocessModel(GameObject go)
{
Animator animator = go.GetComponent<Animator>();
if (animator != null)
{
AnimatorController controller = animator.runtimeAnimatorController as AnimatorController;
if (controller != null)
{
foreach (AnimatorControllerParameter parameter in controller.parameters)
{
if (parameter.type == AnimatorControllerParameterType.Bool)
{
foreach (AnimationClip clip in controller.animationClips)
{
AnimationEvent[] events = AnimationUtility.GetAnimationEvents(clip);
foreach (AnimationEvent e in events)
{
if (e.functionName == "SetBool" && e.stringParameter == "isRunning")
{
e.stringParameter = "isWalking";
AnimationUtility.SetAnimationEvents(clip, events);
}
}
}
}
}
}
}
}
}
修改SetFloat函数
我们也可以通过修改SetFloat函数来控制动画的播放。例如,我们可以在导入模型时自动将所有的SetFloat函数中的参数名“speed”改为“velocity”,从而控制动画的播放。具体实现如下:
using UnityEngine;
using UnityEditor;
public class ModelPostprocessor : AssetPostprocessor
{
void OnPostprocessModel(GameObject go)
{
Animator animator = go.GetComponent<Animator>();
if (animator != null)
{
AnimatorController controller = animator.runtimeAnimatorController as AnimatorController;
if (controller != null)
{
foreach (AnimatorControllerParameter parameter in controller.parameters)
{
if (parameter.type == AnimatorControllerParameterType.Float)
{
foreach (AnimationClip clip in controller.animationClips)
{
AnimationEvent[] events = AnimationUtility.GetAnimationEvents(clip);
foreach (AnimationEvent e in events)
{
if (e.functionName == "SetFloat" && e.stringParameter == "speed")
{
e.stringParameter = "velocity";
AnimationUtility.SetAnimationEvents(clip, events);
}
}
}
}
}
}
}
}
}
修改SetInteger函数
我们还可以通过修改SetInteger函数来控制动画的播放。例如,我们可以在导入模型时自动将所有的SetInteger函数中的参数名“state”改为“status”,从而控制动画的播放。具体实现如下
using UnityEngine;
using UnityEditor;
public class ModelPostprocessor : AssetPostprocessor
{
void OnPostprocessModel(GameObject go)
{
Animator animator = go.GetComponent<Animator>();
if (animator != null)
{
AnimatorController controller = animator.runtimeAnimatorController as AnimatorController;
if (controller != null)
{
foreach (AnimatorControllerParameter parameter in controller.parameters)
{
if (parameter.type == AnimatorControllerParameterType.Int)
{
foreach (AnimationClip clip in controller.animationClips)
{
AnimationEvent[] events = AnimationUtility.GetAnimationEvents(clip);
foreach (AnimationEvent e in events)
{
if (e.functionName == "SetInteger" && e.stringParameter == "state")
{
e.stringParameter = "status";
AnimationUtility.SetAnimationEvents(clip, events);
}
}
}
}
}
}
}
}
}
使用例子
下面是几个使用AssetPostprocessor的Model的动画相关的函数修改的例子。
例子1:修改SetBool函数
我们可以在导入模型时自将所有的SetBool函数中的参数名“isRunning”改为“isWalking”,从而控制动画的播放。具体实现如下:
using UnityEngine;
using UnityEditor;
public class ModelPostprocessor : AssetPostprocessor
{
void OnPostprocessModel(GameObject go)
{
Animator animator = go.GetComponent<Animator>();
if (animator != null)
{
AnimatorController controller = animator.runtimeAnimatorController as AnimatorController;
if (controller != null)
{
foreach (AnimatorControllerParameter parameter in controller.parameters)
{
if (parameter.type == AnimatorControllerParameterType.Bool)
{
foreach (AnimationClip clip in controller.animationClips)
{
AnimationEvent[] events = AnimationUtility.GetAnimationEvents(clip);
foreach (AnimationEvent e in events)
{
if (e.functionName == "SetBool" && e.stringParameter == "isRunning")
{
e.stringParameter = "isWalking";
AnimationUtility.SetAnimationEvents(clip, events);
}
}
}
}
}
}
}
}
}
例子2:修改SetFloat函数
我们可以在导入模型时自动将所有的SetFloat函数中的参数名“speed”改为“velocity”,从而控制动画的播放。具体现如下:
using UnityEngine;
using UnityEditor;
public class ModelPostprocessor : AssetPostprocessor
{
void OnPostprocessModel(GameObject go)
{
Animator animator = go.GetComponent<Animator>();
if (animator != null)
{
AnimatorController controller = animator.runtimeAnimatorController as AnimatorController;
if (controller != null)
{
foreach (AnimatorControllerParameter parameter in controller.parameters)
{
if (parameter.type == AnimatorControllerParameterType.Float)
{
foreach (AnimationClip clip in controller.animationClips)
{
AnimationEvent[] events = AnimationUtility.GetAnimationEvents(clip);
foreach (AnimationEvent e in events)
{
if (e.functionName == "SetFloat" && e.stringParameter == "speed")
{
e.stringParameter = "velocity";
AnimationUtility.SetAnimationEvents(clip, events);
}
}
}
}
}
}
}
}
}
例子3:修改SetInteger函数
我们可以在导入模型时自动将所有的SetInteger函数中的参数名“state”改为“status”,从而控制动画的播放。具体实现如下:
using UnityEngine;
using UnityEditor;
public class ModelPostprocessor :Postprocessor
{
void OnPostprocessModel(GameObject go)
{
Animator animator = go.GetComponent<Animator>();
if (animator != null)
{
AnimatorController controller = animator.runtimeAnimatorController as AnimatorController;
if (controller != null)
{
foreach (AnimatorControllerParameter parameter in controller.parameters)
{
if (parameter.type == AnimatorControllerParameterType.Int)
{
foreach (AnimationClip clip in controller.animationClips)
{
AnimationEvent[] events = AnimationUtility.GetAnimationEvents(clip);
foreach (AnimationEvent e in events)
{
if (e.functionName == "SetInteger" && e.stringParameter == "state")
{
e.stringParameter = "status";
AnimationUtility.SetAnimationEvents(clip, events);
}
}
}
}
}
}
}
}
}
总结
本文介绍了如何使用AssetPostprocessor的Model的动画相关的函数修改,并提供了多个使用例子。通过使用AssetPostprocessor的Model的动画相关的函数修改,我们可以在导入模型时自动修改画相关的函数,从而提高我们的工作效率。
Unity的AssetPostprocessor之Model之动画:深入解析与实用案例 3的更多相关文章
- Unity 4.0 中的新动画系统——MecAnim
分享一个文档资料,关于动画系统的,版本应该很老了,但是有借鉴意义的: Unity 4.0 已于 2012 年 11 月 15 日正式发布,Unity 每一次版本的提升,都给游戏开发者带来惊喜,这一次也 ...
- 【Unity】10.1 类人动画的导入和设置
分类:Unity.C#.VS2015 创建日期:2016-05-02 一.制作或购买类人模型 为了充分使用 Mecanim 类人动画系统和类人动画的动画重定位功能,需要先使用其他3D建模软件(例如3d ...
- Unity3D for VR 学习(9): Unity Shader 光照模型 (illumination model)
关于光照模型 所谓模型,一般是由学术算法发起, 经过大量实际数据验证而成的可靠公式 现在还记得2009年做TD-SCDMA移动通信算法的时候,曾经看过自由空间传播模型(Free space propa ...
- 高速上手Unity中最好的补间动画插件DFTween
出处:http://blog.csdn.net/u010019717 author:孙广东 时间:2015.3.17 23:00 DFTween 是一个在 Unity 游戏引擎中高 ...
- Android属性动画完全解析(下)
转载:http://blog.csdn.net/guolin_blog/article/details/44171115 大家好,欢迎继续回到Android属性动画完全解析.在上一篇文章当中我们学习了 ...
- Android属性动画完全解析(上),初识属性动画的基本用法
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/43536355 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系 ...
- 精选19款华丽的HTML5动画和实用案例
下面是本人收集的19款超酷HTML5动画和实用案例,觉得不错,分享给大家. 1.HTML5 Canvas火焰喷射动画效果 还记得以前分享过的一款HTML5烟花动画HTML5 Canvas烟花特效,今天 ...
- Android属性动画完全解析(中)
转载:http://blog.csdn.net/guolin_blog/article/details/43536355 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是 ...
- Android属性动画完全解析(下),Interpolator和ViewPropertyAnimator的用法
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/44171115 大家好,欢迎继续回到Android属性动画完全解析.在上一篇文章当中 ...
- Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/43536355 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法 ...
随机推荐
- 提升 Apache Hudi Upsert 性能的三个建议
Apache Hudi 社区一直在快速发展,各公司正在寻找方法来利用其强大的功能来有效地摄取和管理大规模数据集. 每周社区都会收到一些常见问题,最常见的问题与 Hudi 如何执行更新插入有关,以确保以 ...
- 03、SECS-I 协议介绍
03.SECS-I 协议介绍 上一篇我们学习了 SECS-II 协议,对 SECS-II 协议有了初略的了解,现在我们再来一起学习 SECS-I 协议. 文章的内容基本上来自参考资料和自己看的文档,若 ...
- 代码随想录算法训练营Day45 动态规划
代码随想录算法训练营 代码随想录算法训练营Day45 动态规划|70. 爬楼梯(进阶) 322. 零钱兑换 70. 爬楼梯 (进阶) 题目链接:70. 爬楼梯 (进阶 假设你正在爬楼梯.需要 n 阶你 ...
- MassTransit实现Saga模式概览
原文地址:Saga Overview 编排一系列事件的能力是一个强大的功能,而MassTransit使这成为可能. saga是由协调器管理的长期事务.saga是由事件发起的,saga编排事件,saga ...
- Java的Object类的方法
Java的Object类是所有类的根类,它提供了一些通用的方法.下面是一些常用的Object类方法: 1. equals(Object obj):判断当前对象是否与给定对象相等.默认情况下,equal ...
- 【QCustomPlot】下载
说明 使用 QCustomPlot 绘图库辅助开发时整理的学习笔记.同系列文章目录可见 <绘图库 QCustomPlot 学习笔记>目录.本篇介绍 QCustomPlot 的下载. 目录 ...
- Python正则表达式完全指南
本篇文章将深入探讨python的一项强大工具:正则表达式.正则表达式是一个强大的文本处理工具,可以用来匹配,搜索,替换和解析文本.我们将逐步展示如何在Python中使用正则表达式,包括其基本语法,常见 ...
- 【HarmonyOS】HarmonyOS应用APP与HAP包签名信息查看方法
HarmonyOS可以通过DevEco Studio 构建对应的APP包或者是HAP包,对于签名我们有两种方式: DevEco Studio提供了根据开发者信息生成自动调试签名的能力方便各位开发者进 ...
- 整理spring-web里支持的文件以及对应的Content-Type
前言 最近在弄文件上传.下载.在线预览时经常需要设置请求标头或者响应标头的Content-Type 属性.所以研究了一下spring支持哪些Content-Type,通过研究MediaTypeFact ...
- 使用Git进行版本控制和协作:代码共享、协作和版本管理
目录 引言 Git 是一款开源的分布式版本控制系统,它已经成为了现代软件开发中必不可少的工具之一.在这篇文章中,我们将介绍如何使用 Git 进行版本控制和协作,以实现代码共享.协作和版本管理.Git ...