问题索引(无序)
问题/BUG
Android获取权限后回调弹窗UI异常
我用Unity自带的权限获取,来获取Android权限,接入了回调方法。
但回调弹窗如果时初次打开 则UI会全黑 且本次运行中一直全黑 效果严重。
仔细观察后猜测,有可能回调是在子线程中运行的,而Unity的大部分方法不能在子线程中运行。
结果就是我在回调方法中新开一个协程 强行拉回主线程 问题解决了。
InputField刷新问题(继承自ICanvasElement接口的应该都行)
明明空间足够大,一切设置都正确,就是不显示text。
通常发生在多层layout嵌套的情况下,比如说我的就是Scroll Rect内嵌InputField,且InputField需要独立自适应(项目需要)。
目前个人的解决方法是调用ICanvasElement.ReBuild但是不是直接调用,要修改之前调用修改之后再调用才能生效,否则他检测到没有更新就不会更新mesh。
UI更换父级时但Scale刷新不及时
在写UI自动延展的扩展方法时碰到的,切换父物体我常用的写法是用:
transform.parent = obj;
但我发现这样切换父物体scale没有更新,与手动拖动有区别。解决方法为:
transform.SetParent(NewParent, true);
Project面板Packages无法展开
Project面板有个眼睛的图标(右上角) 点一下就好了
升级Urp之后UI相机未按预期渲染
手动设置:
代码设置:
GetComponent<UnityEngine.Rendering.Universal.UniversalAdditionalCameraData>().cameraStack.Add(UICamera);
杂项
InputField的键盘类型会影响输入内容
比如键盘类型为num或者phone那么尽管你的输入类型允许字母,字母也无法输入 我觉得是个BUG 2020.3.29版本 存在
获取Android权限
Unity自带对应方法和回调不需要自己写jar包
//相机权限为例 是否已有权限
if (!Permission.HasUserAuthorizedPermission(Permission.Camera))
{
PermissionCallbacks callbacks = new PermissionCallbacks();
callbacks.PermissionGranted += Granted;
callbacks.PermissionDenied += Denied;
callbacks.PermissionDeniedAndDontAskAgain += DeniedAndDontAskAgain;
Permission.RequestUserPermission(Permission.Camera, callbacks);
}
else
Debug.Log("已经拥有权限");
Image外部图片自适应
加载完外部图片 多半会获得一个Texture2D
想使其自适应 比较合理的方法是 :
转化为Sprite并勾选PreserveAspect
//创建Sprite
Sprite.Create(texture, new Rect(0.0f, 0.0f, texture.width, texture.height), new Vector2(0.5f, 0.5f));
//勾选PreserveAspect
GetComponent<Image>().preserveAspect = true;
不触发绑定事件情况下改变Toggle的勾选状态
//是否勾选
GetComponent<Toggle>().SetIsOnWithoutNotify(bool)
UI短时间内点击次数获取
using UnityEngine;
using UnityEngine.EventSystems;
public class Script : MonoBehaviour, IPointerClickHandler
{
public void OnPointerClick(PointerEventData eventData)
{
//eventData.clickCount可记录短时间内的点击次数
if (eventData.clickCount == 2)
{
Debug.Log("双击UI");
}
}
}
UI自动布局组件
ContentSizeFitter常用于Text 但不仅用于Text 之前个人的认知只限于控制Text
可应用于拥有一个或多个ILayoutElement组件的游戏对象
HorizontalLayoutGroup
VerticalLayoutGroup
GridLayoutGroup
LayoutElement
Text
Image
…
…
平台判断
//建议使用 可被选择编译 缺点是Editor时根据打包平台来判断当前平台
#if UNITY_ANDROID
Debug.Log("这里安卓设备");
#endif
#if UNITY_IPHONE
Debug.Log("这里苹果设备");
#endif
#if UNITY_STANDALONE_WIN
Debug.Log("电脑上运行o");
#endif
//运行时判断平台 不建议使用 分支会全部打包进去
switch (Application.platform)
{
case RuntimePlatform.WindowsEditor:
Debug.Log("Windows");
break;
case RuntimePlatform.Android:
Debug.Log("Android");
break;
case RuntimePlatform.IPhonePlayer:
Debug.Log("Iphone");
break;
}
Favorites快捷访问文件夹
很方便的功能,之前一直想要,以为Unity不支持,所以去看ProjectBrowser源码看看能不能自己实现。
后来发现Unity自带 把文件夹拖入Favorites下面就行 。。
自动设置组件
在Editor下 有时设置一些组件 比如Image关闭射线检测 但是每次手动点都很烦
这种东西靠口头约定肯定不靠谱 总会遗漏或者忘记
ObjectFactory.componentWasAdded
这个回调可以让你获取添加到的组件
反射相关
反射带有命名空间的类
普通的类反射起来很简单
Assembly assembly = Assembly.Load("UnityEditor");
Type type = assembly.GetType("AssemblyValidation");
这样就获取到了AssemblyValidation类
但是带有命名空间的就不太一样了 之前犯蠢了 所以记录下来备忘
//错误写法 本来就没有UnityEditor.AddComponent这个dll 所以肯定是错的
Assembly assembly = Assembly.Load("UnityEditor.AddComponent");
Type type = assembly.GetType("AddComponentWindow");
//正确写法
Assembly assembly = Assembly.Load("UnityEditor");
Type type = assembly.GetType("UnityEditor.AddComponent.AddComponentWindow");