美文网首页
Unity实现自定义Editor

Unity实现自定义Editor

作者: Razy西南 | 来源:发表于2022-03-30 09:57 被阅读0次
e37-216.jpeg
  • 有时候需要我们快速的配置一些参数,但是又不用编写代码,这个时候就考虑用自定义编辑器来实现。

自定义类GUIEditor 继承Editor

using UnityEditor;

public  class GUIEditor : Editor
{
    //定义你需要的参数

    //初始化
    void OnEnable()
    {

    }
}

重写OnInspectorGUI方法。

    public override void OnInspectorGUI()
    {
        
    }

如何实现测试版本和Release版本间切换

  • 利用上面讲的方法,可以实现一个编辑器中控制测试版本和正式发布版本间参数的配置,我这里写了三个版本的切换:Debug,Tester,Release

首先还是写一个自定义Editor:

using UnityEditor;

[CustomEditor(typeof(TestManager))]
public  class GUIEditor : Editor
{
    //序列化
    private SerializedObject test;
    //各个公开变量
    private SerializedProperty _testMode, purchasingAlwaysSuccess, useTestAD, usePurchase, useServerConfig, shortenTime, passAD;
    
    void OnEnable()
    {
        //获取到相关对象
        test = new SerializedObject(target);
        //获取选择
        _testMode = test.FindProperty("mode");
        purchasingAlwaysSuccess = test.FindProperty("purchasingAlwaysSuccess");
        useTestAD = test.FindProperty("useTestAD");
        usePurchase = test.FindProperty("usePurchase");
        useServerConfig = test.FindProperty("useServerConfig");
        shortenTime = test.FindProperty("shortenTime");
        passAD = test.FindProperty("passAD");
    }
    public override void OnInspectorGUI()
    {
        test.Update();//更新test
        //各个模式下均公开的变量
        EditorGUILayout.PropertyField(_testMode);
        if (_testMode.enumValueIndex == 0)
        {
            EditorGUILayout.PropertyField(purchasingAlwaysSuccess);
            EditorGUILayout.PropertyField(useTestAD);
            EditorGUILayout.PropertyField(usePurchase);
            EditorGUILayout.PropertyField(useServerConfig);
            EditorGUILayout.PropertyField(shortenTime);
            EditorGUILayout.PropertyField(passAD);
        }
        test.ApplyModifiedProperties();//应用
    }
}
  • 序列化SerializedObject,定义一个全局变量test。
  • 各个公开变量,表示当前模式下分别的值。
  • OnInspectorGUI中根据test的mode更新SerializedObject对象中的值。
  • enumValueIndex=0 表示此mode下才显示以下配置的值。

顶部注意要写

[CustomEditor(typeof(TestManager))]

这里的TestManager就是控制当前版本参数值的类,有这行代码,在Manager类才能获取到对应的编辑器的值。

using System;
using UnityEngine;
public class TestManager : MonoBehaviour
{
    [HideInInspector]
    [SerializeField, Tooltip("当前项目模式")]
    public TEST_MODE mode;
    
    [HideInInspector]
    [SerializeField, Tooltip("是否直接内购成功")]
    public bool purchasingAlwaysSuccess;
    
    [HideInInspector]
    [SerializeField, Tooltip("是否使用测试广告ID")]
    public bool useTestAD;
    
    [HideInInspector]
    [SerializeField, Tooltip("是否使用内购板块")]
    public bool usePurchase;
    
    [HideInInspector]
    [SerializeField, Tooltip("是否使用服务器配置")]
    public bool useServerConfig;
    
    [HideInInspector]
    [SerializeField, Tooltip("是否缩短时长")]
    public bool shortenTime;
    
    [HideInInspector]
    [SerializeField, Tooltip("是否跳过广告")]
    public bool passAD;
    
    
    private static TestManager instance;
    public static TestManager Instance
    {
        get
        {
            if (!instance)
            {
                instance = FindObjectOfType(typeof(TestManager)) as TestManager;
            }
            return instance;
        }
    }
    
