选自过去1~2周 自己所看到外文内容:https://twitter.com/unity3d 和各种其他博客来源吧
1、 在Unity中 使用 IronPython
https://qiita.com/syutotyou/items/bd9f9a74a054934277c1
环境:
windows10
unity 2018.2.14f1
IronPython 2.7.9
在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 的注册数。
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 (