send message to remove deleted scene objects when a new player loads

handTracking
Kyle Johnsen 2022-01-04 19:04:16 -05:00
parent 001e89509f
commit 57310f180c
4 changed files with 48 additions and 13 deletions

View File

@ -25,7 +25,8 @@ public class NetworkManager : MonoBehaviour
public Action<NetworkPlayer> onPlayerLeft = delegate { };
public List<NetworkObject> prefabs = new List<NetworkObject>();
NetworkObject[] sceneObjects;
public NetworkObject[] sceneObjects;
public List<string> deletedSceneObjects = new List<string>();
public Dictionary<string, NetworkObject> objects = new Dictionary<string, NetworkObject>(); //maintains a list of all known objects on the server (ones that have ids)
NetworkPlayer masterPlayer = null;
#endregion
@ -96,7 +97,7 @@ public class NetworkManager : MonoBehaviour
{
//we got a left message, kill it
//change ownership of all objects to
//change ownership of all objects to master
foreach (KeyValuePair<string, NetworkObject> kvp in objects)
{
@ -126,6 +127,7 @@ public class NetworkManager : MonoBehaviour
player.manager = this;
players.Add(m.sender, player);
onPlayerJoined(player);
}
}
}
@ -147,6 +149,7 @@ public class NetworkManager : MonoBehaviour
{
sceneObjects[i].networkId = -1 + "-" + i;
sceneObjects[i].owner = masterPlayer;
sceneObjects[i].isSceneObject = true; //needed for special handling when deleted
objects.Add(sceneObjects[i].networkId,sceneObjects[i]);
}
@ -380,4 +383,18 @@ public class NetworkManager : MonoBehaviour
{
SendNetworkMessage("5:" + groupname + ":" + String.Join(":", userids));
}
public void deleteNetworkObject(string networkId)
{
if (objects.ContainsKey(networkId))
{
NetworkObject obj = objects[networkId];
if (obj.isSceneObject)
{
deletedSceneObjects.Add(networkId);
}
GameObject.Destroy(obj.gameObject);
objects.Remove(networkId);
}
}
}

View File

@ -10,5 +10,6 @@ public abstract class NetworkObject: MonoBehaviour
public NetworkPlayer owner;
public string networkId; //this is forged from the combination of the creator's id (-1 in the case of a scene object) and an object id, so it's always unique for a room
public string prefabName; //this may be empty if it's not a prefab (scene object)
public bool isSceneObject=false;
public abstract void handleMessage(string identifier, byte[] message);
}

View File

@ -34,6 +34,8 @@ public class NetworkPlayer : MonoBehaviour, Dissonance.IDissonancePlayer
public List<int> closePlayers = new List<int>(); //for testing audio communications
public bool changeClosePlayers = true;
void Start()
{
myObject.owner = this;
@ -63,7 +65,6 @@ public class NetworkPlayer : MonoBehaviour, Dissonance.IDissonancePlayer
}
}
public void handlePlayerJoined(NetworkPlayer player)
@ -79,6 +80,12 @@ public class NetworkPlayer : MonoBehaviour, Dissonance.IDissonancePlayer
}
}
if (isMaster)
{
//send a list of scene object ids when someone joins
sendSceneUpdate();
}
}
}
@ -189,15 +196,21 @@ public class NetworkPlayer : MonoBehaviour, Dissonance.IDissonancePlayer
break;
}
case "8": //I'm trying to destroy a gameobject I own (I guess this is sent to everyone)
case "8": //I'm trying to destroy a gameobject I own
{
string networkId = sections[1];
if (manager.objects.ContainsKey(networkId) && manager.objects[networkId].owner == this)
{
GameObject.Destroy(manager.objects[networkId].gameObject);
manager.objects.Remove(networkId);
manager.deleteNetworkObject(networkId);
break;
}
case "9": //deleted scene objects
{
for (int k = 1; k < sections.Length; k++)
{
manager.deleteNetworkObject(sections[k]);
}
break;
}
}
@ -278,6 +291,7 @@ public class NetworkPlayer : MonoBehaviour, Dissonance.IDissonancePlayer
{
if (!manager.objects.ContainsKey(networkId) || manager.objects[networkId].owner != this || !isLocal) return; //must be the local owner of the object to destroy it
manager.sendTo(NetworkManager.MessageType.ALL_ORDERED, "8," + networkId); //send to all, which will make me delete as well
}
public void takeOwnership(string networkId)
@ -289,5 +303,11 @@ public class NetworkPlayer : MonoBehaviour, Dissonance.IDissonancePlayer
}
public void sendSceneUpdate()
{
manager.sendTo(NetworkManager.MessageType.OTHERS, "9," + string.Join(",", manager.deletedSceneObjects));
}
}

View File

@ -64,9 +64,6 @@ Clients can manage network traffic using messaging groups. This is especially u
Todo:
Scene objects that are destroyed need to be buffered to new clients.
Instantiation byte[] (full sync, basically).
Need to determine what happens when you specifically leave a room (session).