跳到主要内容
版本:2.1

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

二、【问】用于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

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

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

【解决1】

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

【解决2】

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

即:在任意地方,最前部调用下列代码即可。同时可选的值有DynamicBuilderType.Reflect(反射)DynamicBuilderType.Expression(表达式树)

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

GlobalEnvironment.DynamicBuilderType = DynamicBuilderType.Reflect;

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

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

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

而对于插件,则最好使用委托接收,详情请看 插件系统

例如:

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官方文档 托管代码剥离

<linker>
<assembly fullname="TouchSocket.Core" />
<assembly fullname="TouchSocket" />
</linker>
备注

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