找回密碼
 注冊帳號

掃一掃,訪問微社區

入門教程 Unity3D 在Inspector中預覽場景

5
回復
306
查看
打印 上一主題 下一主題
[ 復制鏈接 ]
排名
48141
昨日變化

6

主題

6

帖子

34

積分

Rank: 1

UID
329175
好友
0
蠻牛幣
84
威望
0
注冊時間
2019-8-12
在線時間
18 小時
最后登錄
2019-9-18

馬上注冊,結交更多好友,享用更多功能,讓你輕松玩轉社區。

您需要 登錄 才可以下載或查看,沒有帳號?注冊帳號

x
本帖最后由 UnityAsk 于 2019-8-13 23:02 編輯

在Project窗口中點擊模型,可以在Preview窗口中進行預覽(見下圖),但是場景卻不能預覽。當項目中有比較多的場景,而場景中內容多的時候,我們需要雙擊每一個打開它才能查看內容,比較耗時。


今天我們來實現一下類似3D物體預覽的 場景預覽。
當單擊場景的時候,可以直接快速的在Inspector中顯示他們的內容。
效果如下:



創建一個ScenePreview.cs文件,將下面代碼復制進去。完整代碼如下:

[C#] 純文本查看 復制代碼
using System.IO;
using UnityEngine;
using UnityEditor;
using UnityEngine.SceneManagement;
using System.Linq;

[CustomEditor(typeof(SceneAsset))]
[CanEditMultipleObjects]
public class ScenePreview : Editor
{
    const string PreviewFolders = "_scenes"; //你可以修改為你自己的路徑,用來存放場景縮略圖
    static bool _shouldRefreshDatabase;

    [RuntimeInitializeOnLoadMethod]
    public static void CaptureScreenshot()
    {
        var previewPath = GetPreviewPath(SceneManager.GetActiveScene().name);
        var dir = Path.GetDirectoryName(previewPath);
        if (!Directory.Exists(dir))
        {
            Directory.CreateDirectory(dir);
        }

        Debug.LogFormat("Saving scene preview at {0}", previewPath);
        ScreenCapture.CaptureScreenshot(previewPath);
        Debug.LogFormat("Scene preview saved at {0}", previewPath);

        _shouldRefreshDatabase = true;
    }

    public override void OnInspectorGUI()
    {        
        if (_shouldRefreshDatabase)
        {
            AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
            _shouldRefreshDatabase = false;
        }

        var sceneNames = targets.Select(t => ((SceneAsset)t).name).OrderBy(n => n).ToArray();

        var previewWidth = 200;
        var previewHeight = 200;

        for (int i = 0; i < sceneNames.Length; i++)
        {
            DrawPreview(i, sceneNames[i], previewWidth, previewHeight);
        }
    }

    void DrawPreview(int index, string sceneName, float width, float height)
    {
        var previewPath = GetPreviewPath(sceneName);
        var preview = Resources.Load(sceneName) as Texture;

        if (preview == null)
        {
            EditorGUILayout.HelpBox(string.Format(
                "還沒有場景{0}的預覽圖{1}. 請切換到這個場景然后點擊播放,會自動生成該場景的縮略圖",
                sceneName,
                previewPath),
                MessageType.Info);
        }
        else
        {
            GUILayout.Button(preview,GUILayout.Width(width),GUILayout.Height(height));
        }
    }

    static string GetPreviewPath(string sceneName)
    {
        return string.Format("{0}/{1}/Resources/{2}.png", Application.dataPath, PreviewFolders, sceneName);
    }
}


基本原理就是當運行一個場景的時候,給這個場景截一張圖,然后當選中時在Inspector中顯示截圖。

回復

使用道具 舉報

7日久生情
2320/5000
排名
4093
昨日變化

0

主題

1568

帖子

2320

積分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
254705
好友
1
蠻牛幣
2085
威望
0
注冊時間
2017-11-16
在線時間
390 小時
最后登錄
2019-10-16
沙發
2019-8-14 08:16:07 只看該作者
66666666666666666666666666
回復 支持 反對

使用道具 舉報

4四處流浪
424/500
排名
8155
昨日變化

1

主題

83

帖子

424

積分

Rank: 4

UID
77872
好友
0
蠻牛幣
179
威望
0
注冊時間
2015-6-20
在線時間
190 小時
最后登錄
2019-9-23
板凳
2019-8-14 10:02:07 只看該作者
66666666666666666666666
回復 支持 反對

使用道具 舉報

4四處流浪
313/500
排名
7737
昨日變化

0

主題

56

帖子

313

積分

Rank: 4

UID
178647
好友
0
蠻牛幣
200
威望
0
注冊時間
2016-10-28
在線時間
95 小時
最后登錄
2019-9-29
QQ
地板
2019-8-14 14:53:29 只看該作者
666666666666666666666666
回復 支持 反對

使用道具 舉報

7日久生情
2320/5000
排名
4093
昨日變化

0

主題

1568

帖子

2320

積分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
254705
好友
1
蠻牛幣
2085
威望
0
注冊時間
2017-11-16
在線時間
390 小時
最后登錄
2019-10-16
5#
2019-8-15 08:09:38 只看該作者
66666666666666666666666
回復 支持 反對

使用道具 舉報

3偶爾光臨
191/300
排名
48141
昨日變化

2

主題

47

帖子

191

積分

Rank: 3Rank: 3Rank: 3

UID
236359
好友
0
蠻牛幣
976
威望
0
注冊時間
2017-8-7
在線時間
138 小時
最后登錄
2019-9-29
6#
2019-8-19 17:04:08 只看該作者
66666666666666666666666
回復 支持 反對

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊帳號

本版積分規則

3d近3o期开机号和今天的试机号