QT+Unity3D 超详细(将unity3D与QT进行连接,并实现信息传递)

QT+Unity3D连接

在QT中连接unity3D,首先要有一个unity.exe执行文件。在这里不提供unity执行文件的编写,只提供QT这边与unity3D连接和信息传递。

创建项目

创建一个新的项目,我创建的项目名称如下。
Alt
下图是我建立新项目的文件。APP文件就是我的unity.exe执行文件。
Alt
打开APP文件,里面就是关于unity3D的东西了。
Alt

直接上代码(看注释更通透)

unityConnect.pro文件中添加QT += network模块。

QT       += core gui
QT       += network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    UnityConfigure.cpp \
    main.cpp \
    UnityShow.cpp

HEADERS += \
    UnityConfigure.h \
    UnityShow.h

FORMS += \
    UnityShow.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

UnityConfigure.h中。

#ifndef UNITYCONFIGURE_H
#define UNITYCONFIGURE_H

#include <QObject>
#include <QProcess>
#include <windows.h>
#include <winuser.h>
#include <qDebug>
class UnityConfigure : public QObject
{
    Q_OBJECT
public:
    explicit UnityConfigure(QObject *parent = nullptr);
    ~UnityConfigure();
    void startUnityProgram(const QString& unityExePath);

    void setWindowParent(HWND parentWidgetHandle, const QString& sonWindowTitleName);
    QProcess* process;
signals:
    void unityProgramStarted();
};

#endif // UNITYCONFIGURE_H

UnityConfigure.cpp中。

#include "UnityConfigure.h"

UnityConfigure::UnityConfigure(QObject *parent)
    : QObject{parent}
{
    process = new QProcess(this);//创建一个新的进程
    connect(process, &QProcess::started, this, &UnityConfigure::unityProgramStarted);//将进程与unity连接起来
}
UnityConfigure::~UnityConfigure()//用于关闭
{
    process->kill();//关闭进程
}
void UnityConfigure::startUnityProgram(const QString& unityExePath)
{
    process->setProgram(unityExePath);//设置unity路径
    process->start(QIODevice::Truncate);//启动进程
}

void UnityConfigure::setWindowParent(HWND parentWidgetHandle, const QString& sonWindowTitleName)//设置unity窗口属性
{
    std::wstring titleName = sonWindowTitleName.toStdWString();//设置unity标题
    HWND hfigure = nullptr;
    while (true)
    {
        hfigure = FindWindowW(nullptr, titleName.c_str());
        if (hfigure != nullptr)
        {
            break;
        }
    }
    RECT rect;
    GetWindowRect(parentWidgetHandle, &rect);//得到你要嵌入QT控件窗口的大小
    SetParent(hfigure, parentWidgetHandle);//将unity嵌入到QT控件中

    LONG_PTR dwStyle = GetWindowLongPtr(hfigure, GWL_STYLE);//子窗口样式
    dwStyle = dwStyle & ~(WS_THICKFRAME | WS_CAPTION | WS_SIZEBOX | WS_MAXIMIZEBOX | WS_MINIMIZEBOX);//移除子窗口的移动和调整大小的样式
    //如果想要使用unity缩放功能,就需要把"dwStyle |= WS_CHILD | WS_CLIPCHILDREN;"这行注释掉就可以了
    dwStyle |= WS_CHILD | WS_CLIPCHILDREN;//添加固定位置的样式。WS_CHILD 表示这是一个子窗口,WS_CLIPCHILDREN 表示绘制子窗口时,只绘制子窗口区域内的内容。
    SetWindowLongPtr(hfigure, GWL_STYLE, dwStyle);//更新子窗口的样式

    //这段代码用于改变unity窗口在QT控件中的位置以及大小。
//    MoveWindow(hfigure, 0, 0, 1400, 870, false);
//    SetWindowPos(hfigure, HWND_TOP, 0, 0, 1400, 870, SWP_SHOWWINDOW |SWP_HIDEWINDOW);
//    ShowWindow(hfigure, SW_SHOW);
//    SetFocus(hfigure);
}

UnityShow.h中。

#ifndef UNITYSHOW_H
#define UNITYSHOW_H

#include <QMainWindow>
#include "UnityConfigure.h"
#include <QTcpSocket>

QT_BEGIN_NAMESPACE
namespace Ui { class UnityShow; }
QT_END_NAMESPACE

class UnityShow : public QMainWindow
{
    Q_OBJECT
    UnityConfigure* unity;
    QTcpSocket* tcpSocket;
public:
    UnityShow(QWidget *parent = nullptr);
    ~UnityShow();
    void onReceive();//接收数据
    void onSend();//发送数据
private slots:
    void onConnected();//连接建立时的处理
    void onDisconnected();//连接断开时的处理
private:
    Ui::UnityShow *ui;
};
#endif // UNITYSHOW_H

UnityShow.cpp中。

#include "UnityShow.h"
#include "ui_UnityShow.h"

