167 lines
5.8 KiB
C#
167 lines
5.8 KiB
C#
![]() |
// ***********************************************************************
|
|||
|
// 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;
|
|||
|
}
|
|||
|
}
|