public void proc(AnimationClip srcClip, AnimationClip dstClip)
        {
            AnimCloner.clone(srcClip, dstClip);

            // 対象ボーン特定用正規表現
            var rgxVisBone = new System.Text.RegularExpressions.Regex(regexVisBonePtn);


            // カーブは変更か全消ししか無くて、ひとつずつ消すことが出来ない。
            // なのでとりあえず全消ししてからまたコピーする。
            dstClip.ClearCurves();

            foreach (var i in AnimationUtility.GetCurveBindings(srcClip))
            {
                var ac = AnimationUtility.GetEditorCurve(srcClip, i);
                if (!rgxVisBone.IsMatch(i.path))
                {
                    // 対象外ボーンはそのままコピー
                    AnimationUtility.SetEditorCurve(dstClip, i, ac);
                    continue;
                }

                // 対象ボーンの m_LocalScale.x をフラグとする
                if (i.propertyName != "m_LocalScale.x")
                {
                    continue;
                }

                // このVis対象に対しての処理が初めてか否かの判定
                var m    = rgxVisBone.Match(i.path);
                var caps = m.Groups[1].Captures;
                VisTargetObjInfo vtoi;
                bool             is1stProcBone;
                if (is1stProcBone = !visTargetObjInfos.TryGetValue(m.Value, out vtoi))
                {
                    vtoi = new VisTargetObjInfo();
                    foreach (System.Text.RegularExpressions.Capture j in caps)
                    {
                        if (VisTargetObjInfo.isPartialMatchFmt(j.Value))
                        {
                            // Vis操作対象オブジェクト名に部分一致フォーマットが指定されている
                            if (visTargetableNames == null)
                            {
                                Debug.LogError("visTargetableNamesが設定されていません");
                            }
                            else
                            {
                                foreach (var k in visTargetableNames)
                                {
                                    if (VisTargetObjInfo.isPartialMatch(j.Value, k))
                                    {
                                        vtoi.srcObjNames.Add(k);
                                    }
                                }
                            }
                        }
                        else
                        {
                            vtoi.srcObjNames.Add(j.Value);
                        }
                    }
                    visTargetObjInfos[m.Value] = vtoi;
                }

                // 指定されたVisibility変更ターゲットで、カーブを生成する
                Action <string> makeCurve = path => {
                    var binding = new EditorCurveBinding();
                    binding.path         = path;
                    binding.type         = typeof(SkinnedMeshRenderer);
                    binding.propertyName = "m_Enabled";
                    AnimationUtility.SetEditorCurve(dstClip, binding, ac);
                };
                if (getCombinedName == null || caps.Count == 1)
                {
                    foreach (var j in vtoi.srcObjNames)
                    {
                        makeCurve(j);
                    }
                }
                else
                {
                    if (is1stProcBone)
                    {
                        vtoi.combinedTgtName = getCombinedName();
                    }
                    makeCurve(vtoi.combinedTgtName);
                }
            }

            // リファレンス系カーブはそのままコピー
            foreach (var i in AnimationUtility.GetObjectReferenceCurveBindings(srcClip))
            {
                var keys = AnimationUtility.GetObjectReferenceCurve(srcClip, i);
                AnimationUtility.SetObjectReferenceCurve(dstClip, i, keys);
            }

            // ログの生成
            var log = Log.instance;

            log.endVisAnimGeneration(true, srcClip);
        }
Exemplo n.º 2
0
        public void proc(AnimationClip srcClip, AnimationClip dstClip)
        {
            AnimCloner.clone(srcClip, dstClip);

            // 名前をミラー化
            dstClip.name = mirrorName(srcClip.name);

            // 再生位置を半分ずらす処理が必要な場合は、ここで行う
            if (shiftCycleOffset)
            {
                var dstAcs = AnimationUtility.GetAnimationClipSettings(dstClip);
                dstAcs.cycleOffset = (dstAcs.cycleOffset + 0.5f) % 1;
                AnimationUtility.SetAnimationClipSettings(dstClip, dstAcs);
            }

            // カーブは変更か全消ししか無くて、ひとつずつ消すことが出来ない。
            // なのでとりあえず全消ししてからまたコピーする。
            dstClip.ClearCurves();

            // カーブをミラーリングする
            foreach (var i in AnimationUtility.GetCurveBindings(srcClip))
            {
                var curve = AnimationUtility.GetEditorCurve(srcClip, i);
//			Debug.Log( "path:"+i.path);
//			Debug.Log( "propertyName:"+i.propertyName);
//			Debug.Log( "type:"+i.type);

                var newBnd = i;

                // パスを変換
                bool isLR     = false;
                bool isCenter = false;
                var  path     = i.path;
                {
                    if (path.EndsWith(suffixL))
                    {
                        isLR = true;
                        path = path.Substring(0, path.Length - 2) + suffixR;
                    }
                    else if (path.EndsWith(suffixR))
                    {
                        isLR = true;
                        path = path.Substring(0, path.Length - 2) + suffixL;
                    }
                    path     = path.Replace(suffixL + "/", suffixR + "\n/");
                    path     = path.Replace(suffixR + "/", suffixL + "\n/");
                    path     = path.Replace("\n", "");
                    isCenter = !isLR && !path.Contains(suffixL + "/") && !path.Contains(suffixL + "/");
                }
                newBnd.path = path;

                // キーをミラー
                var newCurve = new AnimationCurve();
                foreach (var j in curve.keys)
                {
                    var newkey = j;
                    if ((
                            // 位置をミラー
                            (isLR || isCenter) && i.propertyName == "m_LocalPosition.x"
                            ) || (
                            // 回転をミラー
                            i.propertyName == "m_LocalRotation.y" || i.propertyName == "m_LocalRotation.z"
                            ))
                    {
                        newkey.value      = -newkey.value;
                        newkey.inTangent  = -newkey.inTangent;
                        newkey.outTangent = -newkey.outTangent;
                    }
                    newCurve.AddKey(newkey);
                }

                AnimationUtility.SetEditorCurve(dstClip, newBnd, newCurve);
            }

            // リファレンス系カーブはそのままコピー
            foreach (var i in AnimationUtility.GetObjectReferenceCurveBindings(srcClip))
            {
                var keys = AnimationUtility.GetObjectReferenceCurve(srcClip, i);
                AnimationUtility.SetObjectReferenceCurve(dstClip, i, keys);
            }

            // ログの生成
            var log = Log.instance;

            log.endVisAnimGeneration(true, srcClip);
        }