功能实现通过Annotation和AnnotationEditor两个脚本
// 添加到GameObject上的组件本身
public class Annotation : MonoBehaviour
{
public string content; // 存储注释内容
}
// 用于定义Annotation组件的Inspector显示内容
[CustomEditor(typeof(Annotation))]
public class AnnotationEditor : Editor
{
private bool isEditing = false;
private static readonly int btnWidth = 50; // 右侧按钮的宽度
public override void OnInspectorGUI()
{
Annotation annotation = (Annotation)target;
EditorGUILayout.BeginHorizontal(); // 进入水平布局
// 根据模式绘制不同内容
if (isEditing)
{
float height = EditorStyles.textArea.CalcHeight(new GUIContent(annotation.content), EditorGUIUtility.currentViewWidth - btnWidth); // 根据文字内容的“占地面积”获得textArea的高度
annotation.content = EditorGUILayout.TextArea(annotation.content, GUILayout.Height(height)); // 绘制TextArea,并将编辑的内容存回content
if (GUILayout.Button("Done", GUILayout.Width(btnWidth))) // 绘制“结束编辑”按钮,并注册点击按钮的回调
{
isEditing = false;
}
}
else
{
float height = EditorStyles.label.CalcHeight(new GUIContent(annotation.content), EditorGUIUtility.currentViewWidth - btnWidth);
EditorGUILayout.LabelField(annotation.content, GUILayout.Height(height)); // 绘制Label,并读出content中内容作为Label显示文本
if (GUILayout.Button("Edit",GUILayout.Width(btnWidth)))
{
isEditing = true;
}
}
EditorGUILayout.EndHorizontal();
}
}