Unity3d 周分享(15期 2019.4.14 )

这篇博客汇总了近期关于Unity3d的多个技术要点,包括在Unity中使用IronPython,获取LayerMask中的GameObject,隔行扫描加速绘图的技巧,以及Unity中类和结构实例化时的GC分配区别。此外,还讨论了Unity的Unit测试变化、获取静态事件注册数的方法、垃圾回收机制,以及如何优化游戏性能,如缓存组件、使用内联分析工具和避免不必要的内存分配。最后,分享了一些Unity的新工具,如Heap Allocations Viewer,以及游戏引擎和编程学习资源。
摘要由CSDN通过智能技术生成

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

 

1、 在Unity中 使用 IronPython

https://qiita.com/syutotyou/items/bd9f9a74a054934277c1

环境:

windows10

unity 2018.2.14f1

IronPython 2.7.9

https://ironpython.net/

在Unity项目中导入 在/ IronPython 2.7 / Platforms / Net35 下的

IronPython.dll

IronPython.Modules.dll

Microsoft.Dinamic.dll

Microsoft.Scripting.dll

Microsoft.Scripting.Core.dll

Microsoft.Scripting.Metadata.dll

到Unity 项目的 : Assets / Plugins 下, 然后就可以使用测试了。

 

 

2、 获取当前属于LayerMask (layer的集合)中的GameObject

    public static GameObject[] FindGameObjectsWithLayerMask(LayerMask layerMask)
    {
        GameObject[] goArray = GameObject.FindObjectsOfType<GameObject>();
        List<GameObject> goList = new List<GameObject>();
        foreach (GameObject go in goArray) {
            // LayerMask bit check
            if (((1 << go.layer) & layerMask.value) != 0) {
                goList.Add(go);
            }
        }
        if (goList.Count == 0) {
            return null;
        }
        return goList.ToArray();
    }

 

3、 使用隔行扫描加速绘图

曾经有一种称为交错的技术。 一种提高FPS的技术。

https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%AC%E3%83%BC%E3 %82%B9

https://qiita.com/drfters/items/3c4a06619950fa1218ae

它真的加速了吗?

以2688x1242分辨率 且应用后处理效果。

  • 没有开启交错,它是22 FPS。
  • 通过开启交错,它是46 FPS。

 

 

4、 [Unity]在实例化类和结构时GC Alloc的区别

using UnityEngine;
using UnityEngine.Profiling;

public class Example : MonoBehaviour
{
    public class Hoge { }
    public struct Fuga { }
    private void Start()
    {
        var count = 1000000;
        var samplerA = CustomSampler.Create( "AAAAAAAAAAAAAAAAAAAA" );
        samplerA.Begin();
        for ( int i = 0; i < count; i++ )
        {
            new Hoge();
        }
        samplerA.End();
        var samplerB = CustomSampler.Create( "BBBBBBBBBBBBBBBBBBBB" );
        samplerB.Begin();
        for ( int i = 0; i < count; i++ )
        {
            new Fuga();
        }
        samplerB.End();
    }
}

如果我们创建1,000,000 个Hoge类和Fuga结构的实例

 

 

 

 

 

5、 [Unity]获取游戏对象根路径的扩展方法

using UnityEngine;
public static class GameObjectExt
{
    private static string GetRootPath( this GameObject gameObject )
    {
        var path = gameObject.name;
        var parent = gameObject.transform.parent;
        while ( parent != null )
        {
            path = parent.name + "/" + path;
            parent = parent.parent;
        }
        return path;
    }
}
using UnityEngine;
public class Test : MonoBehaviour
{
    private void Awake()
    {
        Debug.Log( gameObject.GetRootPath() );
    }
}

         我要说的是其实Unity存在这个API, (我没有测试他们之间的性能, 感兴趣的可以试一试)

AnimationUtility.CalculateTransformPath

 

6、 [Unity]编辑器扩展,使Unity编辑器无法播放

using UnityEditor;
[InitializeOnLoad]
public static class Example
{
    static Example()
    {
        EditorApplication.playModeStateChanged += OnChange;
    }
    private static void OnChange( PlayModeStateChange state )
    {
        if ( state == PlayModeStateChange.ExitingEditMode )
        {
            EditorApplication.isPlaying = false;
        }
    }
}

有什么用? 可以在Play之前做一些检查, 就行如果C#有编译报错Unity就无法Play一样。 如下检查示例,

 

[Unity]一个编辑器扩展,如果在Inspector中没有设置引用的项目,则阻止编辑器播放。

您可以通过将以上脚本添加到Unity项目的“Editor”文件夹中来使用它。

using JetBrains.Annotations;
using UnityEngine;
public class Test : MonoBehaviour
{
    [NotNull] public Sprite m_sprite;  // 例如,应用NotNull属性的变量
}

using Sirenix.OdinInspector;
using UnityEngine;
public class Test : MonoBehaviour
{
    [Required] public Sprite m_sprite;  // 对于应用了Odin的Required属性的变量
}

 

 

 

7、 Unity单元测试的变更 :

《Unity 2018单元测试 》 https://www.nowsprinting.com/entry/2019/04/01/000000

, 菜单变化, Assembly Definition变化, 是否Play模式的变化。 程序集依赖变化等。

《如果您不能从Unity中的测试代码引用您自己的类,该怎么办?》: https://qiita.com/kazukomati/items/d5f5bec204ce99ee7ad5

 

 

 

 

8、 如何获取一个static event 的注册数。

https://stackoverflow.com/questions/24003458/how-to-easilly-see-number-of-event-subscriptions-while-debugging

using System;
using System.Reflection;

public static class DelegateExt
{
    public static int GetLength<T>( string name )
    {
        return GetLength( typeof( T ), name );
    }

    public static int GetLength( this Type self, string name )
    {
        var attrs =
            BindingFlags.GetField   |
            BindingFlags.Static     |
            BindingFlags.NonPublic  |
            BindingFlags.Public
        ;
        var field = self.GetField( name, attrs );
        if ( field == null )
        {
            throw new ArgumentException( $"name is invalid parameter: {name}" );
        }
        var d = field.GetValue( null ) as Delegate;
        if ( d == null ) return 0;
        var list = d.GetInvocationList();
        if ( 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值