基于Unity3D 编写简单的自定义组件


本文参考官方手册(https://docs.unity3d.com/ScriptReference/Editor.html),编写一个简单的自定义Component(组件),用自定义组件定义几种飞碟,编辑并赋予飞碟一些属性,做成预制

首先我们可以定义飞碟的一些共有的属性,脚本DiskData:

public class DiskData : MonoBehaviour
{
    public int score = 1;  // 射击命中得分
    public Color color = Color.white;  // 颜色
    public Vector3 direction;  // 初始的位置
    public Vector3 scale = new Vector3(1 ,0.25f ,1);  // 大小
}

我们把它绑定到飞碟上,在检查器中可以看到几项属性:

继续参考Unity的文档:https://docs.unity3d.com/cn/current/ScriptReference/Editor.html
可知需要我们新建一个继承Editor的脚本类MyDiskEditor,让我们有一个使用 IMGUI 和多重选择的自定义检视面板。如下:

using UnityEngine;
using UnityEditor;
using System.Collections;
[CustomEditor(typeof(DiskData))]
[CanEditMultipleObjects]
public class MyDEditor : Editor
{
    SerializedProperty score;  // 分数
    SerializedProperty color;  // 颜色
    SerializedProperty scale;  // 大小

    void OnEnable()
    {
        // 序列化属性
        score = serializedObject.FindProperty("score");
        color = serializedObject.FindProperty("color");
        scale = serializedObject.FindProperty("scale");
    }

    public override void OnInspectorGUI()
    {
        serializedObject.Update();  // 更新序列化属性
        EditorGUILayout.IntSlider(score, 0, 5, new GUIContent("score"));  // 分数
        if (!score.hasMultipleDifferentValues)
        {
            ProgressBar(score.intValue / 5f, "score");  // 进度条
        }
        EditorGUILayout.PropertyField(color);  // 颜色
        EditorGUILayout.PropertyField(scale);  // 大小
        serializedObject.ApplyModifiedProperties();  // 应用修改
    }
    private void ProgressBar(float value, string label)
    {
        Rect rect = GUILayoutUtility.GetRect(18, 18, "TextField");  // 进度条的位置
        EditorGUI.ProgressBar(rect, value, label);  // 进度条
        EditorGUILayout.Space();  // 空行
    }
}

然后我们制作5款不同的飞碟,它们的大小、颜色不同,击中后得分亦不同:

下面分别是第1个和第5个飞碟的情况:

本人的“3D游戏编程与设计”系列合集,请访问:
https://www.yizuodi.cn/category/3DGame/

声明:一座堤的博客|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 基于Unity3D 编写简单的自定义组件


为者常成 行者常至