unity编辑器 ---SceneView窗口自定义

SceneView窗口自定义 是通过Handles类 控制柄来自定义界面,通过HandleUtility 控制柄工具辅助。

Handles控制柄到底是什么?

直接上图就明白了:

如上图箭头所指的,我们都可以通过Handles控制柄来画出来。所谓的Handles控制柄就是我们选择的物体后在场景里的控制点。

直接上代码小测试

首先加一个空脚本目的是挂在的物体上,然后自定义脚本窗口

using System.Collections.Generic;
using UnityEngine;

public class HandleTest : MonoBehaviour {
    

}

然后将此脚本挂在到任意物体上

然后定义此脚本窗口

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
[CustomEditor(typeof(HandleTest))]
public class HandleTestEditor : Editor
{
    GameObject gameObject;
    Transform _transformPoint;
    Transform transformPoint
    {
        get
        {
            if (!_transformPoint)
            {
                _transformPoint = new GameObject("transformPoint").transform;
            }
            return _transformPoint;
        }
    }
    float cylinderSize = 1;
    Camera camera;
    Camera _cameraTemp;
    Camera cameraTemp
    {
        get
        {
            if (!_cameraTemp)
            {
                _cameraTemp = new GameObject("cameraTemp").AddComponent<Camera>();
            }
            return _cameraTemp;
        }
    }
    private void OnEnable()
    {
        gameObject = ((HandleTest)target).gameObject;
        camera = Camera.main;
        
    }
    private void OnSceneGUI()
    {

        drawCylinder();
        drawShere();
        lookCamera();
        sceneComponent();
    }
    Vector3 point;
    private void lookCamera()
    {
        point = Handles.PositionHandle(point, Quaternion.identity);
        transformPoint.position = point;

        gameObject.transform.LookAt(transformPoint);
    }
    /// <summary>
    /// 画圆柱
    /// </summary>
    private void drawCylinder()
    {
        Handles.color = Color.red;
        Handles.CylinderHandleCap(0,
        gameObject.transform.position + new Vector3(4, 0, 0),
        gameObject.transform.rotation,
        cylinderSize, EventType.Repaint);
    }
    private void sceneComponent()
    {
        Handles.BeginGUI();
            GUILayout.BeginArea(new Rect(100,100,500,500));
                GUILayout.Button("按钮"); 
            GUILayout.EndArea();
        Handles.EndGUI();
    }
    /// <summary>
    /// 画圆
    /// </summary>
    private void drawShere()
    {
        Handles.color = Color.green;
        Handles.SphereHandleCap(0,
        gameObject.transform.position +new Vector3(0, 5, 0),
        gameObject.transform.rotation,
        cylinderSize, EventType.Repaint);
    }
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        cylinderSize = EditorGUILayout.FloatField(cylinderSize);
    }
}

效果如下:

官网对此类已经做了详细说明

我只附上一些效果做一下笔记

Handles.PositionHandle 位置控制柄

 

Handles.RotationHandle 旋转控制柄

Handles.ScaleHandle 缩放控制柄

Handles.RadiusHandle 半径控制柄

还有其它绘制图形,查看官网就可以了

猜你喜欢

转载自blog.csdn.net/fengya1/article/details/83025273