1. 程式人生 > >Unity 編輯器擴充套件 場景檢視內控制物件

Unity 編輯器擴充套件 場景檢視內控制物件

using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(EnemySpawn))]
public class EnemySpawnEditor : Editor
{
    void OnSceneGUI()
    {
        EnemySpawn enemySpawn = target as EnemySpawn;
        Vector3 pos = enemySpawn.transform.position;

        // 計算4個角落
        Vector3 v0 = new Vector3(pos.x - enemySpawn.range / 2
, pos.y, pos.z - enemySpawn.range / 2);
        Vector3 v1 = new Vector3(pos.x + enemySpawn.range / 2, pos.y, pos.z + enemySpawn.range / 2);

        float y = v0.y;
        Vector3[] corners = new Vector3[4];
        corners[0] = new Vector3(v0.x, y, v0.z);
        corners[1] = new Vector3(v0.x, y, v1.z);
        corners[2
] = new Vector3(v1.x, y, v1.z);
        corners[3] = new Vector3(v1.x, y, v0.z);

        EditorGUI.BeginChangeCheck();
        float scaleValue = enemySpawn.range;
        float newRange = scaleValue;
        float sizeHandle = 1.0f;
        float realSize = sizeHandle * 0.1f; // 實際為0.15f,比它小才能更精確顯示滑鼠


        // 4個縮放值控制柄
        for (int i = 0; i < 4; ++i)
        {
            v0 = new Vector3(corners[i].x - realSize, y, corners[i].z - realSize);
            v1 = new Vector3(corners[i].x + realSize, y, corners[i].z + realSize);

            // 換算成GUI座標
            Vector2[] handles = new Vector2[4];
            handles[0] = HandleUtility.WorldToGUIPoint(new Vector3(v0.x, y, v0.z));
            handles[1] = HandleUtility.WorldToGUIPoint(new Vector3(v0.x, y, v1.z));
            handles[2] = HandleUtility.WorldToGUIPoint(new Vector3(v1.x, y, v1.z));
            handles[3] = HandleUtility.WorldToGUIPoint(new Vector3(v1.x, y, v0.z));

            Bounds b = new Bounds(handles[0], Vector3.zero);
            for (int j = 1; j < 4; ++j)
            {
                b.Encapsulate(handles[j]);
            }

            Vector2 min = b.min;
            Vector2 max = b.max;
            Rect rect = new Rect(min.x, min.y, max.x - min.x, max.y - min.y);

            // 除錯繪製是否計算正確
            Handles.BeginGUI();
            GUI.Box(rect, rect.ToString());
            Handles.EndGUI();

            // 是否滑鼠在控制柄上
            if (rect.Contains(Event.current.mousePosition))
            {
                // 顯示縮放圖示的箭頭
                EditorGUIUtility.AddCursorRect(rect, MouseCursor.ScaleArrow);
            }


            scaleValue = Handles.ScaleValueHandle(enemySpawn.range,
                        corners[i],
                        Quaternion.identity,
                        sizeHandle,
                        Handles.SphereCap,
                        1);
            newRange = scaleValue == enemySpawn.range ? newRange : scaleValue;

            Handles.Label(corners[i], i.ToString());
        }

        if (EditorGUI.EndChangeCheck())
        {
            // 記錄物件以便進行撤銷
            Undo.RecordObject(enemySpawn, "Change Range");
            enemySpawn.range = newRange;

            EditorUtility.SetDirty(target);
        }
    }
}

相關推薦

Unity 編輯擴充套件 場景檢視控制物件

