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";
|
|
|
|
|
|
//三个Bsae路径
|
|
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("请选择动画的FBX文件");
|
|
return;
|
|
}
|
|
|
|
var objs = Selection.gameObjects;
|
|
var name = objs[0].name;
|
|
|
|
if (name.Contains("@"))
|
|
{
|
|
name = name.Split('@')[0];
|
|
}
|
|
|
|
//获取动画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("没有找到动画控制器");
|
|
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} 控制器中的 {1} 无对应Action", name, current.Key.name));
|
|
}
|
|
}
|
|
|
|
aoc.ApplyOverrides(overrides);
|
|
AssetDatabase.SaveAssets();
|
|
Debug.Log("设置成功");
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
private static bool IsSetLoop(string name)
|
|
{
|
|
for (int i = 0; i < loopCilpName.Length; i++)
|
|
{
|
|
if (name.StartsWith(loopCilpName[i]))
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
}
|