private static void DrawSceneViewGUI() { if (reloadPointsInfo) { reloadPointsInfo = false; int num = animationPoints.Count; InitPointsInfo(); if (pointShow && animationPoints.Count > num) { // FIXME 这是为了修复新增点的时候,方向杆ID被改变了,所以操作无效 // 不完美,需要第二次点击的时候,才会获取新控件ID GUIUtility.hotControl = 0; Event.current.Use(); } } if (activeGameObject == null) { return; } List <AnimationPathPoint> points = animationPoints; int numPos = points.Count; for (int i = 0; i < numPos; i++) { AnimationPathPoint pathPoint = points[i]; pathPoint.worldPosition = GetWorldPosition(pathPoint.position); } for (int i = 0; i < numPos - 1; i++) { AnimationPathPoint pathPoint = points[i]; AnimationPathPoint nextPathPoint = points[i + 1]; Vector3 startTangent; Vector3 endTangent; AnimationPathPoint.CalcTangents(pathPoint, nextPathPoint, out startTangent, out endTangent); Vector3 p0 = pathPoint.worldPosition; Vector3 p1 = GetWorldPosition(startTangent); Vector3 p2 = GetWorldPosition(endTangent); Vector3 p3 = nextPathPoint.worldPosition; Handles.DrawBezier(p0, p3, p1, p2, Color.white, null, 2f); pathPoint.worldOutTangent = p1; nextPathPoint.worldInTangent = p2; } if (!pointShow) { return; } Quaternion handleRotation = activeParentTransform != null ? activeParentTransform.rotation : Quaternion.identity; for (int i = 0; i < numPos; i++) { int pointIndex = i * 3; Handles.color = Color.green; AnimationPathPoint pathPoint = points[i]; Vector3 position = pathPoint.worldPosition; float pointHandleSize = HandleUtility.GetHandleSize(position) * 0.04f; float pointPickSize = pointHandleSize * 0.7f; Handles.Label(position, " Point " + i); if (Handles.Button(position, handleRotation, pointHandleSize, pointPickSize, Handles.DotCap)) { selectedPointIndex = pointIndex; if (Selection.activeGameObject != activeGameObject) { Selection.activeGameObject = activeGameObject; } AnimationWindowUtil.SetCurrentTime(pathPoint.time); } Handles.color = Color.grey; int inIndex = pointIndex - 1; int outIndex = pointIndex + 1; if (selectedPointIndex < 0 || selectedPointIndex < inIndex || selectedPointIndex > outIndex) { continue; } if (i != 0) { Handles.DrawLine(position, pathPoint.worldInTangent); if (Handles.Button(pathPoint.worldInTangent, handleRotation, pointHandleSize, pointPickSize, Handles.DotCap)) { selectedPointIndex = inIndex; } if (selectedPointIndex == inIndex) { EditorGUI.BeginChangeCheck(); Vector3 pos = Handles.PositionHandle(pathPoint.worldInTangent, handleRotation); if (EditorGUI.EndChangeCheck() && SetPointTangent(i, pos, true)) { return; } } } if (i != numPos - 1) { Handles.DrawLine(position, pathPoint.worldOutTangent); if (Handles.Button(pathPoint.worldOutTangent, handleRotation, pointHandleSize, pointPickSize, Handles.DotCap)) { selectedPointIndex = outIndex; } if (selectedPointIndex == outIndex) { EditorGUI.BeginChangeCheck(); Vector3 pos = Handles.PositionHandle(pathPoint.worldOutTangent, handleRotation); if (EditorGUI.EndChangeCheck() && SetPointTangent(i, pos, false)) { return; } } } } }