Unity3D精简版网络游戏雏形(简单网络通信聊天和角色监视案例)

时间:2022-01-05 00:14:32

Unity3D精简版网络游戏雏形(简单网络通信聊天和角色监视案例)

还是把代码贴出来吧,不知道怎么上传附件。。

下面是服务器端的代码:

using UnityEngine;
using System.Collections;
public class Script_FWQ : MonoBehaviour
{
//端口号
    int Port = 10000;
    //聊天信息
    string Message = "";
    //移动信息
    string MoveInfo = "";
    //滚动试图位置
    Vector2 scrollPosition;
    void OnGUI() { 
    //网络连接状态
        switch (Network.peerType) {
            //服务器未开启状态
            case NetworkPeerType.Disconnected:
                StartServe();
                break;
            //成功连接服务器端状态
            case NetworkPeerType.Server:
                OnServer();
                break;
            //成功连接客户端状态
            case NetworkPeerType.Client:
                break;
            //正在尝试连接状态
            case NetworkPeerType.Connecting:
                break;
        }
    }
    //创建本机服务器端
    void StartServe() {
        if (GUILayout.Button("创建本机服务器端")) {
            //创建服务器,允许连接10台主机客户端
            NetworkConnectionError error = Network.InitializeServer(10,Port,false);
            //InitializeServer(1,2,3):说明:1,允许的入站连接或玩家的数量,主机端口;2,要监听的端口 ;3,useNat设置NAT穿透功能
            Debug.Log("连接状态"+error);
        }
    }
    void OnServer() {
        GUILayout.Label("服务器创建完毕,等待客户端连接");
        //得到客户端连接的数量
        int length = Network.connections.Length;
        for (int i = 0; i < length; i++) {
            GUILayout.Label("连接服务器客户端ID"+i);
            GUILayout.Label("连接服务器客户端IP"+Network.connections[i].ipAddress);
            GUILayout.Label("连接服务器客户端端口号"+Network.connections[i].port);
        }
        if (GUILayout.Button("断开服务器")) {
            Network.Disconnect();
            //重置聊天信息
            Message = "";
            MoveInfo = "";
        }
        //创建滚动视图,用来显示聊天信息
        scrollPosition = GUILayout.BeginScrollView(scrollPosition,GUILayout.Width(400),GUILayout.Height(800));
        //显示聊天信息
        GUILayout.Box(Message);
        GUILayout.EndScrollView();
    }
    //接收消息
    [RPC]
    void RequestMessage(string message, NetworkMessageInfo info) {
        Message += "\n" + "发送者" + info.sender + ":" + message;
    }
    //接收到模型移动的消息
    [RPC]
    void RequestMove(string message,NetworkMessageInfo info) {
        MoveInfo += "\n" + "移动者" + info.sender + ":执行了" + message + "移动事件";
    }
}

下面这个是客户端的代码:

using UnityEngine;
using System.Collections;
public class Script_KHD : MonoBehaviour
{
    //服务器的IPd地址,这里的IP需要更改成本机的IP地址
    string IP = "10.137.7.3";
    //端口号
    int Prot = 10000;
    //输入信息
    string inputMessage = "请输入信息!";
    //接收到的消息
    string Message = "";
    //滚动试图的位置
    Vector2 scrollPosition;
    //移动速度
    float speed = 10.0f;
    //旋转速度
    float rotationSpeed = 100.0f;
    //主角控制的模型
    GameObject cube0 = null;
    //对方控制的模型
    GameObject cube1 = null;
    void Start() {
        cube0 = GameObject.Find("Cube0");
        cube1 = GameObject.Find("Cube1");
    }
    void FixedUpdate() {
        if (Network.isClient) {
            float translation = Input.GetAxis("Vertical");
            float Rotation = Input.GetAxis("Horizontal");
            if (translation == 1) {
                //使用RPG发送向前的移动信息
                networkView.RPC("RequestMove", RPCMode.All, "up");
            }
            if (translation == -1) {
                //使用RPG发送向后的移动信息
                networkView.RPC("RequestMove", RPCMode.All, "down");
            }
            if (Rotation ==1) {
                //使用RPG发送向左的旋转信息
                networkView.RPC("RequestMove",RPCMode.All,"left");
            }
            if (Rotation == -1) {
                //使用RPG发送向右的旋转信息
                networkView.RPC("RequestMove",RPCMode.All,"right");
            }
        }
    }
    //连接服务器状态
    void OnGUI() {
        switch (Network.peerType) {
            //成功连接运行于客户端
            case NetworkPeerType.Client:
                OnClient();
                break;
            //正在尝试连接
            case NetworkPeerType.Connecting:
                break;
            //服务器未开启状态
            case NetworkPeerType.Disconnected:
                StartConnect();
                break;
            //成功连接运行于服务器端
            case NetworkPeerType.Server:
                break;
            default:
                break;
        }
    }
    //连接服务器
    void StartConnect() {
        if (GUILayout.Button("加入游戏")) {
            NetworkConnectionError error = Network.Connect(IP, Prot);
            Debug.Log("连接状态"+error);
        }
    }
    //客户端运行内容
    void OnClient() {
        //开始创建滚动视图,用来显示聊天信息
        scrollPosition = GUILayout.BeginScrollView(scrollPosition,GUILayout.Width(400),GUILayout.Height(800));
        //显示聊天信息
        GUILayout.Box(Message);
        //开始创建水平视图
        GUILayout.BeginHorizontal();
        //编辑输入内容
        inputMessage = GUILayout.TextArea(inputMessage);
        //发送内容
        if (GUILayout.Button("发送信息")) {
            //使用RPG发送内容
            networkView.RPC("RequestMessage", RPCMode.All, inputMessage);
        }
        //结束创建水平视图
        GUILayout.EndHorizontal();
        //断开连接
        if (GUILayout.Button("断开连接")) {
            Network.Disconnect();
        }
        //结束创建滚动视图
        GUILayout.EndScrollView();
    }
    //接收消息
    [RPC]
    void RequestMessage(string message, NetworkMessageInfo info) {
        Message += "\n" + "发送者" + info.sender + ":" + message;
    }
    //接收模型的移动信息
    [RPC]
    void RequestMove(string message,NetworkMessageInfo info) {
        string sender = info.sender.ToString();
        GameObject moveObject = null;
        //自己移动的事件
        if (sender =="1") {
            moveObject = cube0;
        }
        //其他玩家的移动事件
        else {
            moveObject = cube1;
        }
        //根据消息判断事件类型
        int vertical = 0;
        int horizontal = 0;


        if (message == "up") {
            //向前
            vertical = 1;
        }
        if (message == "down") {
            //向后
            vertical = -1;
        }
        if (message == "left") {
            //向左旋转
            horizontal = 1;
        }
        if (message == "right") {
            //向右旋转
            horizontal = -1;
        }
        //移动角色
        float translation = vertical * speed * Time.deltaTime;
        float rotation = horizontal * rotationSpeed * Time.deltaTime;
        moveObject.gameObject.transform.Translate(0,0,translation);
        moveObject.gameObject.transform.Rotate(0,rotation,0);
    }
}