private void Awake()
        {
            _trackedObjectData          = new List <TrackedObjectData>();
            _tcpServer                  = GetComponent <SteamVrAsyncStreamingMappingDataUsingTcp>();
            _savedPositions             = new List <Vector3>();
            _steamTrackedObjects        = new List <SteamVR_TrackedObject>();
            _steamTrackedObjectsInitial = new List <SteamVR_TrackedObject>();
            _lastIds       = new List <int>();
            _lastActive    = new List <bool>();
            _lastNames     = new List <string>();
            _offsets       = new List <SteamVR_Offset>();
            SOCKET_BUFSIZE = (int)new System.ComponentModel.Int32Converter().ConvertFromString(SocketSize);
            if (StreamData)
            {
                //init variables
                _tcpServer.Port            = 11000;
                _tcpServer._isListening    = true;
                _tcpServer._ip             = IPServer;
                _tcpServer.RequiredCommand = CommandMappingTable;
                _tcpServer.ServerMessageEntryValueSeparator = MappingTableEntryValueSeparator;
                _tcpServer.ServerMessageEntriesSeparator    = MappingTableEntriesSeparator;
            }

            //add to lists
            var _childrenWithTrackedObjects = GetComponentsInChildren <SteamVR_TrackedObject>().ToList();

            _objectsStart = new List <SteamVR_TrackedObject>(_childrenWithTrackedObjects);
            var wishList = _childrenWithTrackedObjects
                           .Select(c => PlayerPrefs.GetInt(c.gameObject.name + "_id", -1)).ToList();
            var otherAvailableIds = new List <int>();
            var allAvailableIds   = new List <int>();

            for (var i = StartIndex; i < CreateNumber; i++)
            {
                allAvailableIds.Add(i);
                if (!wishList.Contains(i))
                {
                    otherAvailableIds.Add(i);
                }
            }
            for (var i = 0; i < _childrenWithTrackedObjects.Count; i++)
            {
                var child     = _childrenWithTrackedObjects[i];
                var childname = child.gameObject.name;
                if (wishList[i] >= 0)
                {
                    var ind = wishList[i];
                    if (allAvailableIds.Contains(ind))
                    {
                        //Debug.Log("success: assign id " + ind + " to " + childname);
                    }
                    else
                    {
                        ind = otherAvailableIds.First();
                        // Debug.Log("failed: assign id " + wishList[i] + " to " + childname + ", use " + ind + " instead");
                    }
                    child.index = (SteamVR_TrackedObject.EIndex)ind;
                    allAvailableIds.Remove(ind);
                    if (otherAvailableIds.Contains(ind))
                    {
                        otherAvailableIds.Remove(ind);
                    }
                    //child.gameObject.SetActive(PlayerPrefs.GetInt(childname + "_active") == 1);
                }
            }
            for (var i = StartIndex; i < CreateNumber; i++)
            {
                SteamVR_Offset off;
                var            ind        = i;
                var            candidates = _childrenWithTrackedObjects.Where(s => (int)s.index == ind).ToList();
                var            sto        = candidates.FirstOrDefault();
                if (sto != null)
                {
                    off = sto.gameObject.GetComponent <SteamVR_Offset>();
                    _childrenWithTrackedObjects.Remove(sto);
                    //Debug.Log("handle " + sto.gameObject.name);
                }
                else
                {
                    var go = new GameObject();
                    sto                 = go.AddComponent <SteamVR_TrackedObject>();
                    sto.index           = (SteamVR_TrackedObject.EIndex)i;
                    go.transform.parent = transform;
                    go.name             = "UnassignedName" + i;
                    //Debug.Log("create " + go.name);
                    off = go.AddComponent <SteamVR_Offset>();

                    if (candidates.Count > 1)
                    {
                        Debug.Log("mutliple ids " + i);
                        var delete = _childrenWithTrackedObjects.Where(c => c != sto && (int)c.index == i);
                        foreach (var d in delete)
                        {
                            _childrenWithTrackedObjects.Remove(d);
                            Destroy(d.gameObject);
                        }
                    }
                }

                var newData = new TrackedObjectData
                {
                    id  = i,
                    pos = Vector3.zero,
                    rot = Quaternion.identity
                };
                sto.origin = null;
                _trackedObjectData.Add(newData);
                _steamTrackedObjects.Add(sto);
                _steamTrackedObjectsInitial.Add(sto);
                _lastIds.Add((int)sto.index);
                _lastActive.Add(sto.gameObject.activeSelf);
                _lastNames.Add(sto.gameObject.name);
                _offsets.Add(off);
                _savedPositions.Add(sto.transform.position);
#if UNITY_EDITOR
                DrawIcon(sto.gameObject, 0);
                sto.gameObject.SetActive(true);
#endif
            }
            if (_childrenWithTrackedObjects.Count > 0)
            {
                Debug.LogError("Initialize error: more than one initial 'SteamVR_TrackedObject' with same device index");
            }

            var        ser = PlayerPrefs.GetString("origin");
            Vector3    pos;
            Quaternion rot;
            if (TryDeserializeOrigin(ser, out rot, out pos))
            {
                transform.rotation = rot;
                transform.position = pos;
            }

            Logging.SetTrackedObjects(_steamTrackedObjects);
        }
        void StreamTrackedObjectData()
        {
            var ts = new List <TrackedObjectData>();

            var changed = false;

            for (var i = 0; i < CreateNumber - StartIndex; i++)
            {
                var data = _trackedObjectData[i];

                //check device ids (no doubles) and names (changes)
                var deviceId = (int)_steamTrackedObjects[i].index;
                var tmpName  = _steamTrackedObjects[i].gameObject.name;
                var isActive = _steamTrackedObjects[i].gameObject.activeSelf;
                if (_lastNames[i] != tmpName)
                {
                    var lastName = _lastNames[i];
                    _lastNames[i] = tmpName;
                    Debug.Log("changed name of device " + _lastIds[i] + " from " + lastName + " to " + tmpName);
                    ResetNames();
                    changed = true;
                }
                if (_lastIds[i] != deviceId)
                {
                    var indexOfData2Change        = -1;
                    TrackedObjectData data2Change = new TrackedObjectData();
                    for (var j = 0; j < CreateNumber - StartIndex; j++)
                    {
                        if (i == j || (int)_steamTrackedObjects[j].index != deviceId)
                        {
                            continue;
                        }
                        indexOfData2Change = j;
                        data2Change        = _trackedObjectData[j];
                        break;
                    }
                    if (indexOfData2Change >= 0)
                    {
                        var otherActive = _steamTrackedObjects[indexOfData2Change].gameObject.activeSelf;

                        data2Change.id = _lastIds[i];
                        _steamTrackedObjects[indexOfData2Change].index = (SteamVR_TrackedObject.EIndex)_lastIds[i];
                        _lastIds[indexOfData2Change] = _lastIds[i];
                        _steamTrackedObjects[indexOfData2Change].gameObject.SetActive(isActive);

                        data.id = deviceId;
                        //_steamTrackedObjects[i].index = (SteamVR_TrackedObject.EIndex)deviceId;
                        _lastIds[i] = deviceId;
                        _steamTrackedObjects[i].gameObject.SetActive(otherActive);

                        Debug.Log("switched device ID of " + _steamTrackedObjects[i].gameObject.name
                                  + " (now " + deviceId + ") and " + _steamTrackedObjects[indexOfData2Change].gameObject.name + " (now " + data2Change.id + ")");
                        _trackedObjectData[i] = data;
                        _trackedObjectData[indexOfData2Change] = data2Change;

                        changed = true;
                    }
                }
                if (isActive != _lastActive[i])
                {
                    _lastActive[i] = isActive;

                    changed = true;
                }

                var streamAnyway = Logging.State == Logging.LogState.Playing || Logging.State == Logging.LogState.PlayingPause;
                if (!streamAnyway && (!_steamTrackedObjects[i].isValid || !isActive))
                {
                    continue;
                }

                if (_offsets[i].AnyDependencyViolated())
                {
                    continue;
                }
                data.pos = _offsets[i].Child.position;
                data.rot = (streamAnyway ? _offsets[i].Child.rotation * Quaternion.Euler(TrackableRotationInitial) : _offsets[i].Child.rotation);
                ts.Add(data);
            }

            if (changed)
            {
                NotifyTcpServerMappingChanged();
                Logging.SetTrackedObjects(_steamTrackedObjects);
            }

            TrackedObjectData[] tsa = ts.ToArray();
            if (StreamData)
            {
                byte[] msg = ToByteArray(tsa);
                if (_socket != null && ts.Count != 0)
                {
                    if (UseCustomIps)
                    {
                        foreach (var clientEndPoint in _clientEndPoints)
                        {
                            _socket.SendTo(msg, clientEndPoint);
                        }
                    }
                    else
                    {
                        _socket.SendTo(msg, _endPoint);
                    }
                }
            }

            //log stuff
            Logging.TryLog(tsa, _lastDict);
            Logging.TryAlter(ref _steamTrackedObjects);
        }