Bonjour à tous. Ce sujet a sûrement déjà été traité sur le forum mais bon...
J'ai une interface 2D sur Qt qui me permet de faire des graphiques dans un QGraphicsScene simplement.
J'aimerais pouvoir évoluer mon idée et ajouter une interface 3D qui me permettrait de visualiser le résultat obtenu sur mon graphique, et interagir avec. J'ai intégré un environnement 3D dans un widget que j'ai tiré d'un exemple dans Qt, seulement je n'ai pas encore pu me plonger dans Opengl pour apprendre à m'en servir. J'aimerais donc faire mon interface 3D en externe avec ce que me propose Unity que je connais mieux et la contrôler via un serveur.
J'utilise mon logiciel Qt sur lequel je démarre un QTcpServer. Et j'essaie de m'y connecter via la fonctionnalité Network Manager de Unity en local. Cependant vous vous doutez bien que celà ne marche pas 😅
J'aimerais comprendre pourquoi. Si Unity peut se connecter à Qt ou non. Et savoir si vous auriez des retours d'expérience.
J'aimerais vraiment pouvoir bénéficier d'une communication via un serveur pour des raisons pratiques. Si vous avez déjà eu ce genre de problème...
Jamais fait ca avec Unity. Mais a partir du moment où tes 2 apps communiquent avec le meme protocole, pas de raison que cela ne marche pas. Mais pour t'aider plus, il faudrait voir ce que tu fais.
Le code de ma fenêtre ressemble à ça. J'ai isolé ce qui concerne le serveur uniquement.
La fonction ExtensionMenu() est appelée par un QPushButton de ma fenêtre.
UNITY 3D-----------------------------
C'est la fonction NetworkManager qui est fourni avec unity de base (je me suis pas embêté par manque de temps), je n'ai pas de détails sur son fonctionnement. J'ai songé à écrire un code C# à la place, mais je pourrait faire ça que vendredi prochain. Je pense que le problème vient de cette partie.
Voila un petit schéma pour illustrer mon idée.
- Edité par Ojimandiatsu 8 décembre 2019 à 10:55:42
Faudrait lire la documentation d'Unity3D mais je suis pas sûr que cela soit "Open".
C'est l'une des partie qui change le plus souvent dans "Unity3D".
Je ne suis pas très optimiste sur la pérennité de votre bricolage.
Si c'est pas documenté mais que vous voulez vraiment le faire en C++.
Le plus simple, si c'est pas documenté mais pas crypté, c'est de faire vite fait un client avec Unity3D, et de sniffer le trafic réseau avec WireShark ou tout autre sniffeur réseau.
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
Pour l'instant je part du principe que le protocole n'est pas le même. J'ai regardé vite fait et le Network Manager est fait juste pour le multiplayer. Je vais tenter de faire une code c# moi même et je vous posterais ça.. dès que j'aurai pu me sortir de la grève 😂
J'ai finalement réussi à bidouiller quelque chose qui fonctionne, en tout cas j'ai réussi à connecter mon client Unity 3D à mon logiciel Qt en serveur local, et à envoyer un message.
Je vous montre mes codes :
Partie serveur QT -
void Window::ExtensionMenu(){//Démarrage du serveur
QMessageBox::information(this, "Serveur", "Démarrage du serveur interne.");
Server = new QTcpServer;
Server->listen(QHostAddress::Any, 4444);
connect(Server, SIGNAL(newConnection()), this, SLOT(onNewConnection()));
}
void Window::onNewConnection(){//Connection détectée
qDebug() << "Try to connect...";
QTcpSocket *Socket = Server->nextPendingConnection();
connect(Socket, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
connect(Socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(onSocketStateChanged(QAbstractSocket::SocketState)));
Socket->write("Hello friend, your are now connected !!");
}
void Window::onReadyRead(){//Lecture
}
void Window::onSocketStateChanged(QAbstractSocket::SocketState socketState){
}
Partie client unity -
using System;
using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;
public class ClientConnect : MonoBehaviour
{
#region private members
private TcpClient socketConnection;
private Thread clientReceiveThread;
#endregion
// Use this for initialization
void Start()
{
Debug.Log("Start");
ConnectToTcpServer();
Debug.Log("End");
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
SendMessage();
}
}
/// <summary>
/// Setup socket connection.
/// </summary>
private void ConnectToTcpServer()
{
try
{
clientReceiveThread = new Thread(new ThreadStart(ListenForData));
clientReceiveThread.IsBackground = true;
clientReceiveThread.Start();
Debug.Log("Thread Started");
}
catch (Exception e)
{
Debug.Log("On client connect exception " + e);
}
}
/// <summary>
/// Runs in background clientReceiveThread; Listens for incomming data.
/// </summary>
private void ListenForData()
{
Debug.Log("ListenForData");
try
{
Debug.Log("Try");
socketConnection = new TcpClient("localhost", 4444);
Byte[] bytes = new Byte[1024];
while (true)
{
// Get a stream object for reading
using (NetworkStream stream = socketConnection.GetStream())
{
int length;
// Read incomming stream into byte arrary.
while ((length = stream.Read(bytes, 0, bytes.Length)) != 0)
{
var incommingData = new byte[length];
Array.Copy(bytes, 0, incommingData, 0, length);
// Convert byte array to string message.
string serverMessage = Encoding.ASCII.GetString(incommingData);
Debug.Log("server message received as: " + serverMessage);
}
}
}
}
catch (SocketException socketException)
{
Debug.Log("Socket exception: " + socketException);
}
}
/// <summary>
/// Send message to server using socket connection.
/// </summary>
private void SendMessage()
{
if (socketConnection == null)
{
return;
}
try
{
// Get a stream object for writing.
NetworkStream stream = socketConnection.GetStream();
if (stream.CanWrite)
{
string clientMessage = "This is a message from one of your clients.";
// Convert string message to byte array.
byte[] clientMessageAsByteArray = Encoding.ASCII.GetBytes(clientMessage);
// Write byte array to socketConnection stream.
stream.Write(clientMessageAsByteArray, 0, clientMessageAsByteArray.Length);
Debug.Log("Client sent his message - should be received by server");
}
}
catch (SocketException socketException)
{
Debug.Log("Socket exception: " + socketException);
}
}
}
Votre code, c'est de la socket "de base", pas de l'Unity 3D.
Vous n'avez donc aucun des avantages de la partie Network d'Unity (gestion de l'authentification, qualité de service, latence améliorée, "gestion" des firewall, etc...)
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
Je n'ai pas besoin de tout ça pour mon projet. Mon objectif initialement c'était d'arriver à connecter Unity et Qt. C'était déjà compliqué à mon niveau 😁.
Ça sera sûrement utile à un autre stade, mais dans l'immédiat c'est suffisant.
Apéro !!!
[Qt + Unity 3D] Serveur
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Apéro !!!
Discord NaN. Mon site.
Apéro !!!
Apéro !!!
Apéro !!!
Apéro !!!