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 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>
上述仅示例部分,如果是其他组件库,则添加相应程序集名称。