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 ThingMsg.id: HandleThingEvent(e); break; } } protected virtual void HandleThingEvent(RoboidControl.Participant.UpdateEvent e) { switch (e.thing) { case RoboidControl.TouchSensor coreTouchSensor: Debug.Log("Handle TouchSensor"); TouchSensor touchSensor = TouchSensor.Create(coreTouchSensor); coreTouchSensor.component = touchSensor; break; case RoboidControl.DifferentialDrive coreDrive: Debug.Log("Handle Diff.Drive"); 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: Debug.Log("Handle Thing"); if (coreThing.component == null) { Thing[] things = FindObjectsByType(FindObjectsSortMode.None); Debug.Log(things.Length); Thing thing = things.FirstOrDefault(t => t.core != null && t.core.id == coreThing.id); if (thing == null) thing = Thing.Create(coreThing); coreThing.component = thing; } break; } } } }