问题描述:
当一个 父物体添加了Animation动画时,其 父子物体关系就被写入到AnimationClip文件中,通过
path: 父物体名 /子物体名
关系
这样就带来一个问题,
当在做了动画之后, 再去修改子物体的名字时, 动画 就会missing
解决思路:
这是因为只 修改了物体信息,而没有去修改AnimationClip中的信息,解决方法 简单暴力的就是对每个修改的名字,广联到的动画 进行名字修改, 选择Missing 按下F2 进行修改
这里的1 就是父物体, 因为父物体名字发送变化, 而AnimationClip 不更新,就会导致Miss 只要修改 好,就解决问题了。
比如 原来的 物体中的一个部位 名字叫1 然后改成b 动画就会missing,
打开 Animation
找到 animationClip 中所missing的, 只要把1/xxx 前的1 改成b 就不会 miss了。
这种方法效率非常低。 只能一个 一个的改。
为什么会 Missing呢
前面 有 提到 path,
这里 path 就是 关联动画的。
在你的文件下 找到 AnimationClip, anim文件, 用Text 打开。
格式如下
path 就是 关联动画 物体的名字
这里中文 被转为Unicode了。
批量解决思路, 首先 要获取 所有 相关的 AnimationClip, 然后可以 用
System.IO 进行写入 ,替换。在 要 对物体改名的时候 ,获取物体的名字,然后 去AnimationClip中匹配, 要注意的是 编码的转换。
下面 列出 相关的方法。
public class Rename : ScriptableWizard
{
static void CreateWizard()
{
ScriptableWizard.DisplayWizard(" Rename", typeof( Rename), "Rename", "Apply");
}
private void OnWizardCreate()
{
if (Selection.objects == null)
{
return;
}
}
private void OnSelectionChange()
{
UpdateSelectionHelper();
}
void UpdateSelectionHelper()
{
if (Selection.objects != null)
{
helpString = "一共选择"+ Selection.gameObjects.Length.ToString();
}
}
}
//1.将Unicode 转化为汉字
public string UnicodeToString(string unicode)
{
string result = "";
//正则匹配
Regex reg = new Regex(@"(?i)//u([0-9a-f]{4})");
result = reg.Replace(unicode, delegate (Match m)
{
return ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString();
});
return result;
}
//2.将汉字转话为Unicode
public static string StringToUnicode(string value)
{
byte[] bytes = Encoding.Unicode.GetBytes(value);
StringBuilder str= new StringBuilder();
for (int i = 0; i < bytes.Length; i += 2)
{
// 取两个字符,每个字符都是右对齐。
str.AppendFormat("u{0}{1}", bytes[i + 1].ToString("x").PadLeft(2, '0'), bytes[i].ToString("x").PadLeft(2, '0'));
}
return str.ToString();
}