[奇葩需求]系列为个人在做项目时遇到的各种各样拍脑袋需求和实现,这里记录下来,一方面为备忘,一方面希望各路高手指点
刚过完年,接到领导的一个需求,要Unity与UE4交互
需求大致如下
1. 使用场景为:Unity程序放在iPad端,UE4程序放在PC端
2. Unity负责显示一些二维的图文内容,还有交互按钮,比如几个场景之间切换的按钮,控制UE4相机移动
3. UE4只负责接收Unity的命令并执行
4. 两个程序在同一局域网下
大致思路是:
1. Unity与UE4使用UDP通信,UDP不会因为连接断开报各种错误,也不存在粘包的问题,虽然不太可靠,但可以自己写一些验证方法在一定程度上保证通信的可靠性,因为传输的东西并不多,只是一些字符串而已
2. Unity作为服务端,其实感觉UDP并不想TCP那样能很明显的区分开服务端和客户端,但是毕竟Unity是C#,比较友善
3. 消息验证大概流程是 Unity发送命令 -> UE4接收并处理命令 -> UE4处理完成后返回一个消息通知Unity -> Unity接收到消息后自身作出一些变化(比如切换背景图片,按钮变换等)
4. 如果中间数据丢失,只能人为的再次点击Unity中的按钮,这部分还没想好怎么处理
5. UE4内所有MAP是平级的,即使Unity关闭再打开,也可以顺利的点击某个按钮,让UE4切换到对应MAP,不存在先从二级界面返回一级然后再跳转
在网上搜索关键字“Unreal UDP”或“Unreal TCP”,排名靠前的一片文章 连接,感觉非常像阿三的风格,各种有用没用的瞎扯一堆,乱起八糟功能一堆,看着实在是累人,对unreal C++新人也很不友好
OK,大致思路就是这样,那么现在直接写代码
首先是Unity端的代码,我将IP地址放在一个TXT文档里,TXT放在Resources文件夹下,这样方便后期配置
说明
1. 场景中有两个Canvas,verificationPanel挂载 _ReadIPAddress.cs 脚本,读取TXT文件并把读取到的值转换为string类型存储到全局变量中
2. verificationPanel 验证成功后,先打开 ShowcasePanel,然后再隐藏自身
3. 如果读取或者验证失败,则在 InfoText 控件上显示一些错误信息
4. IP地址使用正则表达式验证(其实我感觉不用验证也可以,毕竟这玩意一般不会写错吧……)
//此处是读取TXT文件的脚本 _ReadIPAddress.cs
using UnityEngine;
using UnityEngine.UI;
//读取 Resources 文件夹中的TXT文件
//IPAddress.txt 中存储服务器端IP地址
public class _ReadIPAddress : MonoBehaviour
{
//用户交互界面
[SerializeField]
private GameObject ShowcasePanel;
//自身界面
[SerializeField]
private GameObject verificationPanel;
//“加载中,请稍候”文字,显示报错信息
[SerializeField]
private Text InfoText;
//TODO
//Regular expression
//验证IP地址的正则表达式
private string RegExp;
void Start()
{
ReadTxt();
//TODO 此处对TXT文件内容只是初步判断,应使用正则表达式进行判断是否为一个完整的IP地址
if (_Global.IPAddress.Length < 10)
{
InfoText.text = "文件为空 或 读取失败";
return;
}
ShowcasePanel.SetActive(true);
verificationPanel.SetActive(false);
}
//读取 IPAddress.txt 中的IP地址,并存储在全局变量中
private void ReadTxt()
{
TextAsset IPString = (TextAsset)Resources.Load("IPAddress");
_Global.IPAddress = IPString.ToString();
}
}
存储IP地址的全局变量的脚本 _Global.cs 如下
public class _Global
{
//存储从txt文件中读取到的IP地址
public static string IPAddress;
}