不想放弃自己信心苦苦拖的AnimationClip?Animition和Animator的Clip不通用?
然后被百度出来的方法坑够呛。。。。改什么原文件啊!改完Unity都卡死了。
以下为偶然发现的AnimationClip转换方法,希望都管用。
//得到要转换的AnimationClip
var clip = AssetDatabase.LoadAssetAtPath<AnimationClip>(path);
//Animation为true;Animator为false
clip.legacy = true;
//标记出来,不然怎么保存都不写入硬盘
EditorUtility.SetDirty(clip);
//保存,OK
AssetDatabase.SaveAssets();
这样做,貌似只修改了原文件中的“m_Legacy: 0”
...也好,免得设置“Edit->Project Settings->Editor -> Asset Serialization”了,而且相同操作批量修改也方便
注意,材质UV在U5后Animition好像不能控制了
using UnityEngine;
using UnityEditor;
public class AnimationClipConversion
{
[MenuItem("Assets/转换AnimationClip格式")]
static void Conversion()
{
Object obj = Selection.activeObject;
if (!(obj is AnimationClip)) return;
string path = AssetDatabase.GetAssetPath(obj);
//得到要转换的AnimationClip
var clip = AssetDatabase.LoadAssetAtPath<AnimationClip>(path);
//Animation为true;Animator为false
clip.legacy = !clip.legacy;
//标记出来,不然怎么保存都不写入硬盘
EditorUtility.SetDirty(clip);
//保存,OK
AssetDatabase.SaveAssets();
Debug.Log("转换完成:" + clip.name + (clip.legacy ? "->Animation" : "->Animator"));
}
[MenuItem("Assets/转换AnimationClip格式", true)]
static bool CanConversion()
{
return Selection.activeObject is AnimationClip;
}
[MenuItem("Assets/Animator转Animation")]
static void AniComponentConversion()
{
GameObject obj = Selection.activeGameObject;
if (obj == null) return;
Animator[] animators = obj.GetComponentsInChildren<Animator>(true);
AnimationClip[] clips;
GameObject go;
Animation ani;
if (animators == null || animators.Length == 0)
{
Debug.LogWarning(obj.name + ":未找到Animator组件");
return;
}
EditorUtility.SetDirty(obj);
for (int i = 0; i < animators.Length; i++)
{
go = animators[i].gameObject;
if (animators[i].runtimeAnimatorController == null)
{
Debug.LogWarning(go.name + ":Animator组件Controller为空");
Object.DestroyImmediate(animators[i], true);
continue;
}
clips = animators[i].runtimeAnimatorController.animationClips;
if (clips.Length > 1) Debug.LogWarning(animators[i].name + ":动画片段数量大于1");
for (int j = 0; j < clips.Length; j++)
{
clips[j].legacy = true;
EditorUtility.SetDirty(clips[j]);
Debug.Log("[转换]GameObject:" + go.name + " AnimationClip:" + clips[j].name);
}
Object.DestroyImmediate(animators[i], true);
if (clips.Length > 0)
{
ani = go.AddComponent<Animation>();
for (int l = 0; l < clips.Length; l++)
{
ani.AddClip(clips[l], clips[l].name);
}
ani.clip = clips[0];
}
else
{
Debug.LogWarning(go.name + ":动画片段数量为0");
}
}
AssetDatabase.SaveAssets();
}
[MenuItem("Assets/Animator转Animation", true)]
static bool CanAniComponentConversion()
{
GameObject obj = Selection.activeGameObject;
if (obj == null) return false;
Animator[] animators = obj.GetComponentsInChildren<Animator>(true);
if (animators == null || animators.Length == 0) return false;
return true;
}
}