Animation遇到的问题

问题描述:

当一个 父物体添加了Animation动画时,其 父子物体关系就被写入到AnimationClip文件中,通过

path: 父物体名 /子物体名

关系
这样就带来一个问题,
当在做了动画之后, 再去修改子物体的名字时, 动画 就会missing
Animation遇到的问题

解决思路:

这是因为只 修改了物体信息,而没有去修改AnimationClip中的信息,解决方法 简单暴力的就是对每个修改的名字,广联到的动画 进行名字修改, 选择Missing 按下F2 进行修改
Animation遇到的问题
这里的1 就是父物体, 因为父物体名字发送变化, 而AnimationClip 不更新,就会导致Miss 只要修改 好,就解决问题了。

比如 原来的 物体中的一个部位 名字叫1 然后改成b 动画就会missing,

打开 Animation
找到 animationClip 中所missing的, 只要把1/xxx 前的1 改成b 就不会 miss了。

这种方法效率非常低。 只能一个 一个的改。
Animation遇到的问题

为什么会 Missing呢

前面 有 提到 path,
这里 path 就是 关联动画的。

在你的文件下 找到 AnimationClip, anim文件, 用Text 打开。

格式如下
path 就是 关联动画 物体的名字

这里中文 被转为Unicode了。
Animation遇到的问题

批量解决思路, 首先 要获取 所有 相关的 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();
}