- 有时候需要我们快速的配置一些参数,但是又不用编写代码,这个时候就考虑用自定义编辑器来实现。
自定义类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
确实方便了很多。
网友评论