- Home /
Update Method doesn't see value set by other thread
I'm trying to move an object when a socket client receive a "move" message. Message is being received and everything but i have a problem. I'm setting the bool isMoving to true on the socket callback but the update method almost always sees it as false. I know the bool is being set because is logging right before it but the log "Moving" that i have inside the update method almost never runs, one or two times it ran and the object moved (when i sent like a 100 messages), i don't know why sometimes it works. I'm just testing before i start making a multiplayer server, i tried to use locks and making the variable Volatile but it doesn't work. Is my bool probably being reset? Is there a better way of doing this? I cannot find a good sample of a MonoBehaviour controlled by a Socket
using UnityEngine;
using System.Collections;
using System;
using System.Net;
using System.Net.Sockets;
public class BallController : MonoBehaviour {
private Socket _clientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
private byte[] _recieveBuffer = new byte[8142];
public volatile Boolean isMoving;
private Rigidbody body;
private object _locker = new object ();
// Use this for initialization
void Start () {
body = GetComponent<Rigidbody>();
SetupServer();
}
// Update is called once per frame
void Update () {
lock (_locker) {
if (isMoving) {
Debug.Log ("Moving");
body.AddForce (new Vector3 (0.1435345f * .2f, 0, 0), ForceMode.Impulse);
isMoving = false;
}
}
}
private void SetupServer()
{
try
{
_clientSocket.Connect(new IPEndPoint(IPAddress.Loopback,6670));
}
catch(SocketException ex)
{
Debug.Log(ex.Message);
}
startReceiving();
}
private void startReceiving() {
_clientSocket.BeginReceive(_recieveBuffer,0,_recieveBuffer.Length,SocketFlags.None,new AsyncCallback(ReceiveCallback),null);
}
private void ReceiveCallback(IAsyncResult AR)
{
//Check how much bytes are recieved and call EndRecieve to finalize handshake
int recieved = _clientSocket.EndReceive(AR);
if(recieved <= 0)
return;
//Copy the recieved data into new buffer , to avoid null bytes
byte[] recData = new byte[recieved];
Buffer.BlockCopy(_recieveBuffer,0,recData,0,recieved);
// Convert bytes to String
string result = System.Text.Encoding.UTF8.GetString(recData).Trim();
if (!String.IsNullOrEmpty (result) && result.Equals ("move")) {
Debug.Log ("Received Move");
lock (_locker) {
isMoving = true;
}
}
//Start receiving again
startReceiving();
}
}
Your answer
![](https://koobas.hobune.stream/wayback/20220612122045im_/https://answers.unity.com/themes/thub/images/avi.jpg)