Unity小记
Camera.Main问题
camera.main是个静态属性,用起来好用,但是其中内部使用的是
GameObject.FindGameObjectWithTag`
所以再Update或者经常使用这个函数的地方需要注意。
这个问题也直接导致了UGUI相关的耗时,在Canvas Renderer modes使用Screen Space-Camera
或者World Space
的时候如果要获取相机使用内部函数也会导致一些问题
1 | namespace UnityEngine.UI |
2021/12/19更新
官方2020.02版本更新了这个问题(不管他改不改 还是自己记录)
有史以来最快的Unity编辑器版本,Unity 2020.2 中的性能优化 (qq.com)
参考
- https://www.cnblogs.com/murongxiaopifu/p/7823487.html
- https://blog.csdn.net/cyf649669121/article/details/83661023
Unity中 ??
?.
的使用问题
??
是c#的一个语法糖,叫空合并运算符
,如果左边不为空返回左边,否则返回右边
例子a=b??c,如果b不为空,则a=b,否则a=c
在unity中我们可能这样使用
1 | T t=this.gameobject.GetComponent<T>()??this.gameobject.AddComponent<T>(); |
获取某个物体上面的Component,但是我们获取Unity中内置的组件的时候这个方法得到的结果是永远不会为null
比如我们获取一个物体上面的相机,假如这个物体上面没有添加相机组件
1 | var camera = GetComponent<Camera>() ?? gameObject.AddComponent<Camera>();//Camera组件不会被添加 |
原因是Unity底层是C++,而且C#源码??
?.
不能重载
总结:不要使用?? ?.
操作unity 对象
参考
UGUI 点击Bug
当UI中父物体实现了IPointerDownHandler接口,而子物体实行了IPointerClickHandler接口的时候 ,点击子物体时候不会触发 Click事件.
原因是UI源码中鼠标按下的时候会寻找实现了IPointerDownHandler
这个接口的物体,从子物体向上寻找,所以这里就找到了父物体,然后鼠标抬起,找到实现了Click接口的物体,然后通过判断两者是否一直来触发Click事件. 这里寻找到了父物体,而寻找到click物体是子物体,所以判断不一致无法触发
链接:https://www.cnblogs.com/msxh/p/10588783.html
http://www.sikiedu.com/course/468/task/35891/show
UnityWebRequest.UnEscapeURL和UnityWebRequest.EscapeURL
要想知道这两个参数是什么意思,需要理解Http中URL的特殊字符
Url参数中出现+、空格、=、%、&、#等字符的解决办法 - 云+社区 - 腾讯云 (tencent.com)
Url出现了有+,空格,/,?,%,#,&,=等特殊符号的时候,可能在服务器端无法获得正确的参数值,抑或是造成不能正常下载文件(作为Download Url时候),如何是好?解决办法:就是需要将这些字符转化成服务器可以识别的字符;但是为何Url中有这些字符就会出现问题呢?这就得涉及到URL编码与解码问题了
一般来说,URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。Url的编码格式采用的是ASCII码,而不是Unicode,这也就是说你不能在Url中包含任何非ASCII字符,例如希腊字母or中文。比如,世界上有英文字母的网址http://www.abc.com,但是没有希腊字母的网址http://www.aβγ.com(读作阿尔法-贝塔-伽玛.com)。这是因为网络标准RFC 1738做了硬性规定
*只有字母和数字[0-9a-zA-Z]、一些特殊符号”$-_.+!’(),”[不包括双引号]、以及某些保留字,才可以不经过编码直接用于URL。
URL中有汉字,等特殊字符的时候,就必须编码后使用。而+,空格,/,?,%,#,&,=,这些字符(不安全),当把他们直接放在Url中的时候,可能会引起解析程序的歧义,因此也必须经过编码才能使用
除了那些无法显示的字符外(例如中文),还需要在URL中对那些保留(reserved)字符和不安全(unsafe)字符进行编码。
保留字符
就是那些在URL中具有特定意义的字符。不安全字符
是指那些在URL中没有特殊含义,但在URL所在的上下文中可能具有特殊意义的字符。例如双引号(“”)
部分保留字符和不安全字符及其URL编码 | |||
---|---|---|---|
字符 | 描述 | 用法 | 编码 |
; | 分号 | 保留 | %3B |
/ | 斜线 | 保留 | %2F |
? | 问号 | 保留 | %3F |
: | 冒号 | 保留 | %3A |
@ | “at”符号 | 保留 | %4O |
= | 等号 | 保留 | %3D |
& | “和”符号 | 保留 | %26 |
< | 小于号 | 不安全 | %3C |
> | 大于号 | 不安全 | %3E |
“ | 双引号 | 不安全 | %22 |
# | 井号 | 不安全 | %23 |
% | 百分号 | 不安全 | %25 |
{ | 左大括号 | 不安全 | %7B |
} | 右大括号 | 不安全 | %7D |
| | 竖线 | 不安全 | %7C |
\ | 反斜线 | 不安全 | %5C |
^ | 加字号 | 不安全 | %5E |
~ | 波浪 | 不安全 | %7E |
[ | 左中括号 | 不安全 | %5B |
] | 右中括号 | 不安全 | %5D |
` | 反单引号 | 不安全 | %60 |
空格 | 不安全 | %20 |
综上所述所研究所得:
- URL都是ASCll码,其他字符需要转义
- URL编码其实是字符ASCll码的十六进制然后在前面加上%号,对应ASCII表格
关于Unity中帧率过高导致update计算过快的影响
背景
unity程序发布如果没有设置Dont Vsync+Application.targetFrame=xx
,且电脑关闭了垂直同步,电脑会以极高的帧率运行程序,如果设置了Dont Vsync
有可能会出现画面撕裂
状况
代码中有如下示例代码:
1 | void Update() |
如果在编辑下帧率只要60的话,也许10000
这个数值是可以,但是如果帧率很高的话,会导致结果偏小也许就100
原因是帧率搞运行快,检测的两帧移动距离就会偏小
解决方案
要解决上面问题,就要是计算结果与帧率无关,这个其实就是在update中移动物体一样,使用Time.deltaTime
帧率越大,Time.deltaTime越小
帧率越小,Time.deltaTime越大
改进后代码:
1 | void Update() |
关于Unity的Playersetting->OtherSetting->Stack Track
这个是关于Unity中发布之后的日志堆栈信息
,打包勾选development build
,然后查看console->open log file
如下
None
ScriptOnly
Full