コード例 #1
0
    // 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");
            }
        }
    }
コード例 #2
0
    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);
    }
コード例 #3
0
    // 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!");
        }
    }
コード例 #4
0
    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));
        }
    }