    public enum TEST_MODE
    {
        Debug,//可配置开关,报活和事件统计只会记录原始日志,不会计入报表。
        Tester,//开关固定:隐藏测试按钮,使用测试广告ID,启用内购(可直接购买产品成功),不使用服务器配置参数,报活和事件统计只会记录原始日志,不会计入报表。
        Release//开关固定:隐藏测试按钮,使用正式广告ID,启用内购(IAP流程),使用服务器配置参数。
    }

    /// <summary>
    /// 是否展示测试按钮
    /// </summary>
    /// <returns></returns>
    public bool isShowDebugButton()
    {
#if UNITY_EDITOR
        return true;
#endif
        switch (mode)
        {
            case TEST_MODE.Debug:
                return true;
            case TEST_MODE.Tester:
                return true;
            case TEST_MODE.Release:
                return false;
            default:
                throw new ArgumentOutOfRangeException();
        }
    }
    
    /// <summary>
    /// 是否使用测试广告ID
    /// </summary>
    /// <returns></returns>
    public bool isUseTestADID()
    {
#if UNITY_EDITOR
        return true;
#endif
        switch (mode)
        {
            case TEST_MODE.Debug:
                return useTestAD;
            case TEST_MODE.Tester:
                return true;
            case TEST_MODE.Release:
                return false;
            default:
                throw new ArgumentOutOfRangeException();
        }
    }

    /// <summary>
    /// 是否启用内购
    /// </summary>
    /// <returns></returns>
    public bool isUsePurchase()
    {
        switch (mode)
        {
            case TEST_MODE.Debug:
                return usePurchase;
            case TEST_MODE.Tester:
                return true;
            case TEST_MODE.Release:
                return true;
            default:
                throw new ArgumentOutOfRangeException();
        }
    }
    
    /// <summary>
    /// 是否使用服务器配置参数
    /// </summary>
    /// <returns></returns>
    public bool isUseServerConfig()
    {
        switch (mode)
        {
            case TEST_MODE.Debug:
                return useServerConfig;
            case TEST_MODE.Tester:
                return false;
            case TEST_MODE.Release:
                return true;
            default:
                throw new ArgumentOutOfRangeException();
        }
    }

    /// <summary>
    /// 是否跳过GP验证直接内购成功
    /// </summary>
    /// <returns></returns>
    public bool isAlwaysPurchasingSuccsee()
    {
        switch (mode)
        {
            case TEST_MODE.Debug:
                return purchasingAlwaysSuccess;
            case TEST_MODE.Tester:
                return true;
            case TEST_MODE.Release:
                return false;
            default:
                throw new ArgumentOutOfRangeException();
        }
    }

    /// <summary>
    /// 是否跳过广告
    /// </summary>
    /// <returns></returns>
    public bool isPassAD()
    {
        switch (mode)
        {
            case TEST_MODE.Debug:
                return passAD;
            case TEST_MODE.Tester:
                return false;
            case TEST_MODE.Release:
                return false;
            default:
                throw new ArgumentOutOfRangeException();
        }
    }

    /// <summary>
    /// 当前是否为正式打包模式
    /// </summary>
    /// <returns></returns>
    public bool isReleaseMode()
    {
        return mode.Equals(TEST_MODE.Release);
    }
    
    /// <summary>
    /// 当前是否为测试模式
    /// </summary>
    /// <returns></returns>
    public bool isTesterMode()
    {
        return mode.Equals(TEST_MODE.Tester);
    }
}

关键字HideInInspector,在编辑器隐藏该选项,也就是当你需要编辑器直接编辑的时候控制显示,我在enumValueIndex=0 时才让用户外部可配置参数。

每个参数含义:
  • mode,当前项目模式;
  • purchasingAlwaysSuccess,是否直接内购成功;
  • useTestAD,是否使用测试广告ID;
  • usePurchase,是否使用内购板块;
  • useServerConfig,是否使用服务器配置;
  • shortenTime,是否缩短实际时长;
  • passAD,是否直接跳过广告;

最终编辑器中显示:


Editor1.jpg Editor2.jpg Editor3.jpg

确实方便了很多。

共勉。

相关文章

网友评论

      本文标题:Unity实现自定义Editor

      本文链接:https://www.haomeiwen.com/subject/smrvjrtx.html