Unity3d 周分享(13期 2019.3.23 )

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

            csdn 的东西, 不想吐槽, 笔记的拷贝  还需要重新传图片,  代码排版等问题, 垃圾~

 

1、 看到 “Unity Asynchronous完全理解学习小组” 视频的笔记

参考视频和文章

  • 工作线程 - YouTube
  • 使用UniTask(UniRx.Async)在Unity中进行Deep Dive async / await - YouTube
  • 利用Observable进行异步处理 - YouTube
  • async / await如何工作 - YouTube
  • 关于内存节省和加速协议的新cc - Unity,或其在UniRx 5.3.0中的反映

异步处理的基础知识

特点

  • 处理不会立即返回结果
  • 您无需等待功能完成即可执行以下操作
  • 异步处理不一定是多线程的
  • 协同程序是单线程和异步的
  • 有并发执行和并行执行,同时CPU共享,每个CPU实现并行
  • 处理结束时发出消息
  • 收到邮件的收件人会做一些事情
  • 发出一条OnNext或Error消息

问题点

  • 处理执行结果
  • 串行/并行处理
  • 错误处理
  • 取消执行
  • 控制执行上下文(多线程控制)
  • 写愚蠢是无法控制的

错误处理

  • 将其发布在日志上并完成
  • 要重试
  • 回到另一个过程
  • 放弃处理
  • 抓住失败

 

 

 

2、 [Unity]我在iOS中将架构从Universal更改为ARM 64,并检查了可以减少多少Xcode构建时间

 

Unity3d 周分享(13期 2019.3.23 )_第1张图片

Architecture

构建時間

任务数

Universal

240 秒

291

ARM64

140 秒

161

*任务数量是Xcode顶部显示的数字

Unity3d 周分享(13期 2019.3.23 )_第2张图片

 

 

 

【Unity】我尝试通过减少Android上的Target Architectures来缩短构建时间

Unity3d 周分享(13期 2019.3.23 )_第3张图片

  • Unity版本:2018.3.7f1
  • 脚本编写后端:IL2CPP
  • 构建系统:Gradle
  • 使用空Unity项目进行验证

Architecture

构建時間

ARMv7 + x86

55 秒

只有 ARMv7

71 秒

 

 

 

[Unity]我试着看看通过减少Android上的Target Architectures可以减少多少应用程序容量

  • Unity版本:2018.3.7f1
  • 脚本编写后端:IL2CPP
  • 构建系统:Gradle
  • 使用空Unity项目进行验证

Architecture

容量

ARMv7 + x86

12.7 MB

只有 ARMv7

6.63 MB

 

 

 

 

 

 

 

3、 [Unity] “SpriteAtlasUtility.PackAllAtlases” 可以打包指定的SpriteAtlas

using UnityEditor; using UnityEditor.U2D; using UnityEngine.U2D; public static class Example { [MenuItem( "Tools/Hoge" )] private static void Hoge() { var path = "【SpriteAtlas的路径】"; var atlas = AssetDatabase.LoadAssetAtPath( path ); var atlases = new []{ atlas }; SpriteAtlasUtility.PackAtlases( atlases, BuildTarget.Android ); } }

https://docs.unity3d.com/2018.2/Documentation/ScriptReference/U2D.SpriteAtlasUtility.PackAtlases.html

 

[Unity]“SpriteAtlasUtility.PackAllAtlases”可以打包Unity项目中的所有SpriteAtlas

using UnityEditor; using UnityEditor.U2D; public static class Example { [MenuItem( "Tools/Hoge" )] private static void Hoge() { SpriteAtlasUtility.PackAllAtlases( BuildTarget.Android ); } }

https://docs.unity3d.com/2018.2/Documentation/ScriptReference/U2D.SpriteAtlasUtility.PackAllAtlases.html

 

 

 

4、 [Unity] Unity 2018.1 新功能在 iOS / Android 上使用 “GUIUtility.systemCopyBuffer”,可以将字符串复制到剪贴板

 

using UnityEngine; public class Example : MonoBehaviour { private void Awake() { GUIUtility.systemCopyBuffer = "皮卡丘"; } }

 

 

 

5、[Unity] Unity 2018.3新功能“Application.consoleLogPath”可以获取控制台日志的输出目标路径

