167 lines
5.8 KiB
C#
Raw Normal View History

2025-05-18 01:04:31 +08:00
// ***********************************************************************
// Assembly : Unity
// Author : Administrator
// Created : 2019-07-24
// Description :
// Last Modified By :
// Last Modified On :
// ***********************************************************************
// <copyright file= "AnimatiorCreate" company="DefaultCompany"></copyright>
// <summary></summary>
// ***********************************************************************
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using System.IO;
public class AnimatiorCreate : Editor
{
private const string MODEL_ANIMATION_PATH1 = "Assets/Ryff/Arts/Animations";
private const string MODEL_ANIMATION_PATH2 = "Assets/Ryff/Arts/Models";
private const string CONTROLLER_PATH = "Assets/Ryff/Resources/Animators";
//<2F><><EFBFBD><EFBFBD>Bsae·<65><C2B7>
private const string CONTROLLER_BASE_PLAYER_ANIMATOR_PATH = "Assets/Ryff/Resources/Animators/basePlayerAnimator.controller";
private const string CONTROLLER_BASE_MONSTER_ANIMATOR_PATH = "Assets/Ryff/Resources/Animators/baseMonsterAnimator.controller";
private const string CONTROLLER_BASE_RIDE_ANIMATOR_PATH = "Assets/Ryff/Resources/Animators/baseRideAnimator.controller";
private static string[] loopCilpName = new string[] { "idle", "run", "dead", "stand", "stun", "standfight", "runfight", "zhanshi-stand", "x_zhanshi_stand" };
[MenuItem("Assets/Create Animatior %e")]
public static void CreateAnimatior()
{
var strs = Selection.assetGUIDs;
for (int i = 0; i < strs.Length; i++)
{
var path = AssetDatabase.GUIDToAssetPath(strs[i]);
if (!path.EndsWith(".fbx", System.StringComparison.CurrentCultureIgnoreCase) || (!path.Contains(MODEL_ANIMATION_PATH1) && !path.Contains(MODEL_ANIMATION_PATH2)))
{
Debug.LogWarning("<22><>ѡ<EFBFBD>񶯻<EFBFBD><F1B6AFBB><EFBFBD>FBX<42>ļ<EFBFBD>");
return;
}
var objs = Selection.gameObjects;
var name = objs[0].name;
if (name.Contains("@"))
{
name = name.Split('@')[0];
}
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>Clip
var animClipDics = new Dictionary<string, AnimationClip>();
Object[] assetObjs = AssetDatabase.LoadAllAssetsAtPath(path);
var assetImporter = AssetImporter.GetAtPath(path);
if (assetImporter is ModelImporter)
{
var isChange = false;
var modelImporter = assetImporter as ModelImporter;
modelImporter.clipAnimations = modelImporter.defaultClipAnimations;
var clips = modelImporter.clipAnimations;
foreach (var clip in clips)
{
if (IsSetLoop(clip.name) && !clip.loopTime)
{
clip.loopTime = true;
isChange = true;
}
}
if (isChange)
{
modelImporter.clipAnimations = clips;
AssetDatabase.ImportAsset(path);
}
}
animClipDics.Clear();
foreach (var item in assetObjs)
{
if (item as AnimationClip)
{
var clip = item as AnimationClip;
animClipDics.Add(clip.name, clip);
}
}
AnimatorOverrideController aoc = null;
var selectFbxControllerPath = string.Format("{0}/animator_{1}.overrideController", CONTROLLER_PATH, name);
if (!File.Exists(selectFbxControllerPath))
{
string basepath = string.Empty;
if (name.IndexOf("mount") != -1)
{
basepath = CONTROLLER_BASE_RIDE_ANIMATOR_PATH;
}
else if (name.IndexOf("monster") != -1 || name.IndexOf("npc") != -1 || name.IndexOf("pet") != -1 || name.IndexOf("boss") != -1)
{
basepath = CONTROLLER_BASE_MONSTER_ANIMATOR_PATH;
}
else
{
basepath = CONTROLLER_BASE_PLAYER_ANIMATOR_PATH;
}
var baseController = AssetDatabase.LoadAssetAtPath<RuntimeAnimatorController>(basepath);
aoc = new AnimatorOverrideController(baseController);
AssetDatabase.CreateAsset(aoc, selectFbxControllerPath);
AssetDatabase.SaveAssets();
Debug.Log("Creat AnimatorOverrideController");
}
aoc = AssetDatabase.LoadAssetAtPath<AnimatorOverrideController>(selectFbxControllerPath);
if (!aoc)
{
Debug.LogError(<><C3BB><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
return;
}
var overrides = new List<KeyValuePair<AnimationClip, AnimationClip>>();
aoc.GetOverrides(overrides);
for (int j = 0; j < overrides.Count; j++)
{
var current = overrides[j];
if (animClipDics.ContainsKey(current.Key.name))
{
overrides[j] = new KeyValuePair<AnimationClip, AnimationClip>(current.Key, animClipDics[current.Key.name]);
}
else
{
Debug.LogWarning(string.Format("{0} <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD> {1} <20>޶<EFBFBD>ӦAction", name, current.Key.name));
}
}
aoc.ApplyOverrides(overrides);
AssetDatabase.SaveAssets();
Debug.Log("<22><><EFBFBD>óɹ<C3B3>");
}
}
private static bool IsSetLoop(string name)
{
for (int i = 0; i < loopCilpName.Length; i++)
{
if (name.StartsWith(loopCilpName[i]))
return true;
}
return false;
}
}