отдельные места для каждого пользователя - PullRequest
0 голосов
/ 21 сентября 2019

Извините за мой плохой английский.Приложение считывает данные с акселерометра смартфона.У него есть сервер, на котором при подключении смартфона создается пара id-данных о положении в пространстве.На данный момент данные от всех пользователей поступают на сервер.Задача состоит в том, чтобы сделать наоборот: каждый раз, когда пользователь подключается, создается отдельное пространство, которое получает данные только от одного идентификатора.

Код сервера:


    var express = require('express');
    var compression = require('compression');
    var http = require('http');
    var path = require('path');
    var socketIO = require('socket.io');
    const port = process.env.PORT || 5000;
    var cors = require('cors');




    var app = express();
    var server = http.Server(app);
    var io = socketIO(server);
    app.use(cors()) ;// Use this after the variable declaration

    app.set('port', port);
    app.use(compression());
    app.use(express.static(__dirname + '/'));
    app.use('/static', express.static(__dirname + '/static'));
    // Routing
    app.get('/', function (request, response) {
        response.sendFile(path.join(__dirname, 'view.html'));
        console.log(Object.keys(player_move).length);
        if (Object.keys(player_move).length >= 1){
            let data = {
                id: socketId,
                x: player_move[socketId].x,
                z: player_move[socketId].z,
            };
            response.send(data);
            console.log('connected');
        }else{
            response.send("no");
            console.log('not connected');
        };

    });
    app.use(express.static(__dirname + '/client/'));
    // Routing
    app.get('/view', function (request, response) {
        response.sendFile(path.join(__dirname, '/client/index.html'));
    });

    server.listen(port, function () {
        console.log('Старт сервера по адресу localhost:' + port);
        console.log('Старт просмотра по адресу localhost: ' + port + ' /view');
    });


    var player_move = {};
    var socketId;
    io.on('connection', function (socket) {

        socket.on('new player', function () {
            console.log('new player');
            socket.emit('ok');
        });
        socket.on('disconnect', function () {

        });

        socket.on('movement', function () {
            console.log('movement');
            console.log('player_move', player_move);
            if (player_move[socketId]) {
                let data = {
                    id: socketId,
                    x: player_move[socketId].x,
                    z: player_move[socketId].z,
                };
                socket.emit('ok', data);
            }
        });
        socket.on('phone_data', function (data) {
            console.log('phone_date', data);
            socketId = socket.id;
            player_move[socket.id] = {
                x: data.x,
                z: data.z
            };
        });


    // GET method route
        app.get('/', function (req, res) {
            res.send('Contact');
            console.log("est kontakt");
        });

    });

код сокета:

using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using UnityEngine;
using UnityEngine.Networking;


public class SocketController : MonoBehaviour
{


    [SerializeField]
    PlayerController player;
    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(GetRequest("http://plantgo.ru:5000"));


    }

    private void Awake()
    {
        //socket.url = "ws://127.0.0.1:5000/socket.io/?EIO=4&transport=websocket";

    }
    // Update is called once per frame
    void Update()
    {
    }
    //private IEnumerator Connector()
    //{
    //   while (true)
    // {
    //   socket.Emit("movement");

    // yield return new WaitForSeconds(0.10f);

    //       }
    // wait 1 seconds and continue




    //    }
    class PlayerInfo
    {
        public string id;
        public string x;
        public string z;
    }

    IEnumerator GetRequest(string uri)
    {
        while (true)
        {
            using (UnityWebRequest webRequest = UnityWebRequest.Get(uri))
            {
                // Request and wait for the desired page.
                yield return webRequest.SendWebRequest();

                string[] pages = uri.Split('/');
                int page = pages.Length - 1;

                if (webRequest.isNetworkError)
                {
                    Debug.Log(pages[page] + ": Error: " + webRequest.error);
                }
                else
                {
                    Debug.Log(pages[page] + ":\nReceived: " + webRequest.downloadHandler.text);
                    if (webRequest.downloadHandler.text == "no")
                    {
                        continue;
                    }
                    else
                    {
                        PlayerInfo playerInfo = (PlayerInfo)JsonUtility.FromJson<PlayerInfo>(webRequest.downloadHandler.text);
                        Debug.Log(playerInfo);
                        player.PlayerMove(float.Parse(playerInfo.x, CultureInfo.InvariantCulture), float.Parse(playerInfo.z, CultureInfo.InvariantCulture));
                    }
                }

            }
            //yield return new WaitForSeconds(0.1f);
        }
    }


}

когда я запускаю сервер, несколько пользователей могут управлять персонажем одновременно, поскольку они находятся в одном игровом пространстве, каждому необходимо иметь своего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...