Beispiel #1
0
    // MQTT receive callback
    // this code runs when a message is received
    // It can't update objects, that has to be done in the main 'Update()' thread
    public void MqttReceiveCallback(object sender, MqttMsgPublishEventArgs e)
    {
        //System.Diagnostics.Debug.WriteLine("received something");

        received_data = Encoding.UTF8.GetString(e.Message);
        //System.Diagnostics.Debug.WriteLine("MQTT: " + received_data);

        // enqueue a position update to be dequeued during Update() time
        // (once per frame)
        string[] splits = received_data.Split(',');
        if (splits.Length < 8)
        {
            System.Diagnostics.Debug.WriteLine("Bad MQTT message: " + received_data);
            return;
        }
        string worldname = splits[0];
        // strip extra non-component-name bits from world name
        // e.g. "drone1" -> "drone", "avatar-2" -> "avatar", "fire_3" -> "fire"
        String basename = worldname.Trim(trimChars);

        //System.Diagnostics.Debug.WriteLine("baseName is: " + splits[0]);
        float  x     = float.Parse(splits[1]);
        float  y     = float.Parse(splits[2]);
        float  z     = float.Parse(splits[3]);
        float  xrot  = float.Parse(splits[4]);
        float  yrot  = float.Parse(splits[5]);
        float  zrot  = float.Parse(splits[6]);
        float  wrot  = float.Parse(splits[7]);
        string onoff = splits[8];
        //        System.Diagnostics.Debug.WriteLine("x,y,z are: " + x + " " + y + " " + z);
        //        System.Diagnostics.Debug.WriteLine("myDict is: " + myDict.ToString());
        //        System.Diagnostics.Debug.WriteLine("Dict keys are: " + g.name + "," + h.name + "," + i.name);
        //        System.Diagnostics.Debug.WriteLine("gObj is: " + gObj.name);

        Boolean enabled = false;

        if (onoff == "on")
        {
            enabled = true;
        }

        //GameObject go = myDict[name];
        updateStruct us = new updateStruct(worldname, basename, x, y, z, xrot, yrot, zrot, wrot, true, enabled);

        workQueue.Enqueue(us);
        // dump stale updates
        while (workQueue.Count > 5)
        {
            workQueue.Dequeue();
        }
    }
Beispiel #2
0
    private void Update()
    {
        // pull only one location update from the queue
        // we might want to empty out ALL such updates, but hesitant
        // to put a loop inside Update()
        // it would allow to skip/drop multiple updates to same GameObject
        if (workQueue.Count > 0)
        {
            //System.Diagnostics.Debug.WriteLine("Qcount: " + workQueue.Count);
            updateStruct us = workQueue.Dequeue();
            GameObject   go;

            // where Name is something like "drone1" "avatar-2" "fire_3" etc.
            if (!worldObjects.ContainsKey(us.worldName))
            {
                // Instantiate new GameObject
                // caveat: Start() may not get called for newly instantiated GameObject scripts!

                go      = Instantiate(myDict[us.baseName], transform);
                go.name = us.worldName;
                worldObjects.Add(us.worldName, go);
                ObjectController obj = (ObjectController)go.GetComponent <ObjectController>();
                //us.baseName = go;
                us.Enabled            = true;
                obj.hasUpdate         = true;
                obj.us                = us;
                go.transform.position = new Vector3(us.X, us.Y, us.Z);
                go.transform.rotation = new Quaternion(us.Xrot, us.Yrot, us.Zrot, us.Wrot);
                go.SetActive(true);
            }
            else
            {
                // Update existing GameObject
                go = worldObjects[us.worldName];
                ObjectController obj = (ObjectController)go.GetComponent <ObjectController>();
                if (us.Enabled == true)
                {
                    //us.baseName = go;
                    us.Enabled    = true;
                    obj.hasUpdate = true;
                    obj.us        = us;
                    go.SetActive(true);
                }
                else
                {
                    Destroy(go);
                    worldObjects.Remove(us.worldName);
                }
            }

            if (us.Enabled)
            {
                ObjectController obj = (ObjectController)go.GetComponent <ObjectController>();
                // if previously inactive, warp directly to new coordinate

                obj.targetX    = us.X;
                obj.targetY    = us.Y;
                obj.targetZ    = us.Z;
                obj.targetXrot = us.Xrot;
                obj.targetYrot = us.Yrot;
                obj.targetZrot = us.Zrot;
                obj.targetWrot = us.Wrot;
                obj.hasUpdate  = true;
            }
            else
            {
                go.SetActive(false);
            }
        }
    }