2014-04-20 20:06:50 inspironx 阅读数 5280
  • unity3D-游戏/AR/VR在线就业班

    本套课程是一套完整的 Unity3D-游戏/AR/VR 学习课程,具体的课程内容包括《C#语言》、《Unity引擎》、《编程思想》,《商业级项目实践》等开发课程,引导您一步步循序渐进、由易到难,终获得Unity 3D/游戏/AR/VR工程师的岗位技能。

    12814 人正在学习 去看看 宋晓波

首先个人说说题外话,Unity3d使用的网络库核心是用C++实现的一款商业网络游戏引擎库,

RakNet。所以对于移动设备来说,用Unity3d来写服务器是完全可以的,并且内建网络库的各项功能封装完善。

对于一款ARGP都可以轻松的上手来写服务器,游戏对象的处理或者同步对象使用RPC,

对于一般的手游来说省了不少的麻烦事。

其网络性能也不亚于普通的HTTP传输协议


Unity3d中的内建网络核心是使用Network函数,使用Network可以创建一个服务器,

也可以建立一个到服务器的连接,使用Network.InitalizeServer(int maxConns, listenPort, boo useNat)来初始化一个服务器,

这里只是指定了本地服务器的端口,并没有指定ip地址,如果是本机,直接使用127.0.0.1即可。

如果电脑已经联网,Unity3d会指定公网IP地址,或者127.0.0.1,作为服务器默认连接地址。

如果服务器初始化成功,在Network的回调函数中,会调用

void OnServerInitialized(),如果初始化失败,直接报错误信息。


使用Network.Connect(ip, port)可以简单的连接到一个已经开始的服务端,如果连接服务器成功,则会回调

void OnConnectedToServer(), 如果连接服务器失败,则会回调

void OnFailedToConnect(NetworkConnectionError error),函数里面封装了错误信息。


并且对游戏对象的销毁处理也很方便,省了对服务器的压力。比如一个多人同时在线的网络,有一个即时游戏公告

希望在线的玩家以及当前不在线的玩家都可以看到,在使用Unity3d的内建功能当服务器时,可以直接缓存公告

直到玩家上线,然后给玩家展示。

还有比如,有玩家下线。对于当前玩家的游戏即时缓存已经没有了作用,并且会占用服务器的资源。

你可以在回调函数里直接销毁任何玩家有当前下线玩家信息的玩家。然后通知服务器自己来销毁。

这也是RPC的强大之处。

还有ARPG游戏中创建房间是一件比较麻烦头痛的事情,而在Unity3d内建网络库里,你可以直接迁移主机信息,

可以暂时将服务器由客户端来托管。还有网络数据同步回调,特别对NetworkView,可以说用Unity3d来写服务器

是一个很不错的选择。相信Unity3d,他不是一个免费软件。

自动写了一个简单的服务器创建与客户端连接的实例:

	public void StartSvr () {
		if (Network.peerType == NetworkPeerType.Disconnected) {
			print("start init & start svr.");

			Network.InitializeServer(32, port, false);
		}
	}

	public void StartUsr () {
//		if (Network.peerType == NetworkPeerType.Connecting) {
		print("svr running noramlize.");
		Network.Connect("192.168.6.185", port);
//		}
	}



	// callback state for svr
	void OnServerInitialized() {
		print("Server initialized and ready.");
	}

	void OnPlayerDisconnected(NetworkPlayer player) {
		Debug.Log("Clean up after player " + player);
		Network.RemoveRPCs(player);
		Network.DestroyPlayerObjects(player);
	}

	private int playerCount = 0;
	void OnPlayerConnected(NetworkPlayer player) {
		Debug.Log("Player " + playerCount++ + " connected from " + player.ipAddress + ":" + player.port);
	}
	// callback svr end


	// callback state for usr
	void OnConnectedToServer() {
		Debug.Log("Connected to server");
	}

	void OnDisconnectedFromServer(NetworkDisconnection info) {
		if (Network.isServer)
			Debug.Log("Local server connection disconnected");
		else
			if (info == NetworkDisconnection.LostConnection)
				Debug.Log("Lost connection to the server");
		else
			Debug.Log("Successfully diconnected from the server");
	}

	void OnFailedToConnect(NetworkConnectionError error) {
		Debug.Log("Could not connect to server: " + error);
	}
	// callback usr end


