// Update is called once per frame void Update() { if (!connected) { return; } // Wating for Param#1 Microseconds to check is there any data send from server. // 1 second == 1000 Millisecond == 1000 * 1000 Microseconds if (socket.Poll(10000, SelectMode.SelectRead)) { try { byte[] data = SockRecv(); CodedInputStream stream = CodedInputStream.CreateInstance(data); CodeBattle.Marine marine = CodeBattle.Marine.ParseFrom(stream); print("Receive: " + marine); } catch (Exception e) { print(e); connected = false; return; } } if (Input.GetKeyDown(KeyCode.A)) { byte[] data = PackData(id++); try { SockSend(data); } catch { print("Socket Send Error"); } } }
byte[] PackData(int id) { CodeBattle.Marine.Builder marineBuilder = new CodeBattle.Marine.Builder(); CodeBattle.Position.Builder positionBuilder = new CodeBattle.Position.Builder(); marineBuilder.Id = id; marineBuilder.Hp = 99; positionBuilder.X = 1; positionBuilder.Y = 2; positionBuilder.Z = 3; marineBuilder.Position = positionBuilder.BuildPartial(); CodeBattle.Marine marine = marineBuilder.BuildPartial(); byte[] buffer = new byte[marine.SerializedSize]; CodedOutputStream stream = CodedOutputStream.CreateInstance(buffer); marine.WriteTo(stream); byte[] binary = new byte[buffer.Length + 4]; int len = IPAddress.HostToNetworkOrder(buffer.Length); byte[] lenBytes = BitConverter.GetBytes(len); lenBytes.CopyTo(binary, 0); buffer.CopyTo(binary, 4); return(binary); }
// Use this for initialization void Start() { IPAddress ipAddress = IPAddress.Parse(ip); socket = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp ); try { socket.Connect(new IPEndPoint(ipAddress, port)); // In my test, Connect method NEVER thrown an exception even // there were wrong ip, port. // So, for determine whether we have connected to the server // we must do some IO opprate. means send and recv. // Actually, There is necessary send data here, // For verification or something else byte[] data = PackData(id++); SockSend(data); byte[] recv = SockRecv(); CodeBattle.Marine marine = CodeBattle.Marine.ParseFrom(recv); print(marine); connected = true; } catch { print("NewWorking NOT work!"); } }
void OperateMarine(CodeBattle.Marine marine) { Marine MarineScript = (Marine)marines[marine.Id]; if (MarineScript.status == CodeBattle.Status.Dead) { return; } ; MarineScript.status = marine.Status; MarineScript.hp = marine.Hp; if (marine.Status == CodeBattle.Status.Run) { MarineScript.SetTargetPosition(marine.TargetPosition.X, marine.TargetPosition.Z); } else if (marine.Status == CodeBattle.Status.GunAttack) { MarineScript.SetGunShootPosition(marine.TargetPosition.X, marine.TargetPosition.Z); CollectionAndReportMarineStates(marine.Id, CodeBattle.Observer.ReportEnum.gunattack); } else if (marine.Status == CodeBattle.Status.Flares) { CollectionAndReportMarineStates(marine.Id, CodeBattle.Observer.ReportEnum.flares); StartCoroutine(MarineFlaresReport(marine.Id)); } }