分享

Unity网络通信(三)同步物体

 3dC 2014-01-28
using UnityEngine; 
using System.Collections; 
 
public class cube_move : MonoBehaviour { 
 
    string IP = "192.168.1.6"
    int Port = 10100
 
    int moveSpeed = 16
 
    GameObject cube01 = null
    GameObject cube02 = null
 
    GameObject myself = null
    GameObject another = null
 
    // Use this for initialization 
    void Start () { 
        cube01 = GameObject.Find("Cube01"); 
        cube02 = GameObject.Find("Cube02"); 
    } 
 
    //OnGUI方法,所有GUI的绘制都需要在这个方法中实现 
    void OnGUI() { 
        //Network.peerType是端类型的状态: 
        //即disconnected, connecting, server 或 client四种 
        switch(Network.peerType) { 
            //禁止客户端连接运行, 服务器未初始化 
        case NetworkPeerType.Disconnected: 
            StartServer(); 
            break
            //运行于服务器端 
        case NetworkPeerType.Server: 
            OnServer(); 
            break
            //运行于客户端 
        case NetworkPeerType.Client: 
            break
            //正在尝试连接到服务器 
        case NetworkPeerType.Connecting: 
            break
        } 
    } 
 
    void StartServer() { 
        GUILayout.Label("同步测试:"); 
        //当用户点击按钮的时候为true 
        if (GUILayout.Button("创建服务器")) { 
            //初始化本机服务器端口,第一个参数就是本机接收多少连接 
            NetworkConnectionError error = Network.InitializeServer(12,Port,false); 
            //连接状态 
            switch(error) { 
            case NetworkConnectionError.NoError: 
                break
            default
                Debug.Log("服务端错误"+error); 
                break
            } 
        } 
        if (GUILayout.Button("连接服务器")) { 
            NetworkConnectionError error = Network.Connect(IP,Port); 
            //连接状态 
            switch(error) { 
            case NetworkConnectionError.NoError: 
                break
            default
                Debug.Log("客户端错误"+error); 
                break
            } 
        } 
    } 
 
    void OnServer() { 
        GUILayout.Label("服务端已经运行,等待客户端连接"); 
        //Network.connections是所有连接的玩家, 数组[] 
        //取客户端连接数. 
        int length = Network.connections.Length; 
        //按数组下标输出每个客户端的IP,Port 
        for (int i=0; i<length; i++) { 
            GUILayout.Label("客户端"+i); 
            GUILayout.Label("客户端ip"+Network.connections[i].ipAddress); 
            GUILayout.Label("客户端端口"+Network.connections[i].port); 
            GUILayout.Label("-------------------------------"); 
        } 
        //当用户点击按钮的时候为true 
        if (GUILayout.Button("断开服务器")) { 
            Network.Disconnect(); 
        } 
    } 
 
    //接收请求的方法. 注意要在上面添加[RPC] 
    [RPC] 
    void ProcessMove(string msg, NetworkMessageInfo info) { 
        //刚从网络接收的数据的相关信息,会被保存到NetworkMessageInfo这个结构中 
        string sender = info.sender.ToString(); 
        //看脚本运行在什么状态下 
        NetworkPeerType status = Network.peerType; 
        if (status == NetworkPeerType.Server) { 
            myself = cube01;  //假如运行在server状态下, 那么自己就是cube1 
            another = cube02; 
 
        } else { 
            myself = cube02;  //假如运行在client状态下, 那么自己就是cube2 
            another = cube01; 
        } 
        //假如是自己发送的信息 
        if (sender == "-1") { 
            if (msg == "W") { 
                myself.transform.Translate(Vector3.forward * Time.deltaTime * moveSpeed); 
            } 
            if (msg == "S") { 
                myself.transform.Translate(Vector3.back * Time.deltaTime * moveSpeed); 
            } 
            if (msg == "A") { 
                myself.transform.Translate(Vector3.left * Time.deltaTime * moveSpeed); 
            } 
            if (msg == "D") { 
                myself.transform.Translate(Vector3.right * Time.deltaTime * moveSpeed); 
            } 
        } 
        //假如是别人发送的信息 
        else { 
            if (msg == "W") { 
                another.transform.Translate(Vector3.forward * Time.deltaTime * moveSpeed); 
            } 
            if (msg == "S") { 
                another.transform.Translate(Vector3.back * Time.deltaTime * moveSpeed); 
            } 
            if (msg == "A") { 
                another.transform.Translate(Vector3.left * Time.deltaTime * moveSpeed); 
            } 
            if (msg == "D") { 
                another.transform.Translate(Vector3.right * Time.deltaTime * moveSpeed); 
            } 
        } 
    } 
    // Update is called once per frame 
    void Update () { 
        //前移 
        if (Input.GetKeyDown(KeyCode.W)) { 
            Debug.Log("wwwwwwwww|"); 
            networkView.RPC("ProcessMove", RPCMode.All, "W"); 
        } 
        if (Input.GetKey(KeyCode.W)) { 
            networkView.RPC("ProcessMove", RPCMode.All, "W"); 
        } 
        //后退 
        if (Input.GetKeyDown(KeyCode.S)) { 
            Debug.Log("sssssssss!"); 
            networkView.RPC("ProcessMove", RPCMode.All, "S"); 
        } 
        if (Input.GetKey(KeyCode.S)) { 
            networkView.RPC("ProcessMove", RPCMode.All, "S"); 
        } 
        //向左移动 
        if (Input.GetKeyDown(KeyCode.A)) { 
            networkView.RPC("ProcessMove", RPCMode.All, "A"); 
        } 
        if (Input.GetKey(KeyCode.A)) { 
            networkView.RPC("ProcessMove", RPCMode.All, "A"); 
        } 
        //向右移动 
        if (Input.GetKeyDown(KeyCode.D)) { 
            networkView.RPC("ProcessMove", RPCMode.All, "D"); 
        } 
        if (Input.GetKey(KeyCode.D)) { 
            networkView.RPC("ProcessMove", RPCMode.All, "D"); 
        } 
    } 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多