using UnityEngine; public class Test : MonoBehaviour { private void Awake() {; Debug.Log( Application.consoleLogPath ); } }

平台

文字列

Windows编辑器

C:/Users/【用户名称】/AppData/Local/Unity/Editor/Editor.log

Android的

【空字符串】

iOS版

【空字符串】

https://docs.unity3d.com/2018.3/Documentation/ScriptReference/Application-consoleLogPath.html

 

 

 

 

6、 [Unity] Unity 2018.3新功能 “render outside safe area” 您可以设置安全区域外的绘图是否在Android缺口终端上完成

Unity3d 周分享(13期 2019.3.23 )_第4张图片

 

注意 存在类似的问题: https://issuetracker.unity3d.com/issues/android-render-outside-safe-area-setting-doesnt-work-with-portrait-or-landscape-orientation 由Unity 2019.2修正

 

参考: https://twitter.com/NishizakiMakoto/status/1077905123429347329/photo/1

Unity3d 周分享(13期 2019.3.23 )_第5张图片

 

 

 

 

7、 【Unity】我尝试创建一个函数来获取Android上外部缓存存储区的路径

UnityEngine.Application.temporaryCachePath

using UnityEngine; public static class AndroidUtils { public static string GetExternalCacheDir() { using ( var player = new AndroidJavaClass( "com.unity3d.player.UnityPlayer" ) ) using ( var activity = player.GetStatic( "currentActivity" ) ) using ( var file = activity.Call( "getExternalCacheDir" ) ) { if ( file == null ) return string.Empty; return file.Call( "getAbsolutePath" ); } } }

 

using UnityEngine; public class Test : MonoBehaviour { private void Awake() { Debug.Log( AndroidUtils.GetExternalCacheDir() ); } }

 

/ storage / emulated / 0 / Android / data / [包名] /cache

 

 

 

【Unity】我尝试创建一个函数来获取Android上外部数据存储区的路径

UnityEngine.Application.persistentDataPath

using UnityEngine; public static class AndroidUtils { public static string GetExternalFilesDir() { using ( var player = new AndroidJavaClass( "com.unity3d.player.UnityPlayer" ) ) using ( var activity = player.GetStatic( "currentActivity" ) ) using ( var file = activity.Call( "getExternalFilesDir", null ) ) { if ( file == null ) return string.Empty; return file.Call( "getAbsolutePath" ); } } }

 

using UnityEngine; public class Test : MonoBehaviour { private void Awake() { Debug.Log( AndroidUtils.GetExternalFilesDir() ); } }

 

/storage/emulated/0/Android/data/【包名】/files

 

 

 

[Unity]获取用户无法在Android上访问的内部数据存储区域的路径的功能

using UnityEngine; public static class AndroidUtils { public static string GetFileDir() { using ( var player = new AndroidJavaClass( "com.unity3d.player.UnityPlayer" ) ) using ( var activity = player.GetStatic( "currentActivity" ) ) using ( var file = activity.Call( "getFilesDir" ) ) { if ( file == null ) return string.Empty; return file.Call( "getAbsolutePath" ); } } }

using UnityEngine; public class Test : MonoBehaviour { private void Awake() { Debug.Log( AndroidUtils.GetFileDir() ); } }

 

 

/data/data/【包名】/files

/data/user/0/【包名】/files

 

 

[Unity]获取用户无法访问Android内部缓存存储区域的路径

using UnityEngine; public static class AndroidUtils { public static string GetCacheDir() { using ( var player = new AndroidJavaClass( "com.unity3d.player.UnityPlayer" ) ) using ( var activity = player.GetStatic( "currentActivity" ) ) using ( var file = activity.Call( "getCacheDir" ) ) { if ( file == null ) return string.Empty; return file.Call( "getAbsolutePath" ); } } }

using UnityEngine; public class Test : MonoBehaviour { private void Awake() { Debug.Log( AndroidUtils.GetCacheDir() ); } }

 

/data/data/【包名】/cache

/data/user/0/【包名】/cache

 

 

 

 

8、[Unity]编辑器扩展,在iOS构建之后将“DWARF”设置为Xcode项目的“调试信息格式”

