- 有時(shí)候需要我們快速的配置一些參數(shù),但是又不用編寫代碼归园,這個(gè)時(shí)候就考慮用自定義編輯器來實(shí)現(xiàn)。
自定義類GUIEditor 繼承Editor
using UnityEditor;
public class GUIEditor : Editor
{
//定義你需要的參數(shù)
//初始化
void OnEnable()
{
}
}
重寫OnInspectorGUI方法芬位。
public override void OnInspectorGUI()
{
}
如何實(shí)現(xiàn)測(cè)試版本和Release版本間切換
- 利用上面講的方法凿渊,可以實(shí)現(xiàn)一個(gè)編輯器中控制測(cè)試版本和正式發(fā)布版本間參數(shù)的配置,我這里寫了三個(gè)版本的切換:Debug挫鸽,Tester说敏,Release。
首先還是寫一個(gè)自定義Editor:
using UnityEditor;
[CustomEditor(typeof(TestManager))]
public class GUIEditor : Editor
{
//序列化
private SerializedObject test;
//各個(gè)公開變量
private SerializedProperty _testMode, purchasingAlwaysSuccess, useTestAD, usePurchase, useServerConfig, shortenTime, passAD;
void OnEnable()
{
//獲取到相關(guān)對(duì)象
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
//各個(gè)模式下均公開的變量
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();//應(yīng)用
}
}
- 序列化SerializedObject丢郊,定義一個(gè)全局變量test盔沫。
- 各個(gè)公開變量,表示當(dāng)前模式下分別的值枫匾。
- OnInspectorGUI中根據(jù)test的mode更新SerializedObject對(duì)象中的值架诞。
- enumValueIndex=0 表示此mode下才顯示以下配置的值。
頂部注意要寫
[CustomEditor(typeof(TestManager))]
這里的TestManager就是控制當(dāng)前版本參數(shù)值的類干茉,有這行代碼谴忧,在Manager類才能獲取到對(duì)應(yīng)的編輯器的值。
using System;
using UnityEngine;
public class TestManager : MonoBehaviour
{
[HideInInspector]
[SerializeField, Tooltip("當(dāng)前項(xiàng)目模式")]
public TEST_MODE mode;
[HideInInspector]
[SerializeField, Tooltip("是否直接內(nèi)購成功")]
public bool purchasingAlwaysSuccess;
[HideInInspector]
[SerializeField, Tooltip("是否使用測(cè)試廣告ID")]
public bool useTestAD;
[HideInInspector]
[SerializeField, Tooltip("是否使用內(nèi)購板塊")]
public bool usePurchase;
[HideInInspector]
[SerializeField, Tooltip("是否使用服務(wù)器配置")]
public bool useServerConfig;
[HideInInspector]
[SerializeField, Tooltip("是否縮短時(shí)長(zhǎng)")]
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,//可配置開關(guān)角虫,報(bào)活和事件統(tǒng)計(jì)只會(huì)記錄原始日志沾谓,不會(huì)計(jì)入報(bào)表。
Tester,//開關(guān)固定:隱藏測(cè)試按鈕戳鹅,使用測(cè)試廣告ID均驶,啟用內(nèi)購(可直接購買產(chǎn)品成功),不使用服務(wù)器配置參數(shù)枫虏,報(bào)活和事件統(tǒng)計(jì)只會(huì)記錄原始日志妇穴,不會(huì)計(jì)入報(bào)表爬虱。
Release//開關(guān)固定:隱藏測(cè)試按鈕,使用正式廣告ID腾它,啟用內(nèi)購(IAP流程)跑筝,使用服務(wù)器配置參數(shù)。
}
/// <summary>
/// 是否展示測(cè)試按鈕
/// </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>
/// 是否使用測(cè)試廣告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>
/// 是否啟用內(nèi)購
/// </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>
/// 是否使用服務(wù)器配置參數(shù)
/// </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驗(yàn)證直接內(nèi)購成功
/// </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>
/// 當(dāng)前是否為正式打包模式
/// </summary>
/// <returns></returns>
public bool isReleaseMode()
{
return mode.Equals(TEST_MODE.Release);
}
/// <summary>
/// 當(dāng)前是否為測(cè)試模式
/// </summary>
/// <returns></returns>
public bool isTesterMode()
{
return mode.Equals(TEST_MODE.Tester);
}
}
關(guān)鍵字HideInInspector瞒滴,在編輯器隱藏該選項(xiàng)继蜡,也就是當(dāng)你需要編輯器直接編輯的時(shí)候控制顯示,我在enumValueIndex=0 時(shí)才讓用戶外部可配置參數(shù)逛腿。
每個(gè)參數(shù)含義:
- mode稀并,當(dāng)前項(xiàng)目模式;
- purchasingAlwaysSuccess单默,是否直接內(nèi)購成功碘举;
- useTestAD,是否使用測(cè)試廣告ID搁廓;
- usePurchase引颈,是否使用內(nèi)購板塊;
- useServerConfig境蜕,是否使用服務(wù)器配置蝙场;
- shortenTime,是否縮短實(shí)際時(shí)長(zhǎng)粱年;
- passAD售滤,是否直接跳過廣告;
最終編輯器中顯示:
確實(shí)方便了很多台诗。