:)

2014-04-22 22:05:15 inspironx 阅读数 4619
  • unity3D-游戏/AR/VR在线就业班

    本套课程是一套完整的 Unity3D-游戏/AR/VR 学习课程,具体的课程内容包括《C#语言》、《Unity引擎》、《编程思想》,《商业级项目实践》等开发课程,引导您一步步循序渐进、由易到难,终获得Unity 3D/游戏/AR/VR工程师的岗位技能。

    12814 人正在学习 去看看 宋晓波

这里是所有Unity3d在网络中能用到相关的类及方法,纵观参数功能,

Unity3d来写一个手游是不二的选择:





RPC 可以传递的参数
int
float
string
NetworkPlayer
NetworkViewID
Vector3
Quaternion

BitStream可以传递的参数
void Serialize (bool value)
void Serialize (char value) - only one byte [0, 255]
void Serialize (short value)
void Serialize (int value)
void Serialize (float value, float maxDelta = 0.00001f);
void Serialize (Quaternion value, float maxDelta = 0.00001f);
void Serialize (Vector3 value, float maxDelta = 0.00001f);
void Serialize (NetworkPlayer value)
void Serialize (NetworkViewID viewID)

RPCMode:
Server - only server
Others - send to everyone except the sender
OthersBuffered - Send to everyone except sender and adds to the buffer
All - send to everyone
AllBuffered - Sends to everyone and adds to the buffer

Network:
Network.AllocateViewID - 自动生成一个可用的viewid
Network.CloseConnection - 关闭当前连接
Network.Connect - 连接到指定端口或者域名
Network.connections -当前网络的连接数
Network.connectionTesterIP - 测试连接者的IP连接到服务器
Network.connectionTesterPort - 测试连接者的端口到服务器 (Debug)
Network.Destroy - 销毁跟当前viewID有关的网络连接
Network.DestroyPlayerObjects - 销毁跟当前Viewid有关的玩家物体
Network.Disconnect - 关闭所有已经连接好的连接,关闭网络网络接口
Network.GetAveragePing - ping 指定连接的玩家
Network.GetLastPing - 获取最后ping通的玩家
Network.HavePublicAddress - 检查当前机器是否有一个公共IP地址
Network.incomingPassword - 设置服务器的连接密码
Network.InitializeSecurity - 设置服务器加密,自动加密处理
Network.InitializeServer - 初始化服务器
Network.Instantiate - 实例化一个已经存在的prefab
Network.isClient - 判断当前的运行是否为客户端
Network.isMessageQueueRunning - 是否取消RPC访问或者取消网络数据同步
Network.isServer - 判断当前的运行是否为服务器
Network.logLevel - 设置当前网络信息的日志信息等级(sys)
Network.macConnections - 设置服务器可以连接的最大数或者游戏玩家数目
如果设置成0表示只有已经一个连接存在,设置成-1表示最大的连接数与当前
连接数相等,如果是这样,如果玩家失去连接,则服务器的位置将会为玩家
继续保留下来
Network.mininumAllocatableViewIDs - 设置最小从服务器获取的viewid数量*
Network.natFacilitatorIP - 使用网络穿透的IP地址
Network.natFacilitatorPort - 设置网络穿透的端口号
Network.OnConnectedToServer - [client]当连接服务器成功时调用
Network.OnDisconnectedFromServer - [client&svr]当服务器断开连接时调用
Network.OnFailedToConnect - [client]当客户端连接失败时
Network.OnNetworkInstantiate - [client|svr]当网络实例化一个对象调用
Network.OnPlayerConnected - [svr]当有一个新的玩家连接到服务器时
Network.OnPlayerDisconnected - [svr]当有玩家离开游戏时
Network.OnSerializeNetworkView - [client|svr]通过network view同步变量*
[void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info)
Network.OnServerInitialized - [svr]当服务器初始化成功时
Network.peerType - 网络对等状态
Network.player - 得到当前的NetworkPlayer实例引用
Network.proxyIP - 代理服务器的IP地址
Network.proxyPassword - 代理服务器的密码
Network.proxyPort - 代理服务器的端口号
Network.RemoveRPCs - 从服务器那里移除所有跟当前玩家相关的RPC方法
Network.RemoveRPCsInGroup - 从服务器那里移除跟当前组有关RPC方法
Network.sendRate - 网络同步的发送频率
Network.SetLevelPrefix - 设置网络前辍,将应用到所有viewid
Network.SetReceivingEnabled - 设置指定玩家的分组信息是否可以接收
Network.SetSendingEnable - 设置指定玩家的分组信息是否可以发送
Network.TestConnection - 测试当前主机的连接状态*
Network.TestConnectionNAT - 强制测试当前主机的连接状态
Network.time - 得到当前网络的时间,单位秒
Network.useProxy - 使用代理服务器


