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); }
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); }