文章目录

  • Attribute
  • RequiredAttribute
  • Tips
  • Debug.Log日志点击
  • 脚本改类名,同时修改文件名
  • 离开编辑模式,进入运行模式时,保存Scene和Assets
  • Unity多语言修改
  • 添加自定义HeaderGUI
  • OnValidata数据检查
  • 拖拽多个元素到 inspector


Attribute

RequiredAttribute

效果图如下:当引用类型的property为空时,使用红色提示。

Unity 植被风吹_Unity 植被风吹

代码如下:

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

Unity 植被风吹_拖拽_02

脚本改类名,同时修改文件名

Rider、VS使用快捷键Ctrl+R+R,弹出改名框

Unity 植被风吹_拖拽_03

离开编辑模式,进入运行模式时,保存Scene和Assets

Unity 植被风吹_Unity_04

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字段的提示内容。

Unity 植被风吹_UnityTips_05

然后我一查Editor脚本,https://github.com/Unity-Technologies/UnityCsReference/blob/2019.3/Editor/Mono/Inspector/AudioSourceInspector.cs

Unity 植被风吹_Unity 植被风吹_06

Unity 植被风吹_UnityAttribute_07

这写死了,,,怎么改。。。

后来群友提醒到Unity现在支持多语言,那就下载一个中文包看看。

Unity 植被风吹_Unity 植被风吹_08

中文包下载下来是上图中的一个.po文件

Unity 植被风吹_UnityTips_09

看样子是以一个msgid对应一个msgstr,msgid就是英文的内容,msgstr就是各语言的内容了。

接着找"Sets the overall volume of the sound."

Unity 植被风吹_拖拽_10

对应的中文内容就是上面了。。

那么.po文件自己修改后,重启Unity后就可以应用上去了。

测试以下:

msgstr “设置声音的整体音量。”

修改成

msgstr “设置声音的整体音量。(修改版)”

Unity 植被风吹_Unity_11

如上图,修改成功。

那么,回到那位群友的问题,如果只修改那个Volume的提示文本呢,很简单,把.po文件的其他内容都删掉,文件头的内容别删了,只留下这个msgid和msgstr,别的都id和str都删了,这样就实现了修改Volume的提示文本了。

如下图:

Unity 植被风吹_Unity_12

不过中文的.po文件 是用的 中文的字体,总之,看着就是别扭。。。

添加自定义HeaderGUI

官方链接说明

Unity 植被风吹_Unity 植被风吹_13

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数据检查

OnValidata官方文档介绍

在编辑器中可以使用 OnValidate() 对输入的数据进行检查。(仅编辑状态下有效)

using UnityEngine;
using System.Collections;
 
public class OnValidateExample : MonoBehaviour {
    public float validateTestValue;
 
    void OnValidate() {
        //Check validateTestValue
    }
}

拖拽多个元素到 inspector

可以拖拽元素直接加到 inspector 中去,但是选择多个元素的时候就不容易做到了,其实有一个方法,就是先锁定 inspector,就可以轻易的将多个元素(对象)拖拽到 inspector 中了。

以上知识分享,如有错误,欢迎指出,共同学习,共同进步。
本主题持续更新。。。