在网络有些当中服务端负责数据的处理,和逻辑运算。客户端仅仅是负责绘制服务端计算过后的图像下面想大家展示服务端和客户端的代码:
/*
* 简单的网络游戏代码
*
* 功能: server端代码
* 时间: 2012.12.31
* 开发: Nick Zhou
*
*
* 网络游戏中的所有的的逻辑运算和数据处理,全部是由服务器完成的,客户端只负责绘制
* 在客户端中能看到自己和其他物体的变化
*
*/
using UnityEngine;
using System.Collections;
public class ServerGame : MonoBehaviour {
private int port=1000; //端口号
private string message = ""; //聊天的信息
private string MoveInfo = ""; //移动的信息
//滚动试图的位置
Vector2 scrollPosition;
// Use this for initialization
//支持中文;
void OnGUI()
{
//网络连接的状态
switch (Network.peerType)
{
case NetworkPeerType.Disconnected: //服务状态未开启
//开启服务状态
StartServer();
break;
case NetworkPeerType.Connecting: //正在连接
break;
case NetworkPeerType.Server: //成功连接至服务端
OnServer();
break;
case NetworkPeerType.Client: //成功连接至客户端
break;
}
}
//创建服务器
void StartServer()
{
if (GUILayout.Button("创建本机服务器"))
{
//创建本机服务器,并允许最大10个客户端连接
NetworkConnectionError error = Network.InitializeServer(10, port, false);
//如果连接失败 将错误信息打印出来
Debug.Log("连接状态:" + error);
}
}
void OnServer()
{
GUILayout.Label("服务器创建完毕,等待客户端连接");
int leng = Network.connections.Length;
Debug.Log(leng);
for (int i = 0; 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(200), GUILayout.Height(Screen.height));
GUILayout.Box(message);
//显示玩家移动信息
GUILayout.Box(MoveInfo);
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+"移动事件";
}
}
客户端代码:
/*
* 简单的网络游戏代码
*
* 功能: client端代码
* 时间: 2012.12.31
* 开发: Nick Zhou
*
*
* 网络游戏中的所有的的逻辑运算和数据处理,全部是由服务器完成的,客户端只负责绘制
* 在客户端中能看到自己和其他物体的变化
*
*/
using UnityEngine;
using System.Collections;
public class ClientGame : MonoBehaviour {
//服务器的Ip地址
string Ip = "127.0.0.1";
//端口
int port = 1000;
//输入的信息
string inputMessage = "请输入信息";
//接收到的信息
string ReMessage = "";
//滚动的试图位置
Vector2 scrollpostion;
//移动的速度
float speed = 10.0f;
//旋转的速度
float rocationSpeed = 100.0f;
//主角控制模型
GameObject cubeContral = null;
//对方控制模型
GameObject cubeUnContral = null;
// Use this for initialization
//支持中文;
void Start () {
cubeContral = GameObject.Find("Cube0");
cubeUnContral = GameObject.Find("Cube1");
}
// Update is called once per frame
void Update () {
}
void FixedUpdate() {
//如果是客户端
if (Network.isClient)
{
float translation = Input.GetAxis("Vertical");
float roation = Input.GetAxis("Herizontal ");
if (translation==1)
{
//使用RPC发送向前移动事件
networkView.RPC("RequestMove", RPCMode.All, "up");
}
if (translation==-1)
{
//使用RPC发送向后移动事件
networkView.RPC("RequestMove", RPCMode.All, "down");
}
if (roation==1)
{
//使用RPC发送向左旋转事件
networkView.RPC("RequestMove", RPCMode.All, "left");
}
if (roation==-1)
{
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, port);
//如果连接失败。将错误信息打印出来
Debug.Log("连接状态:" + error);
}
}
void OnClient() {
//创建一个滚动视图,用来显示聊天信息
scrollpostion = GUILayout.BeginScrollView(scrollpostion,GUILayout.Width(200),GUILayout.Height(500) );
//显示聊天信息
GUILayout.Box(ReMessage);
//创建水平方向视图
GUILayout.BeginHorizontal();
inputMessage = GUILayout.TextArea(inputMessage); //编辑输入的内容
//发送内容
if (GUILayout.Button("发送消息"))
{
networkView.RPC("RequestMessage", RPCMode.All, inputMessage); //使用RPC发送的内容
}
//接收水平方向视图
GUILayout.EndHorizontal();
//断开连接
if (GUILayout.Button("断开连接"))
{
Network.Disconnect(); //断开连接
ReMessage = ""; //归零聊天信息
}
GUILayout.EndScrollView(); //结束滚动视图
}
//接收消息
[RPC]
void RequestMessage( string message,NetworkMessageInfo Info) {
ReMessage+="\n"+"发送者 "+Info.sender+":"+message;
}
//接收模型移动消息
[RPC]
void RequestMove(string message,NetworkMessageInfo Info)
{
string sender = Info.sender.ToString();
GameObject moveObject = null;
//自己移动事件
if (sender == "-1")
{
moveObject = cubeContral;
}
else
{
moveObject = cubeUnContral;
}
//根据消息判断事件类型
int vertical = 0;
int horizontal = 0;
switch (message)
{
case "up":
vertical = 1;
break;
case "down":
vertical = -1;
break;
case "left":
horizontal = 1;
break;
case "right":
horizontal = -1;
break;
default:
break;
}
//移动角色
float translation = vertical * speed * Time.deltaTime;
float rotation = horizontal * rocationSpeed * Time.deltaTime;
moveObject.gameObject.transform.Translate(0, 0, translation);
moveObject.gameObject.transform.Rotate(0, rotation, 0);
}
}