工作时使用IL2CPP打包PC,发现打包失败。
根据代码查找后,发现是Unity.Plastic.Newtonsoft.Json找不到
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Plastic.Newtonsoft.Json;
using Unity.Plastic.Newtonsoft.Json.Linq;
public class MyScripts : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
string json = CreateJson();
Debug.Log(json);
LoadJson(json);
}
// Update is called once per frame
void Update()
{
}
void LoadJson(string json)
{
JToken token = JsonConvert.DeserializeObject<JToken>(json);
if (token.Type == JTokenType.Object)
{
JObject obj = token.ToObject<JObject>();
Debug.LogFormat("json数据如下: num:{0},name:{1},sex:{2}",
obj["num"].ToString(),
obj["name"].ToString(),
obj["sex"].ToString());
}
}
string CreateJson()
{
MyData data = new MyData();
data.num = 5;
data.name = "测试";
data.sex = true;
string json = JsonConvert.SerializeObject(data);
return json;
}
}
public class MyData
{
public int num;
public string name;
public bool sex;
}
于是去查找命名空间所在dll位置
发现是Unity的包 框架似乎是.net3.5,怀疑dll不支持。
于是通过这个方法成功打包
unity 关于Newtonsoft.Json引用报错问题!!!!(已解决) - 灰信网(软件开发博客聚合) (freesion.com)
但是打包后运行代码出错
依旧无法找到Newtonsoft.Json.dll。
unity3d - Unity Json.net System.Reflection.Emit in iOS 中的错误 - 堆栈溢出 (stackoverflow.com)
根据搜索发现IL2CPP似乎不支持运行时代码生成,不能与Newtonsoft Json一起使用。
Installation via UPM · jilleJr/Newtonsoft.Json-for-Unity Wiki · GitHub
最终通过搜索找到了Unity特殊版本的Newtonsoft.Json库,成功解决了问题
总结解决方法:
1.找到你的项目文件夹/Packages/manifest.json文件,打开并添加以下内容
{
"scopedRegistries": [
{
"name": "Packages from jillejr",
"url": "https://npm.cloudsmith.io/jillejr/newtonsoft-json-for-unity/",
"scopes": ["jillejr"]
}
],
"dependencies": {
"jillejr.newtonsoft.json-for-unity": "12.0.201",
"com.unity.ide.visualstudio": "2.0.14",
"com.unity.ide.vscode": "1.2.5",
"com.unity.test-framework": "1.1.31",
"com.unity.textmeshpro": "3.0.6",
"com.unity.ugui": "1.0.0",
"com.unity.modules.ai": "1.0.0",
"com.unity.modules.androidjni": "1.0.0",
"com.unity.modules.animation": "1.0.0",
"com.unity.modules.assetbundle": "1.0.0",
"com.unity.modules.audio": "1.0.0",
"com.unity.modules.cloth": "1.0.0",
"com.unity.modules.director": "1.0.0",
"com.unity.modules.imageconversion": "1.0.0",
"com.unity.modules.imgui": "1.0.0",
"com.unity.modules.jsonserialize": "1.0.0",
"com.unity.modules.particlesystem": "1.0.0",
"com.unity.modules.physics": "1.0.0",
"com.unity.modules.physics2d": "1.0.0",
"com.unity.modules.screencapture": "1.0.0",
"com.unity.modules.terrain": "1.0.0",
"com.unity.modules.terrainphysics": "1.0.0",
"com.unity.modules.tilemap": "1.0.0",
"com.unity.modules.ui": "1.0.0",
"com.unity.modules.uielements": "1.0.0",
"com.unity.modules.umbra": "1.0.0",
"com.unity.modules.unityanalytics": "1.0.0",
"com.unity.modules.unitywebrequest": "1.0.0",
"com.unity.modules.unitywebrequestassetbundle": "1.0.0",
"com.unity.modules.unitywebrequestaudio": "1.0.0",
"com.unity.modules.unitywebrequesttexture": "1.0.0",
"com.unity.modules.unitywebrequestwww": "1.0.0",
"com.unity.modules.vehicles": "1.0.0",
"com.unity.modules.video": "1.0.0",
"com.unity.modules.vr": "1.0.0",
"com.unity.modules.wind": "1.0.0",
"com.unity.modules.xr": "1.0.0"
}
}
2.在Assets文件夹下新建一个link.xml文件,写入以下内容,防止裁剪
<linker>
<assembly fullname="Newtonsoft.Json" preserve="all" />
<assembly fullname="System.Core">
<type fullname="System.Linq.Expressions.Interpreter.LightLambda" preserve="all" />
</assembly>
</linker>
3.最后记得代码的using更改
using Unity.Plastic.Newtonsoft.Json;
using Unity.Plastic.Newtonsoft.Json.Linq;
//改为下面这段
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;