文章目录
- Attribute
- RequiredAttribute
- Tips
- Debug.Log日志点击
- 脚本改类名,同时修改文件名
- 离开编辑模式,进入运行模式时,保存Scene和Assets
- Unity多语言修改
- 添加自定义HeaderGUI
- OnValidata数据检查
- 拖拽多个元素到 inspector
Attribute
RequiredAttribute
效果图如下:当引用类型的property为空时,使用红色提示。
代码如下:
1、RequiredAttribute.cs
using UnityEngine;
public class RequiredAttribute : PropertyAttribute
{
}
2、RequiredDrawer.cs
using UnityEditor;
using UnityEngine;
[CustomPropertyDrawer(typeof(RequiredAttribute))]
public class RequiredDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
Color c = GUI.backgroundColor;
if ((property.propertyType == SerializedPropertyType.ObjectReference || property.propertyType == SerializedPropertyType.ExposedReference) && property.objectReferenceValue == null)
{
GUI.backgroundColor = Color.red;
}
EditorGUI.PropertyField(position, property);
GUI.backgroundColor = c;
}
}
3、测试脚本RequiredAttributeDemo.cs
using UnityEngine;
public class RequiredAttributeDemo : MonoBehaviour
{
[Required] public Transform _transform;
}
Tips
Debug.Log日志点击
Debug.Log 官方文档介绍地址:https://docs.unity3d.com/ScriptReference/Debug.Log.html
脚本改类名,同时修改文件名
Rider、VS使用快捷键Ctrl+R+R,弹出改名框
离开编辑模式,进入运行模式时,保存Scene和Assets
using UnityEditor;
using UnityEditor.SceneManagement;
using UnityEngine;
[InitializeOnLoad]
public class AutoSave
{
static AutoSave()
{
EditorApplication.playModeStateChanged += SaveOnPlay;
}
private static void SaveOnPlay(PlayModeStateChange state)
{
if (state == PlayModeStateChange.ExitingEditMode)
{
Debug.Log("Exiting Edit Mode,Auto Save...");
EditorSceneManager.SaveOpenScenes();
AssetDatabase.SaveAssets();
}
}
}
Unity多语言修改
起因:群友想修改AudioSource组件的Inspector面板中Volume字段的提示内容。
然后我一查Editor脚本,https://github.com/Unity-Technologies/UnityCsReference/blob/2019.3/Editor/Mono/Inspector/AudioSourceInspector.cs
这写死了,,,怎么改。。。
后来群友提醒到Unity现在支持多语言,那就下载一个中文包看看。
中文包下载下来是上图中的一个.po文件
看样子是以一个msgid对应一个msgstr,msgid就是英文的内容,msgstr就是各语言的内容了。
接着找"Sets the overall volume of the sound."
对应的中文内容就是上面了。。
那么.po文件自己修改后,重启Unity后就可以应用上去了。
测试以下:
msgstr “设置声音的整体音量。”
修改成
msgstr “设置声音的整体音量。(修改版)”
如上图,修改成功。
那么,回到那位群友的问题,如果只修改那个Volume的提示文本呢,很简单,把.po文件的其他内容都删掉,文件头的内容别删了,只留下这个msgid和msgstr,别的都id和str都删了,这样就实现了修改Volume的提示文本了。
如下图:
不过中文的.po文件 是用的 中文的字体,总之,看着就是别扭。。。
添加自定义HeaderGUI
using UnityEditor;
[InitializeOnLoadAttribute]
static class EditorHeaderGUID
{
static EditorHeaderGUID()
{
Editor.finishedDefaultHeaderGUI += DisplayGUIDIfPersistent;
}
static void DisplayGUIDIfPersistent(Editor editor)
{
if (!EditorUtility.IsPersistent(editor.target))
return;
var guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(editor.target));
var totalRect = EditorGUILayout.GetControlRect();
var controlRect = EditorGUI.PrefixLabel(totalRect, EditorGUIUtility.TrTempContent("GUID"));
if (editor.targets.Length > 1)
EditorGUI.LabelField(controlRect, EditorGUIUtility.TrTempContent("[Multiple objects selected]"));
else
EditorGUI.SelectableLabel(controlRect, guid);
}
}
OnValidata数据检查
在编辑器中可以使用 OnValidate() 对输入的数据进行检查。(仅编辑状态下有效)
using UnityEngine;
using System.Collections;
public class OnValidateExample : MonoBehaviour {
public float validateTestValue;
void OnValidate() {
//Check validateTestValue
}
}
拖拽多个元素到 inspector
可以拖拽元素直接加到 inspector 中去,但是选择多个元素的时候就不容易做到了,其实有一个方法,就是先锁定 inspector,就可以轻易的将多个元素(对象)拖拽到 inspector 中了。
以上知识分享,如有错误,欢迎指出,共同学习,共同进步。
本主题持续更新。。。