❤❤Fungus新課程即將發布,快寫問卷拿優惠❤❤

2016年9月13日 星期二

Unity C# 程式心得分享 Custom Inspector 自訂檢視器 多個物件啟動關閉或改透明度




使用情境/需求:
(建議看影片比較好懂…)
編輯的時候希望看到全部的物件,正式玩遊戲的時候又希望關掉某些物件一開始不要啟動。同時這些物件若啟動之後會有圖片漸漸浮現的效果,所以這些正式玩遊戲時要關掉的物件同時也要改成全透明

效果

一鍵切換數個物件為透明與關閉狀態
一鍵切換數個物件為實色與啟動狀態
一鍵在場景裡選取數個物件,可以統一修改

為什麼需要自訂檢視器?
能躺著的話幹嘛要站著呢
省時間,省麻煩,加速開發時程

如何自訂檢視器
a.一個繼承自monobehaviour的c#腳本
b.還有繼承自Editor的c#腳本,同時要放在指名為Editor資料夾裡

快速鍵
Array的項目欄位可以按Shift+Delete 清空或刪除


Selector.cs (放在某個game object底下)


using UnityEngine;
using System.Collections;
using UnityEditor;

public class Selector : MonoBehaviour
    {
    public string 註解 = "註解";
    public GameObject [ ] 遊戲物件清單;

    public void 開啟物件 ( GameObject 項目 )
        {
        項目.SetActive ( true );
        }
    public void 開啟物件 ( GameObject [ ] 遊戲物件清單 )
        {
        foreach ( var 項目 in 遊戲物件清單 )
            {
            if ( 項目 != null )
                {
                開啟物件 ( 項目 );
                }
            }
        }

    public void 關閉物件 ( GameObject 項目 )
        {
        項目.SetActive ( false );
        }
    public void 關閉物件 ( GameObject [ ] 遊戲物件清單 )
        {
        foreach ( var 項目 in 遊戲物件清單 )
            {
            if ( 項目 != null )
                {
                關閉物件 ( 項目 );
                }
            }
        }

    public void 修改透明度 ( GameObject 項目 , float 透明度 )
        {
        SpriteRenderer 顏色渲染器 = 項目.GetComponent<SpriteRenderer> ( );
        Color 顏色 = 顏色渲染器.color;
        顏色.a = 透明度;
        顏色渲染器.color = 顏色;
        }

    public void 改透明 ( GameObject 項目 )
        {
        修改透明度 ( 項目 , 0 );
        }
    public void 改透明 ( GameObject [ ] 遊戲物件清單 )
        {
        foreach ( var 項目 in 遊戲物件清單 )
            {
            if ( 項目 != null )
                {
                改透明 ( 項目 );
                }
            }
        }

    public void 改實色 ( GameObject 項目 )
        {
        修改透明度 ( 項目 , 1 );
        }
    public void 改實色 ( GameObject [ ] 遊戲物件清單 )
        {
        foreach ( var 項目 in 遊戲物件清單 )
            {
            if ( 項目 != null )
                {
                改實色 ( 項目 );
                }
            }
        }

    public static void 選擇場景內物件 ( GameObject [ ] 遊戲物件清單 )
        {
        Selection.objects = 遊戲物件清單;
        }

    }


=======================
SelectorEditor.cs (要放到Editor資料夾裡, 不用放在某個game object底下)
using UnityEngine;
using System.Collections;
using UnityEditor;

[CustomEditor(typeof(Selector))]
public class SelectorEditor : Editor {
    public override void OnInspectorGUI ( )
        {
        Selector selector = ( Selector )target;
        DrawDefaultInspector();

        EditorGUILayout.BeginHorizontal();
        if ( GUILayout.Button("透明+關閉") )
            {
            selector.改透明 ( selector.遊戲物件清單);
            selector.關閉物件 ( selector.遊戲物件清單 );
            }
        if ( GUILayout.Button ( "實色+啟動" ) )
            {
            selector.改實色 ( selector.遊戲物件清單 );
            selector.開啟物件 ( selector.遊戲物件清單 );
            }
        EditorGUILayout.EndHorizontal ( );

        if ( GUILayout.Button("選擇以上物件") )
            {
            Selector.選擇場景內物件 ( selector.遊戲物件清單 );
            }

        }

    }

=======================
影片縮圖的素材:Designed by Freepik


沒有留言:

張貼留言

留言給作者加油打氣