[奇葩需求]系列为个人在做项目时遇到的各种各样拍脑袋需求和实现,这里记录下来,一方面为备忘,一方面希望各路高手指点

刚过完年,接到领导的一个需求,要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;
}