using UnityEngine; using System.Linq; namespace RoboidControl.Unity { public class Participant : MonoBehaviour { public string ipAddress; public int port; public RoboidControl.Participant coreParticipant; protected virtual void Update() { if (coreParticipant == null) return; if (coreParticipant.updateQueue.TryDequeue(out RoboidControl.Participant.UpdateEvent e)) HandleUpdateEvent(e); } private void HandleUpdateEvent(RoboidControl.Participant.UpdateEvent e) { switch (e.messageId) { case ParticipantMsg.Id: GameObject remoteParticipant = new GameObject("RemoteParticipant"); Participant participant = remoteParticipant.AddComponent(); participant.coreParticipant = e.participant; participant.coreParticipant.component = participant; if (participant.coreParticipant is ParticipantUDP participantUDP) { participant.ipAddress = participantUDP.ipAddress; participant.port = participantUDP.port; } break; case ThingMsg.id: HandleThingEvent(e); break; default: Debug.Log($"Unhandled event: {e.messageId}"); break; } } protected virtual void HandleThingEvent(RoboidControl.Participant.UpdateEvent e) { switch (e.thing) { case RoboidControl.TouchSensor coreTouchSensor: TouchSensor touchSensor = TouchSensor.Create(coreTouchSensor); coreTouchSensor.component = touchSensor; break; case RoboidControl.DifferentialDrive coreDrive: DifferentialDrive differentialDrive = DifferentialDrive.Create(coreDrive); coreDrive.component = differentialDrive; break; case RoboidControl.Motor coreMotor: Motor wheel = Motor.Create(coreMotor); coreMotor.component = wheel; // We need to know the details (though a binary msg) // before we can create the wheel reliably break; case RoboidControl.Thing coreThing: if (coreThing.component == null) { Thing[] things = FindObjectsByType(FindObjectsSortMode.None); // Debug.Log(things.Length); Thing thing = things.FirstOrDefault(t => t != null && t.core != null && t.core.owner.networkId == coreThing.owner.networkId && t.core.id == coreThing.id ); if (thing == null) thing = Thing.Create(coreThing); coreThing.component = thing; } break; } } } }