private static bool SetPointTangent(int pointIndex, Vector3 worldTangent, bool isInTangent) { List <AnimationPathPoint> points = animationPoints; AnimationPathPoint pathPoint = null; AnimationPathPoint nextPathPoint = null; Vector3 offset = Vector3.zero; if (isInTangent) { pathPoint = points[pointIndex - 1]; nextPathPoint = points[pointIndex]; offset = GetLocalPosition(worldTangent) - GetLocalPosition(nextPathPoint.worldInTangent); } else { pathPoint = points[pointIndex]; nextPathPoint = points[pointIndex + 1]; offset = GetLocalPosition(worldTangent) - GetLocalPosition(pathPoint.worldOutTangent); } string inPath = AnimationUtility.CalculateTransformPath(activeGameObject.transform, activeRootGameObject.transform); Type inType = typeof(Transform); EditorCurveBinding bindingX = EditorCurveBinding.FloatCurve(inPath, inType, "m_LocalPosition.x"); EditorCurveBinding bindingY = EditorCurveBinding.FloatCurve(inPath, inType, "m_LocalPosition.y"); EditorCurveBinding bindingZ = EditorCurveBinding.FloatCurve(inPath, inType, "m_LocalPosition.z"); AnimationCurve curveX = AnimationUtility.GetEditorCurve(activeAnimationClip, bindingX); AnimationCurve curveY = AnimationUtility.GetEditorCurve(activeAnimationClip, bindingY); AnimationCurve curveZ = AnimationUtility.GetEditorCurve(activeAnimationClip, bindingZ); if (curveX == null || curveY == null || curveZ == null) { return(false); } AnimationPathPoint.ModifyPointTangent(pathPoint, nextPathPoint, offset, isInTangent, curveX, curveY, curveZ); Undo.RegisterCompleteObjectUndo(activeAnimationClip, "Edit Curve"); AnimationUtility.SetEditorCurve(activeAnimationClip, bindingX, curveX); AnimationUtility.SetEditorCurve(activeAnimationClip, bindingY, curveY); AnimationUtility.SetEditorCurve(activeAnimationClip, bindingZ, curveZ); AnimationWindowUtil.Repaint(); return(true); }