using UnityEditor; using UnityEditor.Callbacks; using UnityEditor.iOS.Xcode; public static class Example { [PostProcessBuild] private static void OnPostProcessBuild( BuildTarget buildTarget, string path ) { if ( buildTarget != BuildTarget.iOS ) return; var projectPath = PBXProject.GetPBXProjectPath( path ); var project = new PBXProject(); project.ReadFromFile( projectPath ); var targetName = PBXProject.GetUnityTargetName(); var targetGuid = project.TargetGuidByName( targetName ); var configGuid = project.BuildConfigByName( targetGuid, "Debug" ); project.SetBuildPropertyForConfig( configGuid, "DEBUG_INFORMATION_FORMAT", "dwarf" ); project.WriteToFile( projectPath ); } }

Unity3d 周分享(13期 2019.3.23 )_第6张图片

  • 如果你把「Debug」设置为 「DWARF」等

在第19行 "Debug" 部分 "Release" 总和 "ReleaseForProfiling" ,

"ReleaseForRunning"

  • 如果有必要, 「DWARF with dSYM File」

 

https://forum.unity.com/threads/enable-dsym-through-onpostprocessbuild.415678/

 

 

 

 

9、 [Unity]在iOS构建编辑器 Xcode项目 关闭 “Enable Bitcode”

using UnityEditor; using UnityEditor.Callbacks; using UnityEditor.iOS.Xcode; public static class Example { [PostProcessBuild] private static void OnPostProcessBuild( BuildTarget buildTarget, string path ) { if ( buildTarget != BuildTarget.iOS ) return; var projectPath = PBXProject.GetPBXProjectPath( path ); var project = new PBXProject(); project.ReadFromFile( projectPath ); var target = project.TargetGuidByName( "Unity-iPhone" ); project.SetBuildProperty( target, "ENABLE_BITCODE", "NO" ); project.WriteToFile( projectPath ); } }

Unity3d 周分享(13期 2019.3.23 )_第7张图片

https://support.unity3d.com/hc/en-us/articles/207942813-How-can-I-disable-Bitcode-support-

 

 

 

 

10、 [Unity]一个脚本,可以计算包含指定文件夹中包含的所有文件的依赖关系的哈希值

Unity3d 周分享(13期 2019.3.23 )_第8张图片

https://gist.github.com/baba-s/6e4877f68514a96b7c5ce7b4c3852c8f#file-assetdirhashsample-cs

 

 

 

11、 [Unity]通过在iOS上禁用 加速度传感器 Accelerometer 来提高性能

Unity3d 周分享(13期 2019.3.23 )_第9张图片

https://docs.unity3d.com/Manual/iphone-iOS-Optimization.html

https://docs.unity3d.com/Manual/iphone-performance.html

 

 

 

 

12、 [Unity]“EditorUtility.CollectDependencies”,可以获取依赖于指定资产的所有资产

Unity3d 周分享(13期 2019.3.23 )_第10张图片

using UnityEditor; public static class Example { [MenuItem( "Tools/Hoge" )] private static void Hoge() { var objects = Selection.objects; var dependencies = EditorUtility.CollectDependencies( objects ); Selection.objects = dependencies; } }

https://docs.unity3d.com/2017.4/Documentation/ScriptReference/EditorUtility.CollectDependencies.html

 

看上方模型的依赖: 您可以获得此模型作为数组所依赖的纹理,材质,脚本,着色器,网格等

Unity3d 周分享(13期 2019.3.23 )_第11张图片

比如我看一个Prefab 的 : GameObjects, Transform等组件的包含。 与 Assets -> Select Dependences 有区别

Unity3d 周分享(13期 2019.3.23 )_第12张图片

 

 

 

 

13、【Unity】如何通过编辑器扩展更改Lighting窗口中Baked Global Illumination的开/关

Unity3d 周分享(13期 2019.3.23 )_第13张图片