NetworkView:
NetworkView.Find - 通过netview id来查找一个NetworkView
NetworkView.group - 当前NetworkView所在的组
NetworkView.isMine - 当前物体是否有NetworkView控制功能
NetworkView.observed - 当前NetworkView是否在观察中<name>
NetworkView.owner - 当前NetworkView是归谁所拥有
NetworkView.RPC - 调用当前所有已经连接了服务器的RPC方法
NetworkView.SetScope - 设置NetworkView的关联NetworkPlayer信息
NetworkView.stateSynchronization - 网络数据同步发送安全性*
NetworkView.viewID - 当前NetworkView的NetworkViewID


NetworkViewID:
NetworkViewID.isMine - 是否是自己实例化的物体
NetworkViewID.operator!= - 如果两个NetworkView不相等
NetworkViewID.operator== - 如果两个NetworkView相等
NetworkViewID.owner(NetworkView) - 哪个NetworkPlayer拥有的NetworkViewID
NetworkViewID.ToString - 返回已经格式化好的NetworkViewID信息
NetworkViewID.unassigned - 表示当前networkview id无效


NetworkPlayer:
NetworkPlayer.externalIP - 获取当前NetworkPlayer对外开放的IP地址
NetworkPlayer.externalPort - 获取当前NetworkPlayer对开开放的端口号
NetworkPlayer.guid - 当前NetworkPlayer的GUID,当使用NAT punchthrough时
NetworkPlayer.ipAddress - 当前NetworkPlayer的IP地址
NetworkPlayer.port - 当前NetworkPlayer的端口号
NetworkPlayer.operator!= - 是否两个NetworkPlayer不相等
NetworkPlayer.operator== - 是否两个NetworkPlayer相等
NetworkPlayer.ToString - 返回当前NetworkPlayer的索引


HostData:
HostData.comment - 主机描述信息
HostData.connectedPlayers - 当前的玩家连接数
HostData.gameName - 当前主机对应的游戏名称
HostData.gameType - 当前主机对应的游戏类型
HostData.guid - NAT punchthrough时
HostData.ip - 主机的IP地址
HostData.passwordProtected - 主机是否有密码保护
HostData.playerLimit - 主机最大能承受的玩家数量
HostData.port - 当前主机的端口号
HostData.useNat - 当前主机是否已经有Nat穿透功能

MasterServer:
MasterServer.ClearHostList - 清除通过从MasterServer.PollHostList获取的主机列表
MasterServer.dedicatedServer - 当前机器是否有专有服务器
MasterServer.ipAddress - 主服务器的IP地址
MasterServer.OnFailedToConnectToMasterServer - [svr|client]当连接主服务器失败时回调
MasterServer.OnMasterServerEvent - 当主服务器有事件通知[MasterServerEvent]
MasterServer.PollHostList - 通过MasterServer.RequestHostList检查最新的主机列表
MasterServer.port - 主服务器的端口号
MasterServer.RegisterHost - 注册当前服务器到主服务器
MasterServer.RequestHostList - 人主服务器那里请求主机列表
MasterServer.UnregisterHost - 从主服务器那里取消注册当前服务器
MasterServer.updateRate - 设置主服务器的最小更新频率,如果为0,则主服务器不进行更新,
默认更新频率为60s






