示例#1
0
    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;
                    }
                }
            }
        }
    }