Attribute

RequiredAttribute

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

代码如下:

1、RequiredAttribute.cs

1
2
3
4
5
using UnityEngine;
public class RequiredAttribute : PropertyAttribute
{

}

2、RequiredDrawer.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

1
2
3
4
5
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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

官方链接说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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() 对输入的数据进行检查。(仅编辑状态下有效)

1
2
3
4
5
6
7
8
9
10
using UnityEngine;
using System.Collections;

public class OnValidateExample : MonoBehaviour {
public float validateTestValue;

void OnValidate() {
//Check validateTestValue
}
}

拖拽多个元素到 inspector

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

使用代码赋值androidSplashScreen

Unity没有提供直接的接口给这个赋值,以下提供几种方法,给它赋值。

  • 反射
  • 使用File.ReadAllText读取ProjectSettings.asset文件,替换掉androidSplashScreen: {fileID: 2800000, guid: 8d7f092f78c6bcb429a60803a22bf208, type: 3}其中的guid为自己图片的guid,然后保存即可
  • 加载ProjectSetting,使用SerializedProperty修改其androidSplashScreen.m_FileID的intValue。

第三种方法的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//加载图片,替换自己的图片路径
Texture2D tex = AssetDatabase.LoadAssetAtPath<Texture2D>("Assets/Logo/logo_default.png");
//加载ProjectSettings
const string projectSettings = "ProjectSettings/ProjectSettings.asset";
UnityEngine.Object obj = AssetDatabase.LoadAllAssetsAtPath(projectSettings)[0];
SerializedObject psObj = new SerializedObject(obj);
//获取到androidSplashScreen Property
SerializedProperty androidSplashFileId = psObj.FindProperty("androidSplashScreen.m_FileID");
if (androidSplashFileId != null)
{
androidSplashFileId.intValue = tex.GetInstanceID();
}
//保存修改
psObj.ApplyModifiedProperties();
AssetDatabase.SaveAssets();

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