Я создаю сетевую игру в Unity, используя сокеты на основе tcp. (Я новичок в сетевых технологиях и многопоточности).
Я использую System. Net .Sockets asyn c методы, такие как socket.BeginReceive () и socket.EndReceive (). Все соединения клиент-сервер и обмен сообщениями работают. Но как только я пытаюсь получить доступ к чему-либо из Monobehavior (чтобы я действительно мог повлиять на игру Unity), например, к преобразованию игрового объекта, возникает исключение, сообщающее мне, что я могу получить доступ к этим свойствам только из основного потока.
Мой вопрос: почему я не вернусь к основному потоку в обратном вызове foo.beginRecieve () или, по крайней мере, после того, как я вызываю foo.EndReceive ()? Как мне вернуться в основной поток с помощью API сокета asyn c? Придется ли мне в конечном итоге использовать api синхронного сокета и просто обрабатывать потоки самостоятельно, чтобы я мог правильно повторно синхронизировать c с основным потоком Unity?
Спасибо! Любая помощь будет принята с благодарностью.
//code which sets up the callbacks which are executed when a client receives a message from the server
void BeginReceive() => _clientSocket.BeginReceive(_messageReceivedBuffer, 0, _messageReceivedBuffer.Length, SocketFlags.None, ReceiveCallback, null);
void ReceiveCallback(IAsyncResult result)
{
_clientSocket.EndReceive(result);
var msg = _serializer.ByteArrayToObject<NetworkMessage>(_messageReceivedBuffer);
//this clientmanipulation manipulates the game grid and the gameobjects' which it references
//it's in this method that an exception gets thrown and the code breaks
msg.ClientManipulation(_gameGrid);
BeginReceive();
}