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 += widgetsCONFIG += 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.0SOURCES += \UnityConfigure.cpp \main.cpp \UnityShow.cppHEADERS += \UnityConfigure.h \UnityShow.hFORMS += \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_NAMESPACEclass UnityShow : public QMainWindow
{Q_OBJECTUnityConfigure* 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);//启动unitytcpSocket = 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边框。
目前我还没找到两全其美的办法,如果哪位大佬有更好的解决方法,欢迎您在评论区留言。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/203513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Metasploit的安全防御和逃逸

预计更新 第一章 Metasploit的使用和配置 1.1 安装和配置Metasploit 1.2 Metasploit的基础命令和选项 1.3 高级选项和配置 第二章 渗透测试的漏洞利用和攻击方法 1.1 渗透测试中常见的漏洞类型和利用方法 1.2 Metasploit的漏洞利用模块和选项 1.3 模块编写和自定义 第三章 Me…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux文件管理(1)》(25)

《Linux操作系统原理分析之Linux文件管理&#xff08;1&#xff09;》&#xff08;25&#xff09; 8 Linux文件管理8.1 Linux 文件系统概述8.2 EXT2 文件系统8.2.1 EXT2 文件系统的构造8.2.2 EXT2 超级块&#xff08;super block&#xff09;8.2.3 组描述符8.2.4 块位图 8.3 EX…

智能优化算法应用:基于社交网络算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于社交网络算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于社交网络算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.社交网络算法4.实验参数设定5.算法结果6.参考…

[ffmpeg] avcodec_alloc_context3 解析

背景 ffmpeg 通过 avcodec_alloc_context3 解析编码器&#xff0c;本文主要来解析一下&#xff0c;这个函数主要做了什么。 具体代码分析 主要是创建了 AVCodecContext ,并给结构体参数赋予初值。 初值设置主要分成两块&#xff0c;1. 所有编码器都相同的部分&#xff1b;2.…

用23种设计模式打造一个cocos creator的游戏框架----(七)代理模式

1、模式标准 模式名称&#xff1a;代理模式 模式分类&#xff1a;结构型 模式意图&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。 结构图&#xff1a; ​ 适用于&#xff1a; 远程代理&#xff1a;也称为大使&#xff0c;这是最常见的类型&#xff0c;在分…

2022年第十一届数学建模国际赛小美赛C题人类活动分类解题全过程文档及程序

2022年第十一届数学建模国际赛小美赛 C题 人类活动分类 原题再现&#xff1a; 人类行为理解的一个重要方面是对日常活动的识别和监控。可穿戴式活动识别系统可以改善许多关键领域的生活质量&#xff0c;如动态监测、家庭康复和跌倒检测。基于惯性传感器的活动识别系统用于通过…

Vue3计算属性与监听属性和生命周期

文章目录 一、计算属性与监视1、computed函数2、watch函数3、watchEffect函数 二、生命周期1、与 2.x 版本生命周期相对应的组合式 API2、新增的钩子函数3、代码实例 一、计算属性与监视 1、computed函数 与computed配置功能一致只有getter有getter和setter 2、watch函数 与…

Kubernetes入门笔记——(2)k8s设计文档

​k8s最初源自谷歌的Brog项目&#xff0c;架构与其类似&#xff0c;主要包括etcd、api server、controller manager、scheduler、kubelet和kube-proxy等组件 etcd&#xff1a;分布式存储&#xff0c;保存k8s集群的状态 api server&#xff1a;资源操作的唯一入口&#xff0c;…

Kafka 的消息格式:了解消息结构与序列化

Kafka 作为一款高性能的消息中间件系统&#xff0c;其消息格式对于消息的生产、传输和消费起着至关重要的作用。本篇博客将深入讨论 Kafka 的消息格式&#xff0c;包括消息的结构、序列化与反序列化&#xff0c;以及一些常用的消息格式选项。通过更丰富的示例代码和深入的解析&…

【Java】Java8重要特性——Lambda函数式编程以及Stream流对集合数据的操作