2014-04-27 14:54:42 inspironx 阅读数 4621
  • unity3D-游戏/AR/VR在线就业班

    本套课程是一套完整的 Unity3D-游戏/AR/VR 学习课程,具体的课程内容包括《C#语言》、《Unity引擎》、《编程思想》,《商业级项目实践》等开发课程,引导您一步步循序渐进、由易到难,终获得Unity 3D/游戏/AR/VR工程师的岗位技能。

    12814 人正在学习 去看看 宋晓波

使用Unity3d的内建网络搭建一个简单的服务器,使用本机当主机,创建一个客户端连接到本机,






我使用的NGUI作为主界面,服务器代码:

	string ipAddress = "127.0.0.1";
	int port = 23000;

	string msg = "";
	public UILabel lbl;

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}

	void OnClick () {
		if(Network.peerType == NetworkPeerType.Disconnected) {
			Network.InitializeServer(8, port, false);
			msg += "svr init";
			lbl.text = msg;
		} else {
			msg = "svr already start, connect type: " + Network.peerType;
			lbl.text = msg;
		}
	}

	void OnServerInitialized() {
		msg += "Server initialized and ready. ";
		lbl.text = msg;
	}

	void OnPlayerConnected(NetworkPlayer player) {
		msg = "Player connected from: " + player.ipAddress +":" + player.port;
		lbl.text = msg;
	}

	void OnPlayerDisconnected(NetworkPlayer player) {
		msg = "Player disconnected from: " + player.ipAddress+":" + player.port;
		lbl.text = msg;
	}

客户端代码:

string ipAddress = "127.0.0.1";
	int port = 23000;

	public UILabel lbl;

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}

	void OnClick () {
		if( Network.peerType == NetworkPeerType.Disconnected ) {
			Network.Connect(ipAddress, port);
		}
	}


2014-03-27 10:52:08 ly209 阅读数 959
  • unity3D-游戏/AR/VR在线就业班

    本套课程是一套完整的 Unity3D-游戏/AR/VR 学习课程,具体的课程内容包括《C#语言》、《Unity引擎》、《编程思想》,《商业级项目实践》等开发课程,引导您一步步循序渐进、由易到难,终获得Unity 3D/游戏/AR/VR工程师的岗位技能。

    12814 人正在学习 去看看 宋晓波

最近几天研究unity3d的网络编程,小有斩获,列举一些我认为比较重要的关键点。

还在学习阶段,有误的地方还望留言指正,不胜感谢。

1.Network.Instantiate函数

这个函数一般在客户端连接到服务器(服务器也作为游戏的一个player时创建服务器时也应该调用)时在服务器调用。

先看看官网的说明The given prefab will be instanted on all clients in the game. Synchronization is automatically set up so there is no extra work involved. The position, rotation and network group number are given as parameters. Internally this is an RPC call so when Network.RemoveRPCs is called for the group number, the object will be removed. Note that there must be something set to the playerPrefab in the Editor. You can read more about instantiations in the object reference Object.Instantiate.

什么意思呢?就是给定的预设注意在编辑器中必须设置playerPrefab将在所有的客户端上实例化。同步被自动设置,因此没有额外的工作要做。位置、旋转和网络组数值作为给定的参数。这是一个RPC调用,因此,当为该组数Network.RemoveRPCs被调用,这个物体将被移除。

用了这个函数后所有你想创建的物体都会在所有的客户端调用并实例化,如果只是做对战类游戏,不用socket编程的话,简直方便。

2.Network.OnSerializeNetworkView函数

这个函数可以传输一些自定义的数据,比如人物的血量,怪物掉血等数据,在客户端连接到服务器时自动调用。它的发送取决于谁拥有该物体,即所有者发送,其他所有人接收。

举个例子:

using UnityEngine;
using System.Collections;
// This objects health information
//这个物体的生命信息
public class example : MonoBehaviour {public int currentHealth;void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info) {int health = 0;if (stream.isWriting) {health = currentHealth;stream.Serialize(ref health);} else {stream.Serialize(ref health);currentHealth = health;}}}

3.其他

//Client functions called by Unity
function OnConnectedToServer() {
	Debug.Log("This CLIENT has connected to a server");	
}

