Unity 问题合集

问题/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");
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值