【Java】Java8重要特性——Lambda函数式编程以及Stream流对集合数据的操作 前言Lambda函数式编程Stream流对集合数据操作&#xff08;一&#xff09;创建Stream流&#xff08;二&#xff09;中间操作之filter&#xff08;三&#xff09;中间操作之map&#xff08;四&#xff09…

2023年山东省职业院校技能大赛信息安全管理与评估二三阶段样题

2023年山东省职业院校技能大赛信息安全管理与评估二三阶段 样题 第二阶段 模块二 网络安全事件响应、数字取证调查、应用程序安全 一、竞赛内容 Geek极安云科专注技能竞赛技术提升&#xff0c;基于各大赛项提供全面的系统性培训&#xff0c;拥有完整的培训体系。团队拥有曾…

docker部署elasticsearch8.x

docker部署elasticsearch8.x 提示1 注意版本差别1.1 docker修改配置1.1.2 docker使用vim报命令不存在的解决办法1.1.3 docker 容器内报错 E: List directory /var/lib/apt/lists/partial is missing. - Acquire ( : No such file or directory) 或者其他权限 PermissionError: …

Flinksql bug :Illegal mixing of types in CASE or COALESCE statement

报错信息 org.apache.flink.table.api.ValidationException: SQL validation failed. From line 66, column 23 to line 68, column 46: Illegal mixing of types in CASE or COALESCE statement org.apache.calcite.runtime.CalciteContextException: From line 66, column 2…

【Delphi】一个函数实现ios,android震动功能 Vibrate(包括3D Touch 中 Peek 震动等)

一、前言 我们在开发移动端APP的时候&#xff0c;有时可能需要APP能够提供震动功能&#xff0c;以便提醒操作者&#xff0c;特别是ios提供的3D Touch触感功能&#xff0c;操作者操作时会有触感震动&#xff0c;给操作者的感觉很友好。那么&#xff0c;在Delphi的移动端FMX开发中…

团建策划信息展示服务预约小程序效果如何

团建是中大型企业商家每年举办的员工活动&#xff0c;其形式多样化、具备全部参与的娱乐性。但在实际策划流程及内容时&#xff0c;部分公司便会难以入手&#xff0c;术业有专攻&#xff0c;这个时候团建策划公司便会发挥效果。 如拓展训练、露营、运动会、体育竞技等往往更具…

【算法】算法题-20231207

这里写目录标题 一、共同路径二、数字列表排序三、给定两个整数 n 和 k&#xff0c;返回 1 … n 中所有可能的 k 个数的组合。 一、共同路径 给你一个完整文件名组成的列表&#xff0c;请编写一个函数&#xff0c;返回他们的共同目录路径。 # nums[/hogwarts/assets/style.cs…

五花八门客户问题(BUG) - 数据库索引损坏

问题 曾经有个客户问题&#xff0c;让我们开发不知所措了很久。简单点说就是客户的index周期性的损坏&#xff0c;即使全部重建后经历大约1~2周数据update后也会坏掉。导致的直接结果&#xff1a;select出来的数据不对。问题很严重。 直接看损坏的index文件看不出什么蛛丝马迹…

做题笔记:SQL Sever 方式做牛客SQL的题目--VQ

----VQ 查询用户刷题日期和下一次刷题日期 现有牛客刷题记录表questions_pass_record &#xff0c;请查询用户user_id&#xff0c;刷题日期date &#xff08;每组按照date降序排列&#xff09;和该用户的下一次刷题日期nextdate&#xff08;若是没有则为None&#xff09;&#…

算法通关村第十七关-黄金挑战跳跃问题

大家好我是苏麟 , 今天说说跳跃问题 . 跳跃游戏 描述 : 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff…

【ML】LSTM应用——预测股票(基于 tensorflow2)

LSTM 应用预测股票数据 所用数据集&#xff1a;https://www.kaggle.com/datasets/yuanheqiuye/bank-stock 基于&#xff1a;tensorFlow 2.x 数据处理 import numpy as np import pandas as pd from matplotlib import pyplot as plt from sklearn.model_selection import tr…