function OnDisconnectedFromServer(info : NetworkDisconnection) {
	Debug.Log("This SERVER OR CLIENT has disconnected from a server");
}

function OnFailedToConnect(error: NetworkConnectionError){
	Debug.Log("Could not connect to server: "+ error);
}


//Server functions called by Unity
function OnPlayerConnected(player: NetworkPlayer) {
	Debug.Log("Player connected from: " + player.ipAddress +":" + player.port);
}

function OnServerInitialized() {
	Debug.Log("Server initialized and ready");
}

function OnPlayerDisconnected(player: NetworkPlayer) {
	Debug.Log("Player disconnected from: " + player.ipAddress+":" + player.port);
}

//others
function OnFailedToConnectToMasterServer(info: NetworkConnectionError){
	Debug.Log("Could not connect to master server: "+ info);
}

function OnNetworkInstantiate (info : NetworkMessageInfo) {
	Debug.Log("New object instantiated by " + info.sender);
}

function OnSerializeNetworkView(stream : BitStream, info : NetworkMessageInfo)
{
	//Custom code here (your code!)
}

2019-10-24 23:08:45 qq_23299335 阅读数 39
  • unity3D-游戏/AR/VR在线就业班

    本套课程是一套完整的 Unity3D-游戏/AR/VR 学习课程,具体的课程内容包括《C#语言》、《Unity引擎》、《编程思想》,《商业级项目实践》等开发课程,引导您一步步循序渐进、由易到难,终获得Unity 3D/游戏/AR/VR工程师的岗位技能。

    12814 人正在学习 去看看 宋晓波

Unity3D网络游戏开发——开始网络编程:Echo(客户端部分)

什么是Echo程序

Echo程序是网络编程中最基础的案例。建立网络连接后,客户端向服务端发送一行文本,服务端收到后将文本送回客户端。Echo程序分为客户端和服务端两个部分,客户端部分使用Unity实现,服务端使用C#语言。

编写客户端程序

建立界面

打开unity,新建名为Echo的项目,制作简单的UGUI界面,在场景中添加两个按钮,一个输入框和一个文本框,命名如下:
UGUI界面在这里插入图片描述
ConnButton(按钮):连接按钮,用于发起网络连接
InputField(输入框):文本输入框,用于输入发送给服务端的文本
SendButton(按钮):发送按钮,用于将输入的文本发送给服务器
RecvText(文本框):文本框,用于显示从服务器接收到的文本

编写脚本

在Unity的Assert目录下建立名为Echo的C#脚本,并保存
在这里插入图片描述
输入下面代码

using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using UnityEngine;
using UnityEngine.UI;

public class Echo : MonoBehaviour {

    //定义Socket
    Socket socket;
    //UGUI各组件
    public InputField inputField;
    public Text text;

    //点击连接按钮
    public void Connection()
    {
        //创建连接
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        socket.Connect("127.0.0.1", 8888);

    }

    //点击发送按钮
    public void Send()
    {
        //发送信息
        string sendStr = inputField.text;
        byte[] sendBytes = Encoding.UTF8.GetBytes(sendStr);

        socket.Send(sendBytes);

        //接收信息
        byte[] readBuff = new byte[1024];
        int count = socket.Receive(readBuff);
        string recvStr = Encoding.UTF8.GetString(readBuff, 0, count);
        text.text = recvStr;

        //关闭连接
        socket.Close();

    }
}
完成客户端

在Unity的Scene界面下创建名为Echo的空物体,将Echo.cs拖拽到Echo上,并将脚本的InputField和Text属性赋值。
在这里插入图片描述
在属性面板(Inspector)中给ConnButton添加点击事件设置为Echo的Connection方法,给SendButton添加点击事件设置为Echo的Send方法在这里插入图片描述
在这里插入图片描述在这里插入图片描述

运行

点击Unity的运行按钮,运行客户端,点击链接按钮,会提示无法连接

在这里插入图片描述
原因是现在没有服务器端,属于正常现象

编写服务器端

未完待续

Unity Socket 交互编程

阅读数 26570

没有更多推荐了,返回首页