using UnityEngine;using UnityEditor; [CustomEditor(typeof(EnemySpawn))]public class EnemySpawnEditor : Editor {     void OnSceneGUI()     {         EnemySp

unity編輯擴充套件#2 GUILayout、EditorGUILayout 控制元件整理

  GUILayout 裝飾類控制元件: GUILayout.FlexibleSpace(); GUILayout.Space(100);//空格,沒什麼好說的 GUILayout.Label("label"); GUILayout.Box(new GUICo

Unity編輯擴充套件(音效控制面板,路徑增刪)

using UnityEngine;using UnityEditor;using System.Collections.Generic;using System.Text;using System.IO;public class MusicWindowEditor : Ed

Unity 編輯擴充套件總結 一:編輯開發入門

編輯器擴充套件總結 工欲善其事必先利其器 引言: 在專案開發中,編輯器擴充套件為開發者提供了開發自定義工具的功能,讓開發者更加便利地使用編輯器開發專案。近期小生一直在學習編輯器擴充套件的知識,發現網路上關於編輯器知識點的部落格較為零散且混亂。當然,有一些大佬已經總結的很

unity編輯擴充套件#1 自定義視窗、面板、和屬性

擼一遍unity官方文件的給的三個案例:https://docs.unity3d.com/2017.4/Documentation/Manual/editor-EditorWindows.html 自定義視窗 首先,要注意和編輯器相關的指令碼都應該把放到Editor資料夾裡,可以有多個E

Unity編輯擴充套件:如何把asset 格式的資源轉成png

Assets Store 上提供了大量的優秀素材給開發者使用,包括模型貼圖UI音樂等等。但是一些上傳者可能出於特殊原因,上傳的素材格式是unity內建的.asset 格式,這樣的格式對於直接拿來在unity中使用的開發者當然沒有影響,但是遇到素材本身不是完全符合需求,需要做一些修

Unity編輯擴充套件:如何把圖集(Atlas)拆分成單個圖片

遊戲開發中可能會用到商店下載的圖集,但是如果只是用到一部分,卻把整個圖集打包到專案則明顯是不划算的。可以讓美術同事單獨把需要的圖片切出來,但是圖源比較多的話也是一個不小的工作。既然能夠拿到切好的圖集資料,是不是可以通過程式碼自動生成切好的小圖呢,答案當然是肯定的。這裡提供一個小工具,操作

Unity編輯擴充套件

(我們自己寫的指令碼放在 Editor檔案裡(Editor 自己建立 跟建立Scenes檔案一樣))1 增加簡單選單欄(第一排選單欄)(我們使用靜態方法便於呼叫     不用靜態方法   我們Unity不能顯示出來)public Class  Tools  {   [Menu

unity編輯 擴充套件之 快捷鍵寫法與意義

 using UnityEngine; using System.Collections; // using UnityEditor;<span style="white-space:pre"&

Unity編輯擴充套件-選單項

Unity編輯器允許你去新增像內建選單一樣外觀和行為的自定義選單。自定義選單對於那些經常使用的功能提供一種能從編輯器直接訪問的便捷方式。在這一課程中我將對每個描述的主題提供真實的使用示例,用於說明在unity中的選單項是如何建立和使用的。 新增選單項 為了要在頂層工具

Unity編輯擴充套件學習筆記(一)——新增選單選項

以前一直沒用到編輯器擴充套件這一塊,上一次用還是當初在培訓機構老師教編寫打包工具的時候,那時候剛接觸unity聽不大懂也不知道幹啥用。轉眼就過去了好久。 最近遇到一些情況,有時候需要修改多個GameObject身上的屬性,有時候需要按照規律建立多個GameObject,這些

Unity 編輯擴充套件

 Unity編輯器擴充套件 1 在工程目錄下新建 Editor 資料夾 Editor資料夾內的資源都不會被打包出去(包括PC 移動端等 只會在unity的編輯器模式執行)   //正常的新增選單欄     [MenuItem("Tools/test")]  

Unity 編輯擴充套件,讓開發更加快捷

      在unity開發中經常會對資源或者指令碼進行批量處理,開發自己的工具可以加快處理的速度。當然有的地方必須要用到編輯器類,例如資源打包的時候需要觸發,這時候就用到了。 1.MeuItam函式的使用,如下;當編輯器沒有你自定義的根選項時編輯器會新建一個選項,例如Too

Unity 編輯擴充套件教程

來自:candycat1992 http://blog.csdn.net/candycat1992/article/details/52067975 寫在前面 Unity最強大的地方之一是它擴充套件性非常強的編輯器。Unite Europe 20

Unity編輯擴充套件簡介】儲存資料

unity編輯器中有三種方式可以儲存資料。 EditorPrefs EditorPrefs可以在PC中儲存共享資料,即不受制於專案地儲存資訊 影響範圍 儲存的值會影響每一個大版本的Unity編輯器 以前儲存在Unity4.x的值只能在Unity 4

unity-編輯擴充套件

unity編輯器擴充套件很方便,可以省掉很多製作其他工具的時間(比如技能編輯器,特效編輯器等,都是資料結構的匯入匯出) 可以直接在 Scene 、Inspector 或者新建一個 Window 中編輯 1、Inspector

Unity - 編輯擴充套件

# 前言 對於Unity編輯器的擴充套件方法眾多,本文從最常用的一些方法入手,例如Inspector指令碼欄的擴充套件、頂選單欄的擴充套件等,圖文並茂闡述其完整用法。 本文大部分內容整理自 [獨立遊戲開發 - indienova](https://indienova.com/u/dev) 所著的 **Uni

unity編輯擴充套件學習

擴充套件編輯器實際上就是在unity選單欄中新增一些按鈕,可以一鍵執行一些重複性的工作。 一.新增按鈕 1.簡單使用MenuItem特性 using UnityEngine; using UnityEditor; public class Tools { [MenuItem("Tools/test

Unity編輯獲取資料夾下所有物件

有一次需要在Editor模式下獲取任意資料夾下的所有資源物件,包括子資料夾,我嘗試了AssetDatabase.LoadAllAssetsAtPath(string assetPath),理想中的Object[]沒有返回,而是給我返回了null;查閱google得知這個方法

Unity 編輯擴展 場景視圖控制對象

eight tex ons 圖標 ble enca 研究 microsoft 敵人 如果有一個敵人生成器類。當中有個屬性range用來表示敵人生成的範圍區域大小。那麽能夠用OnDrawGizmos函數來繪制它在場景視圖所代表的區域大小。便於開發調試。這個敵人生成器類,類