UnityShow::UnityShow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::UnityShow)
{
    ui->setupUi(this);
    unity = new UnityConfigure(this);
    QString titleName("1025using");//创建标题,切记要与unity执行文件名字相同,要不然无法嵌入到QT中

    QString unityExePath("./APP/1025using.exe");//读取unity路径
    //将QT与unity进行连接
    connect(unity, &UnityConfigure::unityProgramStarted, this, [&]()
            {
                unity->setWindowParent((HWND)ui->unityWidget->winId(),titleName);
            });
    unity->startUnityProgram(unityExePath);//启动unity
    tcpSocket = new QTcpSocket(this);//创建TCP通信
    tcpSocket->connectToHost("127.0.0.1", 9999);//进行和unity接口连接,这个接口是在unity里面进行设置的,QT直接用就行。
    connect(tcpSocket, &QTcpSocket::connected, this, &UnityShow::onConnected);
    connect(tcpSocket, &QTcpSocket::disconnected, this, &UnityShow::onDisconnected);
    onSend();//进行发送消息
}

UnityShow::~UnityShow()
{
    delete ui;
}

void UnityShow::onConnected()
{
    // 连接建立时的处理
    qDebug()<<"Connected successfully!";
}

void UnityShow::onDisconnected()
{
    // 连接断开时的处理
    qDebug()<<"disConnected successfully!";
}

void UnityShow::onReceive()
{
    // 接收unity发送的命令,收到命令之后去执行QT这边的操作。
    QByteArray data = tcpSocket->readAll();
}
void UnityShow::onSend()
{
    /*
     * 发送信息,BulletEyeRendezvous这条信息是在unity中进行设置的,
     * 然后在QT中进行发送这条消息即可。发完之后unity会执行这条信息,
     * 去执行unity接下来的程序。
    */
    QString msg="BulletEyeRendezvous";//unity设置的命令
    tcpSocket->write(msg.toUtf8());//进行发送命令
}

UnityShow.ui中,定义一个Widget控件即可。
Alt

运行结果

Alt

如果不想出现下面的unity边框,就在UnityConfigure.cpp中加上这行代码dwStyle |= WS_CHILD | WS_CLIPCHILDREN; 加完之后就不能使用unity缩放功能。
如果想要使用unity缩放功能,就需要把dwStyle |= WS_CHILD | WS_CLIPCHILDREN; 这行注释掉就可以了,但会出现unity边框。
目前我还没找到两全其美的办法,如果哪位大佬有更好的解决方法,欢迎您在评论区留言。
在这里插入图片描述

  • 13
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: Unity3DQt是两种不同的开发框架,具有各自的特点和用途。Unity3D是一款强大的游戏开发引擎,主要用于开发三维游戏和虚拟现实应用。而Qt是一个跨平台的应用程序开发框架,主要用于开发图形界面和嵌入式应用。 尽管Unity3DQt有各自独立的领域,但它们也可以结合使用,以实现更丰富和全面的功能。使用Unity3DQt的结合,开发者可以在Unity3D游戏中嵌入Qt的图形界面和逻辑,以实现更复杂和多样化的用户交互。 举例来说,在开发一个虚拟现实游戏时,可以使用Unity3D作为游戏引擎,用来处理游戏的物理效果、碰撞检测和图形渲染等方面。同时,可以利用Qt开发游戏的UI界面,包括主菜单、设置选项和排行榜等功能。 另外,Qt还可以用来开发Unity3D游戏的工具和编辑器插件。通过Qt的强大GUI工具和丰富的库函数,可以为Unity3D游戏提供更多的开发工具,如场景编辑器、特效编辑器和资源管理器等。 综上所述,Unity3DQt的结合可以提供更完善和多样化的游戏开发环境。通过充分发挥两者的优势,开发者可以实现更高效、更具交互性和更具创意的游戏和应用。 ### 回答2: Unity3D是一款强大的游戏引擎,而Qt是一个跨平台的应用程序开发框架。将Unity3DQt结合可以实现更强大的应用程序开发和游戏制作。 首先,Qt提供了丰富的图形界面组件和工具,可以非常方便地创建用户界面。通过将Qt的UI组件与Unity3D的3D图形引擎结合,可以实现更出色的用户体验。开发者可以使用Qt的UI设计器来设计和布局界面,然后使用Unity3D创建和显示3D对象,实现更加生动和交互的用户界面。 其次,Qt还提供了强大的跨平台能力,可以方便地将应用程序移植到不同的操作系统和设备上。Unity3D本身也可以实现跨平台开发,但结合Qt可以进一步增强跨平台的能力。开发者可以使用Qt的API来实现不同平台之间的兼容性,提高应用程序或游戏在不同设备上的运行效果和稳定性。 此外,Unity3D游戏引擎功能非常强大,可以实现复杂的游戏逻辑和效果。而Qt提供了丰富的库和工具,可以方便地扩展和定制Unity3D的功能。例如,可以使用Qt提供的多媒体库来实现音频和视频的处理,使用Qt的网络库来实现网络功能,以及使用Qt的数据库库来实现数据的存储和管理。 总而言之,将Unity3DQt结合可以实现更强大和灵活的应用程序开发和游戏制作。通过结合两者的优点,开发者可以实现更加丰富、生动和跨平台的应用程序和游戏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值