using UnityEditor; using UnityEditor.SceneManagement; public static class Example { [MenuItem( "Tools/Hoge" )] private static void Hoge() { Lightmapping.bakedGI = !Lightmapping.bakedGI; // GI 设置取决于场景, 因此, 如果要保存所做的更改, 请编写如下所示的代码 // EditorSceneManager.SaveScene( EditorSceneManager.GetActiveScene() ); } }

类似的:

Unity3d 周分享(13期 2019.3.23 )_第14张图片

public static class Example { [MenuItem( "Tools/Hoge" )] private static void Hoge() { Lightmapping.realtimeGI = !Lightmapping.realtimeGI; // EditorSceneManager.SaveScene( EditorSceneManager.GetActiveScene() ); } }

 

 

 

 

14、 [Unity]如何在Windows上将Unity编辑器的Profiler连接到Android时检查要使用的IP地址

adb shell ip route

 

在Windows上将Unity编辑器的Profiler连接到Android并

通过从Profiler的“输入IP”指定IP地址连接到Android

我之前是到手机系统中, 设置中点击网络 信息, 查看具体的IP地址 。

XXX.XXX.XX / XX dev wlan0 proto内核范围链接src YYY.YYY.YY

在输出字符串的src之后使用IP地址

https://answers.unity.com/questions/1215054/unable-to-connect-profiler-to-android.html

 

 

 

15、 [Unity]如果要打包的精灵不适合Sprite Atlas会发生什么, 就是散图一张放不下, 被放到多张图集上了。

Unity3d 周分享(13期 2019.3.23 )_第15张图片

#1 中 和 #2 中是不会合并DC 的

Unity3d 周分享(13期 2019.3.23 )_第16张图片

 

 

[Unity]即使您使用的是Sprite Atlas,也不会在Frame Debugger中收集绘制调用

因为需要这个设置

Unity3d 周分享(13期 2019.3.23 )_第17张图片

Unity3d 周分享(13期 2019.3.23 )_第18张图片

 

 

 

 

 

16、 [Unity]移动设备支持的最大纹理尺寸 统计(2017年9月)

这个很有意义呀~~~~ 下面是2d游戏引擎论坛中的结论。

https://forum.defold.com/t/supporting-4096x4096-textures-on-different-devices/11683/14

https://webglstats.com/webgl/parameter/MAX_TEXTURE_SIZE

截至2017年9月,大多数移动终端

似乎支持4096 x 4096纹理

  • iOS:iPhone 4S或更高版本,支持iPad 2或更高版本
  • Android:支持98.4%的终端

Unity3d 周分享(13期 2019.3.23 )_第19张图片

 

17、https://qiita.com/3yen/items/ca906b6dec38776d7293 Shader : 尝试实现光学伪装

Unity3d 周分享(13期 2019.3.23 )_第20张图片

 

 

18、【Unity】如何获取 Hierarchy 中存在的所有游戏对象

方法一、

using System.Linq; using UnityEngine; ... var list = Resources .FindObjectsOfTypeAll() .Where( c => c.scene.isLoaded );

在该方法中,可以获得所有游戏对象,但是

游戏对象的顺序将是无序的

 

方法2、

using System.Linq; using UnityEngine; ... var list = GameObject .FindObjectsOfType() .Where( c => c.transform.parent == null ) .SelectMany( c => c.GetComponentsInChildren( true ) ) .Select( c => c.gameObject ) ;

在该方法中,当存在于根的游戏对象不活动(deactive)时,不能获取游戏对象和子对象,但是

子对象的顺序与层次结构中的顺序相同。

 

 

 

19、[Unity]介绍“SceneViewUIOverlay”,这是一个编辑器扩展,可以在Scene视图的左上角显示缩放系数 https://gist.github.com/aholkner/a4b500a23f56cbcdb4e451cdabfc313e#file-sceneviewuioverlay-cs 而且:

您现在可以在场景视图的左上角查看缩放系数、单击缩放系数将其重置为100%

Unity3d 周分享(13期 2019.3.23 )_第21张图片

 

20、[Unity] Unity 2019.2.0a6新功能, 可以在Editor.log中查看场景转换所用时间的细分

https://twitter.com/PeanutBuffer/status/1105460668340359173/photo/1

Unity3d 周分享(13期 2019.3.23 )_第22张图片

LightmapEditorSettings: switching bake backend from 1 to 0. Unloading 26 Unused Serialized files (Serialized files now loaded: 0) UnloadTime: 0.438500 ms Loaded scene 'Assets/Scenes/SampleScene 1.unity' Deserialize: 1.859 ms Integration: 12.342 ms Integration of assets: 0.002 ms Thread Wait Time: 23.432 ms Total Operation Time: 37.635 ms System memory in use before: 63.2 MB. System memory in use after: 63.3 MB.

Unity3d 周分享(13期 2019.3.23 )_第23张图片

 

 

 

 

21、 Shader Graph 如何制作飘动的巨龙

讲者:Kelvin Lo/达哥

LWRP + Shader Graph PBR ShaderGraph 着色器

Unity3d 周分享(13期 2019.3.23 )_第24张图片

 

22、 OpenGL本身是个状态机,可藉由呼叫函式来控制各种状态。话说OpenGL的pipeline真实版相当复杂,还有一些没用过的函式。

Unity3d 周分享(13期 2019.3.23 )_第25张图片

 

 

 

23、 本人做了一个无聊的实验“

class Program

{

private static System.Diagnostics.Stopwatch _stopWatch;

static void Main(string[] args)

{

bool testBool = true;

 

_stopWatch = System.Diagnostics.Stopwatch.StartNew();

for (int i = 0; i < 2000000000; i++)

{

testBool = !testBool;

}

_stopWatch.Stop();

Console.WriteLine(string.Format("?exec?time:?{0:0.000}?(ms)", ((double)_stopWatch.ElapsedTicks / (double)System.Diagnostics.Stopwatch.Frequency) * 1000));

 

_stopWatch = System.Diagnostics.Stopwatch.StartNew();

for (int i = 0; i < 2000000000; i++)

{

testBool = testBool == false;

}

 

_stopWatch.Stop();

Console.WriteLine(string.Format("exec?time:?{0:0.000}?(ms)", ((double)_stopWatch.ElapsedTicks / (double)System.Diagnostics.Stopwatch.Frequency) * 1000));

}

 

}

 

 

加减法 快于 乘除法。 乘法快于除法 ~

位运算在有些时候 快于乘除法。

主要就是测试 !取反运算和 == 运算的比较。 还是有收获的

Unity3d 周分享(13期 2019.3.23 )_第26张图片

 

使用Slua 同样做一个测试:

string luacode = @"

local testBool = true;

for i = 1 , 1000000, 1 do

testBool = not testBool;

end

";

string luacode2 = @"

local testBool = true;

for i = 1 , 1000000, 1 do

testBool = testBool == false;

end

";

UnityEngine.Profiling.Profiler.BeginSample(" test 1");

LuaEnv.luaState.doString(luacode);

UnityEngine.Profiling.Profiler.EndSample();

 

UnityEngine.Profiling.Profiler.BeginSample(" test 2");

LuaEnv.luaState.doString(luacode2);

UnityEngine.Profiling.Profiler.EndSample();

Unity3d 周分享(13期 2019.3.23 )_第27张图片

是不是好无聊~~~~ 循环再大点

Unity3d 周分享(13期 2019.3.23 )_第28张图片

 

 

 

 

 

24、 ContextMenu 属性经常使用 但是 ContextMenuItem 都忘了。

可以在Inspector上的 字段上 右键 菜单中执行一个方法。

https://docs.unity3d.com/ScriptReference/ContextMenuItemAttribute.html

Unity3d 周分享(13期 2019.3.23 )_第29张图片

 

 

 

 

 

25、 一个Shader , 没有纹理实现如下动画:https://twitter.com/FreyaHolmer/status/1102990949024698368

这是一个圆形网格的例子 - 所有数学定义

•制作0到1范围的重复模式

•将其重新映射到-1到1范围

•读取该向量的长度

•重新映射以控制半径和清晰度

Unity3d 周分享(13期 2019.3.23 )_第30张图片

 

对于圆形排列的圆圈 - 事情变得有点复杂!

•获得片段角度

•圆角并将其转换为方向

•按组半径缩放 - 我们现在有最近的圆心

•获取从圆心到片段的距离

•重新映射

Unity3d 周分享(13期 2019.3.23 )_第31张图片

圆圈着色器代码 :

https://gist.github.com/FreyaHolmer/9f68fabca3f20170ce698569176970cb

 

 

 

你可能感兴趣的:(学unity涨知识,unity3d,周分享)