Unity的AssetPostprocessor之Model之動畫:深入解析與實用案例 3

来源:https://www.cnblogs.com/alianblank/archive/2023/08/13/17626661.html
-Advertisement-
Play Games

# Unity AssetPostprocessor的Model的動畫相關的函數修改實際應用 在Unity中,AssetPostprocessor是一個非常有用的工具,它可以在導入資源時自動執行一些操作。其中,Model的動畫相關的函數修改可以幫助我們在導入模型時自動修改動畫相關的函數,從而提高我們 ...


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的動畫相關的函數修改,我們可以在導入模型時自動修改畫相關的函數,從而提高我們的工作效率。

__EOF__

本文作者 Blank
本文鏈接
版權聲明:本博客所有文章除特別聲明外,均採用 BY-NC-SA 許可協議。轉載請註明出處!
聲援博主:如果您覺得文章對您有幫助,可以點擊文章右下角 推薦 一下。您的鼓勵是博主的最大動力!

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [TOC] ## 本篇概要 搭建go語言環境,除了要搭建go語言的編譯環境,還要搭建go語言的集成開發環境,為此需要選擇go語言的集成開發環境的工具,這就是“工於善其事,必先利其器”,可以大大加快自己的開發進度。 ## 集成開發環境工具(ide) 這裡我主要介紹從我2016年開始學習go語言以來使用 ...
  • ### 歡迎訪問我的GitHub > 這裡分類和彙總了欣宸的全部原創(含配套源碼):[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) ### 起因是懶 - 最近在開發中要用到PostgreSQL數 ...
  • Java技術體系中所提倡的自動記憶體管理最終可以歸結為自動化地解決了兩個問題:給對象分配記憶體以及回收分配給對象的記憶體。關於回收記憶體這一點,我們已經使用了大量篇幅去介紹虛擬機中的垃圾收集器體系以及運作原理,現在我們再一起來探討一下給對象分配記憶體的那點事兒。對象的記憶體分配,往大方向講,就是在堆上分配,對象... ...
  • # MyBatis--1.快速入門 ## MyBatis簡介 ### 原始jdbc操作的弊端 1. 創建、釋放頻繁導致系統資源浪費 2. sql語句在代碼中硬編碼,不易維護 3. 查詢操作時,需要手動將結果集中的數據封裝到實體中。插入操作同理需要手動 解決方案: 1. 使用資料庫連接池初始化連接資源 ...
  • ## Eureka 簡介 Eureka 是一個基於 REST 的服務發現組件,SpringCloud 將它集成在其子項目 spring-cloud-netflix 中,以實現 SpringCloud 的服務註冊與發現,同時提供了負載均衡、故障轉移等能力,目前 Eureka2.0 已經不再維護,故不推 ...
  • Quartz由Java編寫的功能豐富的開源作業調度框架,可以集成到幾乎任何Java應用程式中,並且能夠創建多個作業調度; ...
  • ## 引言 深拷貝是指創建一個新對象,該對象的值與原始對象完全相同,但在記憶體中具有不同的地址。這意味著如果您對原始對象進行更改,則不會影響到複製的對象 常見的C#常見的深拷貝方式有以下4類: 1. 各種形式的序列化及反序列化。 2. 通過反射機制獲取該對象的所有欄位和屬性信息。遍歷所有欄位和屬性,遞 ...
  • 鴿了好久的內容,終於補上了。這篇文章對該合集前幾篇文章的內容做了簡要的總結和應用,同時按照MVVM設計模式完成了一個學習小Demo,希望可以幫到正在學習的友友們。有什麼問題可以評論區留言討論。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...