Unity3d 周分享(17期 2019.5.18 )

选自过去1~2周 自己所看到外文内容:https://twitter.com/unity3d 和各种其他博客来源吧

1、 [Unity]介绍可以在游戏画面上显示FPS,内存,音频,设备信息的“Graphy”

https://github.com/Tayx94/graphy

 

2、 [Unity]编辑器扩展,可以轻松选择重叠的uGUI对象

当有很多UI, 特别是UI重叠的时候, 点选特别麻烦!

 

在“Scene”视图中单击鼠标右键,

从上下文菜单中选择鼠标光标位置上存在的所有uGUI对象

 

using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
using UnityEngine.SceneManagement;

[InitializeOnLoad]
public static class SceneViewContextMenu
{
    private static Vector3[] corners = new Vector3[ 4 ];

    static SceneViewContextMenu()
    {
        SceneView.onSceneGUIDelegate += OnSceneGUI;
    }

    private static void OnSceneGUI( SceneView sceneView )
    {
        var e = Event.current;

        if ( e == null ) return;
        if ( e.type != EventType.MouseUp ) return;
        if ( e.button != 1 ) return;

        e.Use();

        ShowSpriteSelectionMenu( e.mousePosition );
    }

    private static void ShowSpriteSelectionMenu( Vector2 screenPos )
    {
        var groups = SceneViewRaycast( screenPos )
            .GroupBy( c => c.gameObject.scene.name )
            .ToArray()
        ;

        var isOneScene = GetAllScenes().Count( c => c.isLoaded ) <= 1;

        var menu = new GenericMenu();

        var nameTable = new Dictionary<string, int>();

        foreach ( var group in groups )
        {
            foreach ( var n in group )
            {
                var name = n.name;
                var sceneName = n.gameObject.scene.name;
                var nameWithSceneName = sceneName + "/" + name;
                var isSameName = nameTable.ContainsKey( nameWithSceneName );
                var text = isOneScene ? name : nameWithSceneName;
                if ( isSameName )
                {
                    var count = nameTable[ nameWithSceneName ]++;
                    text += " [" + count.ToString() + "]";
                }
                var content = new GUIContent( text );
                menu.AddItem( content, false, () => OnSelect( n ) );
                if ( !isSameName )
                {
                    nameTable.Add( nameWithSceneName, 1 );
                }
            }
        }
        menu.ShowAsContext();
    }

    private static void OnSelect( RectTransform rectTransform )
    {
        Selection.activeTransform = rectTransform;
        EditorGUIUtility.PingObject( rectTransform );
    }

    private static IEnumerable<RectTransform> SceneViewRaycast( Vector2 mousePos )
    {
        return GetAllScenes()
            .Where( c => c.isLoaded )
            .SelectMany( c => c.GetRootGameObjects() )
            .Where( c => c.activeInHierarchy )
            .SelectMany( c => c.GetComponentsInChildren<RectTransform>() )
            .Where( c =>
            {
                c.GetWorldCorners( corners );
                return NGUIEditorTools.SceneViewDistanceToRectangle( corners, mousePos ) == 0;
            } )
        ;
    }

    private static IEnumerable<Scene> GetAllScenes()
    {
        for ( int i = 0; i < SceneManager.sceneCount; i++ )
        {
            yield return SceneManager.GetSceneAt( i );
        }
    }
}


https://qiita.com/kyubuns/items/f10ae5c0de29d715a23b

 

3、 通过向Unity项目引入“unity-toolbar-extender”

,您可以在Unity编辑器顶部的播放按钮的两侧放置按钮。

https://github.com/marijnz/unity-toolbar-extender

 

using ToolbarExtender;
using UnityEditor;
using UnityEngine;

[InitializeOnLoad]
public class LeftButtonToolbarWindow : ExtendedToolbarWindow
{
    static LeftButtonToolbarWindow()
    {
        RegisterToolbarWindow<LeftButtonToolbarWindow>( -90, 35 );
    }

    protected override void OnGUI()
    {
        base.OnGUI();

        var rect = new Rect( 0, 0, position.width, position.height );
        rect.y = 4;

        if ( GUI.Button( rect, "1", Styles.commandButtonStyle ) )
        {
            // ...
        }
    }
}

[InitializeOnLoad]
public class RightButtonToolbarWindow : ExtendedToolbarWindow
{
    static RightButtonToolbarWindow()
    {
        RegisterToolbarWindow<RightButtonToolbarWindow>( 90, 35 );
    }

    protected override void OnGUI()
    {
        base.OnGUI();

        var rect = new Rect( 0, 0, position.width, position.height );
        rect.y = 4;

        if ( GUI.Button( rect, "2", Styles.commandButtonStyle ) )
        {
            // ...
        }
    }
}


	[InitializeOnLoad]
	public class SceneSwitchLeftButton
	{
		static SceneSwitchLeftButton()
		{
			ToolbarExtender.LeftToolbarGUI.Add(OnToolbarGUI);
		}

		static void OnToolbarGUI()
		{
			GUILayout.FlexibleSpace();

			if(GUILayout.Button(new GUIContent("1", "Start Scene 1"), ToolbarStyles.commandButtonStyle))
			{
				SceneHelper.StartScene("Assets/ToolbarExtender/Example/Scenes/Scene1.unity");
			}

			if(GUILayout.Button(new GUIContent("2", "Start Scene 2"), ToolbarStyles.commandButtonStyle))
			{
				SceneHelper.StartScene("Assets/ToolbarExtender/Example/Scenes/Scene2.unity");
			}
		}
	}


添加buttons,添加sliders,toggles等。请注意,由于代码依赖于反射来访问Unity的内部代码,所以这很麻烦。 使用新的Unity更新可能无法再使用它。

 

当前的解决方案由https://github.com/OndrejPetrzilka完成,并使用Unity的新UIElements代码和反射来连接工具栏的OnGUI回调。

 

 

4、 Unity WebGL透明(显示HTML背景)

https://qiita.com/kumatta_ss/items/b89b03d7b4892ec3c93f

参考站点等

为WebGL输出创建模板

复制模板

将以下目录中的「Default」拷贝到项目中 更改为「Test」

※默认值应安装在“C:\ Program Files”下

Unity\Hub\Editor\2018.3.5f1\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\WebGLTemplates

编辑“index.html”以显示确认

将以下内容添加到“index.html”

<style> body { background-color: #D0D0D0;} </style>

 

覆盖Unity的alpha缓冲区处理

在“Plugins”中创建名为“clear.jslib”的文件

var LibraryGLClear = {
    glClear: function(mask)
    {
        if (mask == 0x00004000)
        {
            var v = GLctx.getParameter(GLctx.COLOR_WRITEMASK);
            if (!v[0] && !v[1] && !v[2] && v[3])
                // We are trying to clear alpha only -- skip.
                return;
        }
        GLctx.clear(mask);
    }
};
mergeInto(LibraryManager.library, LibraryGLClear); 

更改构建模板

在“Player Settings ”中

在“Inspector”选项卡的“Respect and Presentation-> WebGL Template”中,选择上面创建的模板“Test”

构建完成之后查看:

 

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值