选自过去1~2周 自己所看到外文内容:https://twitter.com/unity3d 和各种其他博客来源吧
csdn 的东西, 不想吐槽, 笔记的拷贝 还需要重新传图片, 代码排版等问题, 垃圾~
1、 看到 “Unity Asynchronous完全理解学习小组” 视频的笔记
参考视频和文章
异步处理的基础知识
特点
问题点
错误处理
2、 [Unity]我在iOS中将架构从Universal更改为ARM 64,并检查了可以减少多少Xcode构建时间
Architecture |
构建時間 |
任务数 |
Universal |
240 秒 |
291 |
ARM64 |
140 秒 |
161 |
*任务数量是Xcode顶部显示的数字
【Unity】我尝试通过减少Android上的Target Architectures来缩短构建时间
Architecture |
构建時間 |
ARMv7 + x86 |
55 秒 |
只有 ARMv7 |
71 秒 |
[Unity]我试着看看通过减少Android上的Target Architectures可以减少多少应用程序容量
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
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缺口终端上完成
注意 存在类似的问题: 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
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
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
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
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
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 ); } }
在第19行 "Debug" 部分 "Release" 总和 "ReleaseForProfiling" ,
"ReleaseForRunning"
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 ); } }
https://support.unity3d.com/hc/en-us/articles/207942813-How-can-I-disable-Bitcode-support-
10、 [Unity]一个脚本,可以计算包含指定文件夹中包含的所有文件的依赖关系的哈希值
https://gist.github.com/baba-s/6e4877f68514a96b7c5ce7b4c3852c8f#file-assetdirhashsample-cs
11、 [Unity]通过在iOS上禁用 加速度传感器 Accelerometer 来提高性能
https://docs.unity3d.com/Manual/iphone-iOS-Optimization.html
https://docs.unity3d.com/Manual/iphone-performance.html
12、 [Unity]“EditorUtility.CollectDependencies”,可以获取依赖于指定资产的所有资产
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
看上方模型的依赖: 您可以获得此模型作为数组所依赖的纹理,材质,脚本,着色器,网格等
比如我看一个Prefab 的 : GameObjects, Transform等组件的包含。 与 Assets -> Select Dependences 有区别
13、【Unity】如何通过编辑器扩展更改Lighting窗口中Baked Global Illumination的开/关
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() ); } }
类似的:
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会发生什么, 就是散图一张放不下, 被放到多张图集上了。
#1 中 和 #2 中是不会合并DC 的
[Unity]即使您使用的是Sprite Atlas,也不会在Frame Debugger中收集绘制调用
因为需要这个设置
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纹理
17、https://qiita.com/3yen/items/ca906b6dec38776d7293 Shader : 尝试实现光学伪装
18、【Unity】如何获取 Hierarchy 中存在的所有游戏对象
方法一、
using System.Linq; using UnityEngine; ... var list = Resources .FindObjectsOfTypeAll
在该方法中,可以获得所有游戏对象,但是
游戏对象的顺序将是无序的
方法2、
using System.Linq; using UnityEngine; ... var list = GameObject .FindObjectsOfType
在该方法中,当存在于根的游戏对象不活动(deactive)时,不能获取游戏对象和子对象,但是
子对象的顺序与层次结构中的顺序相同。
19、[Unity]介绍“SceneViewUIOverlay”,这是一个编辑器扩展,可以在Scene视图的左上角显示缩放系数 https://gist.github.com/aholkner/a4b500a23f56cbcdb4e451cdabfc313e#file-sceneviewuioverlay-cs 而且:
您现在可以在场景视图的左上角查看缩放系数、单击缩放系数将其重置为100%
20、[Unity] Unity 2019.2.0a6新功能, 可以在Editor.log中查看场景转换所用时间的细分
https://twitter.com/PeanutBuffer/status/1105460668340359173/photo/1
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.
21、 Shader Graph 如何制作飘动的巨龙
讲者:Kelvin Lo/达哥
LWRP + Shader Graph PBR ShaderGraph 着色器
22、 OpenGL本身是个状态机,可藉由呼叫函式来控制各种状态。话说OpenGL的pipeline真实版相当复杂,还有一些没用过的函式。
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));
}
}
加减法 快于 乘除法。 乘法快于除法 ~
位运算在有些时候 快于乘除法。
主要就是测试 !取反运算和 == 运算的比较。 还是有收获的
使用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();
是不是好无聊~~~~ 循环再大点
24、 ContextMenu 属性经常使用 但是 ContextMenuItem 都忘了。
可以在Inspector上的 字段上 右键 菜单中执行一个方法。
https://docs.unity3d.com/ScriptReference/ContextMenuItemAttribute.html
25、 一个Shader , 没有纹理实现如下动画:https://twitter.com/FreyaHolmer/status/1102990949024698368
这是一个圆形网格的例子 - 所有数学定义
•制作0到1范围的重复模式
•将其重新映射到-1到1范围
•读取该向量的长度
•重新映射以控制半径和清晰度
对于圆形排列的圆圈 - 事情变得有点复杂!
•获得片段角度
•圆角并将其转换为方向
•按组半径缩放 - 我们现在有最近的圆心
•获取从圆心到片段的距离
•重新映射
圆圈着色器代码 :
https://gist.github.com/FreyaHolmer/9f68fabca3f20170ce698569176970cb