Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt + Unity 3D] Serveur

Sujet résolu
    6 décembre 2019 à 15:31:52

    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...

    Merci à vous.

    • Partager sur Facebook
    • Partager sur Twitter

    Apéro !!!

      6 décembre 2019 à 22:28:44

      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.

      -
      Edité par gbdivers 6 décembre 2019 à 22:29:39

      • Partager sur Facebook
      • Partager sur Twitter
        8 décembre 2019 à 10:29:46

        QT----------------------------

        Window header

        #ifndef WINDOW_H
        #define WINDOW_H
        
        #include <QtWidgets>
        #include <QTcpServer>
        #include <QTcpSocket>
        #include <QGraphicsView>
        #include <QGraphicsScene>
        
        class Window : public QWidget
        {
            Q_OBJECT
        public:
            Window();
            QGraphicsView *view;
            QGraphicsScene *scene;
            //-
            QTcpServer *Server;
            QTcpSocket *Socket;
        
            bool eventFilter(QObject *object, QEvent *event);
            void closeEvent(QCloseEvent *e);
        
        public slots:
            //-
            void onNewConnection();
            void onReadyRead();
            void onSocketStateChanged(QAbstractSocket::SocketState socketState);
        };
        
        #endif

        Window cpp

        #include "window.h"
        
        Window::Window()
        {
            //-
        }
        
        bool Window::eventFilter(QObject *object, QEvent *event){
            //-
        }
        
        void Window::ExtensionMenu(){//Démarrage du serveur
            Server = new QTcpServer;
            Server->listen(QHostAddress::Any, 4444);
            connect(Server, SIGNAL(newConnection()), this, SLOT(onNewConnection()));
        }
        
        void Window::onNewConnection(){//Connexion détectée
            QTcpSocket *Socket = Server->nextPendingConnection();
            connect(Socket, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
            connect(Socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(onSocketStateChanged(QAbstractSocket::SocketState)));
        
        }
        
        void Window::closeEvent(QCloseEvent *e){
            Server->disconnect();
            delete Server;
        }
        
        void Window::onReadyRead(){//Lecture
        
        }
        
        void Window::onSocketStateChanged(QAbstractSocket::SocketState socketState){
        
        }
        

         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

        • Partager sur Facebook
        • Partager sur Twitter

        Apéro !!!

          9 décembre 2019 à 14:32:05

          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.

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            11 décembre 2019 à 16:00:26

            Bonsoir. Merci pour vos réponses.

            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 😂

            • Partager sur Facebook
            • Partager sur Twitter

            Apéro !!!

              19 janvier 2020 à 17:15:06

              Bonjour à vous, désolé pour mon absence.

              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);
                      }
                  }
              }



              • Partager sur Facebook
              • Partager sur Twitter

              Apéro !!!

                20 janvier 2020 à 10:35:30

                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...)

                • Partager sur Facebook
                • Partager sur Twitter
                Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                  20 janvier 2020 à 14:08:41

                  Bonjour bacelar,

                  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.

                  • Partager sur Facebook
                  • Partager sur Twitter

                  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.
                  • Editeur
                  • Markdown