找回密码
 注册帐号

扫一扫,访问微社区

入门教程 Unity3D 在Inspector中预览场景

5
回复
135
查看
[ 复制链接 ]
排名
48136
昨日变化

6

主题

6

帖子

29

积分

Rank: 1

UID
329175
好友
0
蛮牛币
78
威望
0
注册时间
2019-8-12
在线时间
13 小时
最后登录
2019-8-22
2019-8-13 22:48:46 显示全部楼层 阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 UnityAsk 于 2019-8-13 23:02 编辑

在Project窗口中点击模型,可以在Preview窗口中进行预览(见下图),但是场景却不能预览。当项目中有比较多的场景,而场景中内容多的时候,我们需要双击每一个打开它才能查看内容,比较耗时。

2432769-aef2129934ef9b69.png
今天我们来实现一下类似3D物体预览的 场景预览。
当单击场景的时候,可以直接快速的在Inspector中显示他们的内容。
效果如下:

2432769-fdd4083be72ed5ed1.gif

创建一个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中显示截图。
jianshu_unityask.jpg
回复

使用道具 举报

7日久生情
2132/5000
排名
4092
昨日变化

0

主题

1406

帖子

2132

积分

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

UID
254705
好友
1
蛮牛币
1933
威望
0
注册时间
2017-11-16
在线时间
364 小时
最后登录
2019-8-24
2019-8-14 08:16:07 显示全部楼层
66666666666666666666666666
回复 支持 反对

使用道具 举报

4四处流浪
419/500
排名
8155
昨日变化

1

主题

82

帖子

419

积分

Rank: 4

UID
77872
好友
0
蛮牛币
171
威望
0
注册时间
2015-6-20
在线时间
186 小时
最后登录
2019-8-23
2019-8-14 10:02:07 显示全部楼层
66666666666666666666666
回复 支持 反对

使用道具 举报

4四处流浪
309/500
排名
7737
昨日变化

0

主题

55

帖子

309

积分

Rank: 4

UID
178647
好友
0
蛮牛币
255
威望
0
注册时间
2016-10-28
在线时间
92 小时
最后登录
2019-8-14
QQ
2019-8-14 14:53:29 显示全部楼层
666666666666666666666666
回复 支持 反对

使用道具 举报

7日久生情
2132/5000
排名
4092
昨日变化

0

主题

1406

帖子

2132

积分

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

UID
254705
好友
1
蛮牛币
1933
威望
0
注册时间
2017-11-16
在线时间
364 小时
最后登录
2019-8-24
2019-8-15 08:09:38 显示全部楼层
66666666666666666666666
回复 支持 反对

使用道具 举报

3偶尔光临
170/300
排名
48136
昨日变化

2

主题

38

帖子

170

积分

Rank: 3Rank: 3Rank: 3

UID
236359
好友
0
蛮牛币
728
威望
0
注册时间
2017-8-7
在线时间
126 小时
最后登录
2019-8-23
5 天前 显示全部楼层
66666666666666666666666
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则