1

在使用Unity引擎开发的过程中总会遇到各种各样的问题,有些问题很坑,只有遇到的才懂,为了避免以后自己再被同一块石头绊倒,特意在此做个整理,希望能给大家节省一些时间,有同样遇到坑的小伙伴也可以把问题或解决方法写在楼下,以供其他小伙伴参考。趟过的坑会持续整理。

C#的坑

JsonUtility转数组BUG
现象:

string json = "[1, 2, 3]";
int[] array = JsonUtility.FromJson<int[]>(json); // 报错

JsonUtility转数组BUG

解决:
https://segmentfault.com/a/11...

UGUI的坑

ContentSizeFitter自适应宽高的BUG
现象:
自适应宽高的UI嵌套多了以后 子节点改变宽高 UI无法正确适应
比如嵌套多级的下拉列表 子节点展开后会挤在一起 折叠后会空出一块 父节点不会自适应

解决:
手动调用自适应方法:LayoutRebuilder.ForceRebuildLayoutImmediate(rectTrans)

// UGUI的自适应 嵌套多了有BUG 手动调用一下
private void ResizeContent() {
    Transform content = this.content;
    while (content != null) {
        ContentSizeFitter fitter = content.GetComponent<ContentSizeFitter>();
        if (fitter != null) {
            RectTransform rectTrans = content.GetComponent<RectTransform>();
            LayoutRebuilder.ForceRebuildLayoutImmediate(rectTrans);
        }
        content = content.parent;
    }
}

Android的坑

IL2CPP发布失败
现象:
Failed running:C:.../il2cpp.exe --convert-to-cpp
Exception:C:.../il2cpp.exe did not run property!
IL2CPP发布错误

解决:
升级Unity版本(虽然没从根本上解决问题 但是升级一个小版本就发布成功了 版本的嫌疑最大)

IOS的坑

IOS上Animator动画系统不好使了
现象:
IOS系统上 所有Animator的动画全不播放了 其他Tween动画和粒子动画正常 Animaton的播放不了 资源是AssetBundle动态加载的

解决:
发布设置中的StripEngineCode = false

原因:
StripEngineCode启用该选项时 会剥离无用的代码 导致该问题
官方说明:
https://docs.unity3d.com/Scri...

说明翻译:
如果启用了该功能,那么在IL2CPP构建中,将删除Unity引擎代码库中未使用的模块和类。这将导致更小的二进制大小。建议使用此设置,然而,如果您怀疑这会导致项目出现问题,您也许想禁用它。注意,为IL2CPP脚本后端托管程序集的字节代码剥离是始终启用的。

SLua的坑

Vector2不能被除
现象:
touch.deltaPosition / 2 会导致代码报错 程序无法运行 因为slua不支持Vector2的除法 Vector3的支持 这个坑我也是醉了 做触点识别的时候趟出来的坑
Vector2不能被除

解决:
x、y 分别除

RenderTexture 宽高不能用浮点数赋值
现象:
renderTexture.width = width
RenderTexture.Create failed: width & height must be larger than 0
RenderTexture坑

解决:
renderTexture.width = math.floor(width) -- 转成整数

Vector3在lua里是引用类型 不是值类型
现象:计算抛物线弹道时,在C#计算时轨迹正确,转成lua时轨迹就错误了
利用方法传进去的参数是Vector3类型 方法内计算Vector3后 外面的参数值也变了
-- 计算抛物线物体在下一帧的位置

function this.getParabolaNextPosition(position, velocity, gravity, time)

-- velocity在lua里是引用类型了 不能随便修改
velocity.y = velocity.y + gravity * time
return position + velocity * time

end

解决:
function this.getParabolaNextPosition(position, velocity, gravity, time)

-- 拷贝Vector3的值
local v = Vector3(velocity.x, velocity.y, velocity.z)
v.y = v.y + gravity * time
return position + v * time

end


冰封百度
233 声望43 粉丝

Unity游戏程序员一枚。生命不息,学习不止。


引用和评论

0 条评论