using UnityEngine;
|
using System.Collections.Generic;
|
using UnityEditor;
|
using UnityEditor.Animations;
|
using System.IO;
|
|
public class ResourcesBuilder
|
{
|
protected const byte param_NoExist = 1;
|
protected const byte param_Prefab = 2;
|
protected const byte param_Clip = 4;
|
protected const byte param_AnimatorController = 8;
|
protected const byte param_AnimatorUIController = 16;
|
|
protected class MountPointInfo
|
{
|
public string path;
|
public string name;
|
public Vector3 localPosition;
|
public Quaternion localRotation;
|
public Vector3 localScale;
|
}
|
|
protected class ColliderInfo
|
{
|
public Vector3 center;
|
public float radius;
|
public float height;
|
}
|
|
public static int buildParams = 0;
|
|
public static bool OnlyBuildNoExist
|
{
|
get
|
{
|
return (buildParams & param_NoExist) != 0;
|
}
|
|
set
|
{
|
if (value)
|
{
|
buildParams |= param_NoExist;
|
}
|
else
|
{
|
buildParams &= ~param_NoExist;
|
}
|
}
|
}
|
|
public static bool IsBuildPrefab
|
{
|
get
|
{
|
return (buildParams & param_Prefab) != 0;
|
}
|
set
|
{
|
if (value)
|
{
|
buildParams |= param_Prefab;
|
}
|
else
|
{
|
buildParams &= ~param_Prefab;
|
}
|
}
|
}
|
|
public static bool IsBuildAnimationClip
|
{
|
get
|
{
|
return (buildParams & param_Clip) != 0;
|
}
|
set
|
{
|
if (value)
|
{
|
buildParams |= param_Clip;
|
}
|
else
|
{
|
buildParams &= ~param_Clip;
|
}
|
}
|
}
|
|
public static bool IsBuildAnimatorController
|
{
|
get
|
{
|
return (buildParams & param_AnimatorController) != 0;
|
}
|
set
|
{
|
if (value)
|
{
|
buildParams |= param_AnimatorController;
|
}
|
else
|
{
|
buildParams &= ~param_AnimatorController;
|
}
|
}
|
}
|
|
public static bool IsBuildAnimatorUIController
|
{
|
get
|
{
|
return (buildParams & param_AnimatorUIController) != 0;
|
}
|
set
|
{
|
if (value)
|
{
|
buildParams |= param_AnimatorUIController;
|
}
|
else
|
{
|
buildParams &= ~param_AnimatorUIController;
|
}
|
}
|
}
|
|
protected static List<MountPointInfo> m_MountPointInfoList = new List<MountPointInfo>();
|
|
public void BuildPrefab(string path, string resName, string suffix, string outName = null, bool isHighMesh = false)
|
{
|
if (string.IsNullOrEmpty(outName))
|
{
|
outName = resName;
|
}
|
|
string _absOriginalePath = string.Format("{0}/ART/Role/{1}/{2}.FBX", Application.dataPath, path, resName);
|
string _originalAssetPath = string.Format("Assets/ART/Role/{0}/{1}.FBX", path, resName);
|
|
if ((resName.StartsWith("A_Zs") || resName.StartsWith("A_Fs"))
|
&& !isHighMesh
|
&& (suffix.Equals(InstanceResourcesLoader.raceSuffix) || suffix.Equals(InstanceResourcesLoader.handSuffix)))
|
{
|
_absOriginalePath = string.Format("{0}/ART/Role/{1}/{2}_Dm.FBX", Application.dataPath, path, resName);
|
_originalAssetPath = string.Format("Assets/ART/Role/{0}/{1}_Dm.FBX", path, resName);
|
}
|
|
string _tempPrefabName = outName;
|
|
if (isHighMesh
|
&& ((resName.StartsWith("A_Zs") || resName.StartsWith("A_Fs"))
|
&& (suffix.Equals(InstanceResourcesLoader.raceSuffix) || suffix.Equals(InstanceResourcesLoader.handSuffix))))
|
{
|
_tempPrefabName += "_UI";
|
|
_absOriginalePath = string.Format("{0}/ART/Role/{1}/{2}.FBX", Application.dataPath, path, resName);
|
_originalAssetPath = string.Format("Assets/ART/Role/{0}/{1}.FBX", path, resName);
|
}
|
|
string _absAssetPath = string.Format("{0}Gmodels/{1}{2}.prefab", ResourcesPath.ResourcesOutPath, suffix, _tempPrefabName);
|
string _assetPath = string.Format("{0}Gmodels/{1}{2}.prefab", ResourcesPath.ResourcesOutAssetPath, suffix, _tempPrefabName);
|
|
string _acAbsAssetPath = string.Format("{0}Gmodels/{1}/{2}{3}.controller", ResourcesPath.ResourcesOutPath, path, AnimatorControllerLoader.controllerSuffix, path);
|
string _acAssetPath = string.Format("{0}Gmodels/{1}/{2}{3}.controller", ResourcesPath.ResourcesOutAssetPath, path, AnimatorControllerLoader.controllerSuffix, path);
|
|
if (!outName.Equals(resName))
|
{
|
_acAbsAssetPath = string.Format("{0}Gmodels/{1}/{2}{3}.controller", ResourcesPath.ResourcesOutPath, path, AnimatorControllerLoader.controllerSuffix, outName);
|
_acAssetPath = string.Format("{0}Gmodels/{1}/{2}{3}.controller", ResourcesPath.ResourcesOutAssetPath, path, AnimatorControllerLoader.controllerSuffix, outName);
|
}
|
|
if (string.IsNullOrEmpty(_absOriginalePath))
|
{
|
return;
|
}
|
|
// 指定动画控制器
|
if (!File.Exists(_acAbsAssetPath))
|
{
|
Debug.LogWarningFormat("检测到此prefab资源: {0} 的AnimatorContorller(动画控制器)资源尚未生成, 这里需要注意啊此资源是否需要先生成AnimatorContorller(动画控制器), 再生成prefab资源.", _acAssetPath);
|
}
|
|
ColliderInfo _colliderInfo = null;
|
|
if (File.Exists(_absAssetPath))
|
{
|
if (OnlyBuildNoExist)
|
{
|
//Debug.LogFormat("当前为只生成不存在的资源模式, 这里检测到 {0} 已经存在, 不进行生成.");
|
return;
|
}
|
|
GameObject _originalAssetRes = null;
|
|
_originalAssetRes = AssetDatabase.LoadAssetAtPath<GameObject>(_assetPath);
|
|
if (_originalAssetRes)
|
{
|
Transform _mpNode;
|
|
// 这里需要记录旧的对象身上的绑点信息, 然后给新的prefab设置绑点
|
m_MountPointInfoList.Clear();
|
_mpNode = _originalAssetRes.transform.GetChildTransformDeeply("A_Down");
|
if (_mpNode)
|
{
|
CreateMountPointInfo(_mpNode);
|
}
|
_mpNode = _originalAssetRes.transform.GetChildTransformDeeply("A_Name");
|
if (_mpNode)
|
{
|
CreateMountPointInfo(_mpNode);
|
}
|
_mpNode = _originalAssetRes.transform.GetChildTransformDeeply("A_Name2");
|
if (_mpNode)
|
{
|
CreateMountPointInfo(_mpNode);
|
}
|
_mpNode = _originalAssetRes.transform.GetChildTransformDeeply("A_Hit");
|
if (_mpNode)
|
{
|
CreateMountPointInfo(_mpNode);
|
}
|
_mpNode = _originalAssetRes.transform.GetChildTransformDeeply("A_Stun");
|
if (_mpNode)
|
{
|
CreateMountPointInfo(_mpNode);
|
}
|
|
CapsuleCollider _collider = _originalAssetRes.GetComponent<CapsuleCollider>();
|
if (_collider)
|
{
|
_colliderInfo = new ColliderInfo();
|
_colliderInfo.center = _collider.center;
|
_colliderInfo.height = _collider.height;
|
_colliderInfo.radius = _collider.radius;
|
}
|
}
|
}
|
|
GameObject _fbxRes = AssetDatabase.LoadAssetAtPath<GameObject>(_originalAssetPath);
|
|
if (_fbxRes == null)
|
{
|
_originalAssetPath = _originalAssetPath.Remove(_originalAssetPath.LastIndexOf(".")) + ".prefab";
|
_fbxRes = AssetDatabase.LoadAssetAtPath<GameObject>(_originalAssetPath);
|
if (_fbxRes == null)
|
{
|
Debug.LogFormat("无法读取 {0}, 地址: {1}", resName, _originalAssetPath);
|
return;
|
}
|
}
|
|
// 为了防止fbx本身就带有材质, 这里去掉fbx上的Import material属性
|
ModelImporter _modelImport = AssetImporter.GetAtPath(_originalAssetPath) as ModelImporter;
|
if (_modelImport != null)
|
{
|
if (_modelImport.importMaterials)
|
{
|
_modelImport.importMaterials = false;
|
_modelImport.SaveAndReimport();
|
}
|
}
|
|
GameObject _prefab = Object.Instantiate(_fbxRes);
|
|
// 设置绑点
|
if (m_MountPointInfoList.Count > 0)
|
{
|
MountPointInfo _mpInfo = null;
|
|
for (int i = 0; i < m_MountPointInfoList.Count; ++i)
|
{
|
_mpInfo = m_MountPointInfoList[i];
|
GameObject _mp = new GameObject(_mpInfo.name);
|
Transform _parent = null;
|
if (string.IsNullOrEmpty(_mpInfo.path))
|
{
|
_parent = _prefab.transform;
|
}
|
else
|
{
|
_parent = _prefab.transform.Find(_mpInfo.path);
|
}
|
|
if (_parent != null)
|
{
|
_mp.transform.SetParent(_parent);
|
_mp.transform.localPosition = _mpInfo.localPosition;
|
_mp.transform.localRotation = _mpInfo.localRotation;
|
_mp.transform.localScale = _mpInfo.localScale;
|
}
|
}
|
}
|
|
// 加载特效
|
//if (outName.StartsWith("M")
|
// || outName.StartsWith("N")
|
// || outName.StartsWith("B_")
|
// || outName.StartsWith("Zq"))
|
//{
|
// HandlerModelEffect("horseEffectConfig", null, outName, ref _prefab);
|
//}
|
//else if (InstanceResourcesLoader.raceSuffix.Equals(suffix))
|
//{
|
// HandlerModelEffect("clothesEffectConfig", path, resName, ref _prefab);
|
//}
|
|
if (_colliderInfo != null)
|
{
|
CapsuleCollider _collider = _prefab.AddMissingComponent<CapsuleCollider>();
|
_collider.center = _colliderInfo.center;
|
_collider.radius = _colliderInfo.radius;
|
_collider.height = _colliderInfo.height;
|
}
|
|
string _tempName = resName;
|
|
if ((resName.StartsWith("A_Zs") || resName.StartsWith("A_Fs"))
|
&& (suffix.Equals(InstanceResourcesLoader.raceSuffix)
|
|| suffix.Equals(InstanceResourcesLoader.handSuffix))
|
&& !isHighMesh)
|
{
|
_tempName += "_Dm";
|
}
|
|
Transform _rendererNode = _prefab.transform.Find(_tempName);
|
if (!_rendererNode)
|
{
|
_rendererNode = _prefab.transform;
|
}
|
|
Renderer _renderer = _rendererNode.GetComponent<Renderer>();
|
if (_renderer)
|
{
|
OnSetupRenderer(path, _tempName, ref _renderer);
|
}
|
|
Animation _animation = _prefab.GetComponent<Animation>();
|
if (_animation)
|
{
|
Object.DestroyImmediate(_animation);
|
}
|
|
if (suffix.Equals(InstanceResourcesLoader.raceSuffix)
|
|| suffix.Equals(InstanceResourcesLoader.horseSuffix)
|
|| suffix.Equals(InstanceResourcesLoader.wingSuffix))
|
{
|
Animator _animator = _prefab.GetComponent<Animator>();
|
|
if (!_animator)
|
{
|
_animator = _prefab.AddComponent<Animator>();
|
}
|
|
if (suffix.Equals(InstanceResourcesLoader.wingSuffix))
|
{
|
// 绑定动画控制器
|
RuntimeAnimatorController _runtimeAnimatorContorller = AssetDatabase.LoadAssetAtPath<RuntimeAnimatorController>(_acAssetPath);
|
if (_runtimeAnimatorContorller)
|
{
|
_animator.runtimeAnimatorController = _runtimeAnimatorContorller;
|
}
|
}
|
}
|
|
PrefabUtility.CreatePrefab(_assetPath, _prefab, ReplacePrefabOptions.Default);
|
|
// 设置打包路径
|
AssetImporter _assetImport = AssetImporter.GetAtPath(_assetPath);
|
_assetImport.assetBundleName = ResourcesPath.MOB_FOLDER_NAME
|
+ (InstanceResourcesLoader.raceSuffix + resName).ToLower();
|
EditorUtility.SetDirty(_prefab);
|
AssetDatabase.Refresh();
|
Object.DestroyImmediate(_prefab);
|
AssetDatabase.SaveAssets();
|
}
|
|
private void HandlerModelEffect(string configName, string path, string modelName, ref GameObject _go)
|
{
|
if (_go == null)
|
{
|
return;
|
}
|
|
string _configPath = ResourcesPath.ResourcesOutAssetPath + "Gmodels/" + configName + ".asset";
|
HorseEffectConfig _horseEffectConfig = AssetDatabase.LoadAssetAtPath<HorseEffectConfig>(_configPath);
|
if (_horseEffectConfig == null
|
|| _horseEffectConfig.effectConfigList == null
|
|| _horseEffectConfig.effectConfigList.Count == 0)
|
{
|
return;
|
}
|
|
HorseEffectConfig.EffectConfig _effectConfig;
|
int _index = -1;
|
|
for (int i = 0; i < _horseEffectConfig.effectConfigList.Count; ++i)
|
{
|
_effectConfig = _horseEffectConfig.effectConfigList[i];
|
if (_effectConfig.modelName.Equals(modelName))
|
{
|
_index = i;
|
break;
|
}
|
}
|
|
if (_index == -1)
|
{
|
Debug.LogFormat("HandlerModelEffect() => 模型 {0} 没有配置任何特效", modelName);
|
return;
|
}
|
|
_effectConfig = _horseEffectConfig.effectConfigList[_index];
|
|
Transform _parent;
|
GameObject _effect;
|
string _bonePath;
|
string _effectName;
|
|
for (int i = 0; i < _effectConfig.boneNameList.Count; ++i)
|
{
|
_bonePath = _effectConfig.boneNameList[i];
|
|
_parent = _go.transform.GetChildTransformDeeply(_bonePath);
|
if (_parent == null)
|
{
|
Debug.LogWarningFormat("HandlerModelEffect() => 坐骑 {0} 配置的骨骼名称: {1} 找不到", modelName, _bonePath);
|
continue;
|
}
|
|
_effectName = _effectConfig.effectNameList[i];
|
if (string.IsNullOrEmpty(path))
|
{
|
_configPath = string.Format("Assets/Art/Role/{0}/Effects/{1}.prefab", modelName, _effectName);
|
}
|
else
|
{
|
_configPath = string.Format("Assets/Art/Role/{0}/Effects/{1}.prefab", path, _effectName);
|
}
|
_effect = AssetDatabase.LoadAssetAtPath<GameObject>(_configPath);
|
if (_effect == null)
|
{
|
Debug.LogWarningFormat("HandlerModelEffect() => 坐骑 {0} 配置的特效资源: {1} 找不到", modelName, _configPath);
|
continue;
|
}
|
_effect = Object.Instantiate(_effect);
|
_effect.name = _effect.name.Replace("(Clone)", "");
|
_effect.transform.SetParentEx(_parent, Vector3.zero, Quaternion.identity, Vector3.one);
|
_effect.SetLayer(LayerUtility.BattleEffectLow, true);
|
}
|
}
|
|
protected static void CreateMountPointInfo(Transform t)
|
{
|
MountPointInfo _info = new MountPointInfo();
|
_info.path = SampleEditorTool.PrintHierarchyPath(t);
|
if (!string.IsNullOrEmpty(_info.path))
|
{
|
if (_info.path.Contains("/"))
|
{
|
_info.path = _info.path.Replace("/" + t.name, "");
|
}
|
else
|
{
|
_info.path = _info.path.Replace(t.name, "");
|
}
|
}
|
_info.name = t.name;
|
_info.localPosition = t.localPosition;
|
_info.localRotation = t.localRotation;
|
_info.localScale = t.localScale;
|
m_MountPointInfoList.Add(_info);
|
}
|
|
public static void BuildAnimationClip(string path)
|
{
|
string _absOriginaleDirectory = string.Format("{0}/ART/Role/{1}", Application.dataPath, path);
|
string _assetOriginalDirectory = string.Format("Assets/ART/Role/{0}", path);
|
string _absAssetDirectory = string.Format("{0}/ResourcesOut/Gmodels/{1}/AnimationClips", Application.dataPath, path);
|
string _assetDirectory = string.Format("Assets/ResourcesOut/Gmodels/{0}/AnimationClips", path);
|
|
if (!Directory.Exists(_absOriginaleDirectory))
|
{
|
return;
|
}
|
|
// 生成目标文件夹是否存在, 不存在则创建
|
if (!Directory.Exists(_absAssetDirectory))
|
{
|
Directory.CreateDirectory(_absAssetDirectory);
|
}
|
|
DirectoryInfo _dInfo = new DirectoryInfo(_absOriginaleDirectory);
|
FileInfo[] _fInfos = _dInfo.GetFiles("*.fbx");
|
FileInfo _fInfo = null;
|
Object _animationClip = null;
|
AssetImporter _assetImport = null;
|
|
int _count = _fInfos.Length;
|
string _newName = string.Empty;
|
string _assetDestPath = string.Empty;
|
string _originalPath = string.Empty;
|
|
List<AnimationClip> clips = new List<AnimationClip>();
|
for (int i = 0; i < _fInfos.Length; ++i)
|
{
|
_fInfo = _fInfos[i];
|
if (!_fInfo.Name.Contains("@"))
|
{
|
continue;
|
}
|
|
_newName = _fInfo.Name.Substring(_fInfo.Name.IndexOf("@") + 1);
|
_newName = _newName.Substring(0, _newName.Length - 4);
|
|
_assetDestPath = string.Format("{0}/{1}.anim", _absAssetDirectory, _newName);
|
|
EditorUtility.DisplayProgressBar(string.Format("正在生成 {0} 的动画中...", path),
|
string.Format("{0} => {1}.", _fInfo.Name, _assetDestPath),
|
i * 1f / _count);
|
|
if (File.Exists(_assetDestPath))
|
{
|
if (OnlyBuildNoExist)
|
{
|
continue;
|
}
|
}
|
|
_assetDestPath = string.Format("{0}/{1}.anim", _assetDirectory, _newName);
|
_originalPath = _fInfo.FullName.Substring(Application.dataPath.Length + 1);
|
_originalPath = Path.Combine("Assets/", _originalPath);
|
_originalPath = _originalPath.Replace("\\", "/");
|
|
_animationClip = AssetDatabase.LoadAssetAtPath(_originalPath, typeof(AnimationClip));
|
AnimationClip _newClip = new AnimationClip();
|
EditorUtility.CopySerialized(_animationClip, _newClip);
|
|
_newClip.legacy = false;
|
if (_newClip.name.Contains("Idle") || _newClip.name.Contains("Run") || _newClip.name.Contains("Stun"))
|
{
|
if (_newClip.isLooping == false)
|
{
|
AnimationClipSettings _clipSetting = AnimationUtility.GetAnimationClipSettings(_newClip);
|
_clipSetting.loopTime = true;
|
AnimationUtility.SetAnimationClipSettings(_newClip, _clipSetting);
|
}
|
}
|
|
AssetDatabase.CreateAsset(_newClip, _assetDestPath);
|
_assetImport = AssetImporter.GetAtPath(_assetDestPath);
|
_assetImport.assetBundleName = ResourcesPath.MOB_FOLDER_NAME + ResourcesPath.MOB_SUFFIX + path.ToLower();
|
|
clips.Add(_newClip);
|
EditorUtility.SetDirty(_newClip);
|
}
|
|
EditorUtility.ClearProgressBar();
|
|
AssetDatabase.SaveAssets();
|
AssetDatabase.Refresh();
|
}
|
|
public static void BuildAnimatorController(string resName, string templeName, string configName, string outName = null)
|
{
|
if (string.IsNullOrEmpty(outName))
|
{
|
outName = resName;
|
}
|
|
string _absAssetPath = string.Format("{0}Gmodels/{1}", ResourcesPath.ResourcesOutPath, outName);
|
|
if (!Directory.Exists(_absAssetPath))
|
{
|
Directory.CreateDirectory(_absAssetPath);
|
}
|
|
_absAssetPath = string.Format("{0}Gmodels/{1}/{2}{3}.controller", ResourcesPath.ResourcesOutPath, outName, AnimatorControllerLoader.controllerSuffix, outName);
|
string _assetPath = string.Format("{0}Gmodels/{1}/{2}{3}.controller", ResourcesPath.ResourcesOutAssetPath, outName, AnimatorControllerLoader.controllerSuffix, outName);
|
|
if (templeName.Equals("Temple_AnimatorController_BossShow"))
|
{
|
_absAssetPath = string.Format("{0}Gmodels/{1}/{2}{3}.controller", ResourcesPath.ResourcesOutPath, resName, AnimatorControllerLoader.controllerShowSuffix, resName);
|
_assetPath = string.Format("{0}Gmodels/{1}/{2}{3}.controller", ResourcesPath.ResourcesOutAssetPath, resName, AnimatorControllerLoader.controllerShowSuffix, resName);
|
}
|
|
if (templeName.Equals("Temple_AnimatorController_Realm"))
|
{
|
_absAssetPath = string.Format("{0}Gmodels/{1}/{2}{3}.controller", ResourcesPath.ResourcesOutPath, resName, AnimatorControllerLoader.controllerRealmSuffix, resName);
|
_assetPath = string.Format("{0}Gmodels/{1}/{2}{3}.controller", ResourcesPath.ResourcesOutAssetPath, resName, AnimatorControllerLoader.controllerRealmSuffix, resName);
|
}
|
|
if (templeName.Equals("Temple_AnimatorController_UI"))
|
{
|
_absAssetPath = string.Format("{0}Gmodels/{1}/{2}{3}.controller", ResourcesPath.ResourcesOutPath, outName, AnimatorControllerLoader.controllerUISuffix, outName);
|
_assetPath = string.Format("{0}Gmodels/{1}/{2}{3}.controller", ResourcesPath.ResourcesOutAssetPath, outName, AnimatorControllerLoader.controllerUISuffix, outName);
|
}
|
|
string _templePath = string.Format("{0}Gmodels/{1}.controller", ResourcesPath.ResourcesOutPath, templeName);
|
|
if (File.Exists(_absAssetPath))
|
{
|
if (OnlyBuildNoExist)
|
{
|
return;
|
}
|
else
|
{
|
File.Delete(_absAssetPath);
|
}
|
}
|
|
File.Copy(_templePath, _absAssetPath);
|
AssetDatabase.Refresh();
|
|
AnimatorController _animatorController = AssetDatabase.LoadAssetAtPath<AnimatorController>(_assetPath);
|
|
if (!_animatorController)
|
{
|
Debug.LogErrorFormat("找不到所需要的动画状态机, 地址为: {0}", _assetPath);
|
return;
|
}
|
|
AnimatorControllerLayer _layer = _animatorController.layers[0];
|
AnimatorStateMachine _stateMachine = _layer.stateMachine;
|
|
|
// 读取配置文件
|
string _configPath = StringUtility.Contact(ResourcesPath.ResourcesOutAssetPath,
|
"gmodels/",
|
configName,
|
".asset");
|
|
AnimatorBuildConfig _buildConfig = AssetDatabase.LoadAssetAtPath<AnimatorBuildConfig>(_configPath);
|
|
HandleStateMachine(resName, _stateMachine, _buildConfig);
|
|
EditorUtility.SetDirty(_animatorController);
|
|
AssetImporter _assetImport = AssetImporter.GetAtPath(_assetPath);
|
_assetImport.assetBundleName = ResourcesPath.MOB_FOLDER_NAME + ResourcesPath.MOB_SUFFIX + outName;
|
|
EditorUtility.ClearProgressBar();
|
|
AssetDatabase.SaveAssets();
|
AssetDatabase.Refresh();
|
}
|
|
protected static void HandleStateMachine(string modelName, AnimatorStateMachine stateMachine, AnimatorBuildConfig _buildConfig)
|
{
|
if (stateMachine.states == null || stateMachine.states.Length == 0)
|
{
|
return;
|
}
|
|
AnimatorState _animatorState = null;
|
Motion _motion = null;
|
|
int _configStateIndex = -1;
|
|
for (int i = 0; i < stateMachine.states.Length; ++i)
|
{
|
_animatorState = stateMachine.states[i].state;
|
_motion = _animatorState.motion;
|
|
foreach (var _clipInfo in _buildConfig.clipConfigs)
|
{
|
if (_clipInfo.stateName.Equals(_animatorState.name))
|
{
|
_configStateIndex = _buildConfig.clipConfigs.IndexOf(_clipInfo);
|
}
|
}
|
|
if (_configStateIndex == -1)
|
{
|
Debug.LogWarningFormat("没有找到状态机上名称为: {0}在animatorBuildConfig里的对应配置. ", _animatorState.name);
|
continue;
|
}
|
|
// 处理融合树类型
|
if (_motion is BlendTree)
|
{ }
|
else
|
{// 非融合树类型处理
|
|
if (_configStateIndex < 0 || _configStateIndex >= _buildConfig.clipConfigs.Count)
|
{
|
Debug.LogWarningFormat("state的名称{0}在配置表 animatorBuildConfig 找到索引{1} 找不到它对应的 clipConfigs 动画配置. ",
|
_animatorState.name,
|
_configStateIndex);
|
continue;
|
}
|
|
// 读取配置上的动画片段
|
List<string> _configClipNames = _buildConfig.clipConfigs[_configStateIndex].clipNames;
|
|
if (_configClipNames == null || _configClipNames.Count == 0)
|
{
|
continue;
|
}
|
|
AnimationClip _configClip;
|
for (int j = 0; j < _configClipNames.Count; ++j)
|
{
|
_configClip = LoadModelAnimationClip(modelName, _configClipNames[j]);
|
if (_configClip != null)
|
{
|
_animatorState.motion = _configClip;
|
break;
|
}
|
}
|
|
if (_animatorState.motion == null)
|
{
|
Debug.LogWarningFormat("为{0}状态设置动画失败!!!", _animatorState.name);
|
}
|
}
|
|
}
|
|
for (int i = 0; i < stateMachine.stateMachines.Length; ++i)
|
{
|
HandleStateMachine(modelName, stateMachine.stateMachines[i].stateMachine, _buildConfig);
|
}
|
}
|
|
protected static AnimationClip LoadModelAnimationClip(string modelName, string clipName)
|
{
|
|
string _assetPath = StringUtility.Contact(ResourcesPath.ResourcesOutAssetPath,
|
"gmodels/",
|
modelName,
|
"/AnimationClips/",
|
clipName,
|
".anim");
|
|
AnimationClip _animationClip = AssetDatabase.LoadAssetAtPath<AnimationClip>(_assetPath);
|
return _animationClip;
|
}
|
|
protected virtual void OnSetupRenderer(string path, string resName, ref Renderer renderer)
|
{
|
|
}
|
}
|