---
id: troubleshootunity3d
title: Unity3D相关
---

## 一、【问】TouchSocket系列是否能用于Unity3D？

TouchSocket系列是否能用于Unity3D

### 【解决】

可以的，TouchSocket是基于Net45和.netstandard2.0的，且没有任何其他运行时，是100%基于C#开发的，所以可以直接用于unity。

但是由于TouchSocket全系都是基于Socket构建的，所以目前无法用于WebGL。除此之外，支持window、android、ios、linux等平台。

目前**实测**支持Il2cpp编译，支持HybridCLR热更新。

TouchSocket提供一个简单的示例demo，包含一个服务器和unity包。以供大家下载试用。 [TouchSocket For Unity](https://gitee.com/RRQM_Home/TouchSocket/tree/master/examples/Unity3d)

## 二、【问】用于Unity 3D时，显示有dll不兼容，或者找不到？

【描述】

unity提示：由于以下错误，将不会加载程序集“Assets/Plugins/TouchSocket.dl”无法解析引用“TouchSocket.Core”。程序集是否丢失或与当前平台不兼容?可以在插件检查器中禁用引用验证.无法解析引用“TouchSocket”。程序集是否丢失或与当前平台不兼容?可以在插件检查器中禁用引用验证

### 【解决】

这是因为TouchSocket系列程序集有依赖关系。例如：TouchSocket依赖于TouchSocket.Core。所以在下载TouchSocket.dll时，应该也下载TouchSocket.Core.dll.

当然有时候我们对具体依赖不了解时，可以直接在vs看依赖关系。


## 三、【问】程序集用于Unity 3D时，Json序列化有问题？

### 【解决】
这是因为unity中不支持代码生成的Json序列化，所以必须用IL2cpp版的json。下面提供参考博客。

在git上下载Newtonsoft.Json-for-Unity-master的压缩文件（.zip），解压之后，复制到unity3D工程的Asset/Plugins文件夹下就可以用了，

[Unity版Newtonsoft.Json](https://github.com/jilleJr/Newtonsoft.Json-for-Unity)

## 四、【问】程序集用于Unity 3D时，显示操作不被支持？

Operation is not supported on this platform.或者我将TouchSocket程序集引入到U3D中后，使用了相关功能，或者其他组件功能，在编辑器界面正常，但是发布到PC、Android等平台时无法使用？

<img src={require('@site/static/img/docs/troubleshootunity3d-2.png').default} />


### 【解决1】

首先查看项目是否设置了`IL2CPP`，如果设置了的话，可以考虑是否能设置为`Mono`，如果能，则OK。

<img src={require('@site/static/img/docs/troubleshootunity3d-1.png').default} width="300" />


### 【解决2】

这是因为unity中不支持IL生成，所以必须把所有的动态调用转换为反射。

即：在任意地方，最前部调用下列代码即可。同时可选的值有`DynamicBuilderType.Reflect（反射）`和`DynamicBuilderType.Expression（表达式树）`。

其中表达式树可能需要你的unity是较高版本，且使用.netstandard2.1的SDK。

```csharp showLineNumbers
GlobalEnvironment.DynamicBuilderType = DynamicBuilderType.Reflect;
```

但是上述方法并不完美，因为反射调用需要消耗一部分性能，所以可以根据实际情况做一些优化。

例如：使用动态调用的地方，一般为序列化和插件调用。

所以序列化则可以考虑使用其他序列化作为替代（因为目前Fast序列化暂不支持生成器）。

而对于插件，则最好使用委托接收，详情请看 [插件系统](./pluginsmanager.mdx)

例如：

```csharp showLineNumbers
class MyPluginClass : PluginBase
{
    protected override void Loaded(IPluginManager pluginManager)
    {
        pluginManager.Add<ITcpSession, ReceivedDataEventArgs>(typeof(ITcpReceivedPlugin), OnTcpReceived);
        base.Loaded(pluginManager);
    }

    private async Task OnTcpReceived(ITcpSession client, ReceivedDataEventArgs e)
    {
        await e.InvokeNext();
    }
}
```

其次，Il2cpp会对程序进行裁剪，所以需要unity内link.xml设置(放置在Assets文件夹内)。 [unity官方文档 托管代码剥离](https://docs.unity3d.com/cn/current/Manual/ManagedCodeStripping.html#LinkXML)


```csharp showLineNumbers xml
<linker>
	<assembly fullname="TouchSocket.Core" />
	<assembly fullname="TouchSocket" />
</linker>
```

:::info 备注

上述仅示例部分，如果是其他组件库，则添加相应**程序集名称**。

:::  