private int lport = 10000;
private bool usenat = false; void OnGUI(){ switch(Network.peerType){ case NetworkPeerType.Disconnected:
Startconnect(); break;
case NetworkPeerType.Client: Clientto(); }
break;
Debug.Log(\连接中。。。\break;
case NetworkPeerType.Connecting:
}
void Startconnect(){
//获得输入框里的内容
roip = GUILayout.TextField(roip);
if(GUILayout.Button(\连接服务器\
error
=
NetworkConnectionError Network.Connect(roip,lport,\
Debug.Log(error); } }
void Clientto(){
//提示信息连接成功
GUILayout.Label(\成功连接到服务器!\
}
//连接成功后系统自动调用函数---是否连接成功是系统自动判断的 void OnConnectedToServer(){
//通过循环形式遍历对象内的所有子对象,找到游戏物体的函数。go是游戏类型的变量存放寻找GamObject的类型
foreach(GameObject go in FindObjectsOfType(typeof(GameObject))){ //调用找到游戏物体上的函数OnNetworkLoaded,参数1:在游戏对
象中创建脚本此函数。函数完成的功能是自己定义
//参数2:如果没有找到参数1的函数就不执行
go.SendMessage(\ } }
}
3. 网络通信有两种重要的方式:远程函数调用(RPC)与状态同步。
1)远程过程调用(Remote Procedure Calls ,RPC )是用来调用远程计算机上某个函数的方法。它包括了两个方向,—方面它可以从客户端调用服务器上的某个函数,一方面也可以从服务器调取所有客户端的某个函数或特定客户端的函数。 2)状态同步被用于在各个客户端中同步不断改变的数据。例如客户端中的玩家在跑动、跳跃或者施放技能时,其他各个客户端的玩家能够确切地知道该玩家的位置及在做什么,能够不断地分发该玩家的状态数据,使得各个客户端的玩家 能够同时知道该玩家的所有状态。 4. Network View(网络视图组件)是多人游戏中常用的组件,用于通过网络共享数据的组件,使用这个组件可以准确定义哪个游戏对象是在网络上同步以及如何同步。根据网络视图组件可以发起上面讲到的两种类型的网络通信:装填同步于远程过程调用。如果在游戏中同步每个对象的状态时需要传输大量的数据,为了解决发送过多的数据所产生的带宽,可以通过Network View组件来制定什么数据会被共享,哪个数据会被同步
1)Network View具有以下的公有属性 :
state synchronization:状态同步,通过网络视图生效的状态同步类型。具有以下可选值:
?off:关闭,如果只使用RPCs建议关闭状态同步功能。
?Reliable Delta Compressed:可靠的增量压缩,游戏中发生变化的状态会被通过网络传递。如果没变化,则不进行传递。该模式是次序化进行 的,所以如果有包的丢失,丢失的包会自动重新传递。
?Unreliable:不可靠地、完整地传递所有的状态。这会导致更多的带宽消耗。但是丢包的影晌会大大降低
observed:组件的数据会在网络中进行传递。
View ID:视图编号:
?scene ID:当前视图中网络视图的数字编号。
?Type:类型,该选顶将决定是在视图中预先创建的还是实时创建的。
网络视图通过视图ID唯一标识.一个网络视图ID是在所有的计算机上认可的一个对象的唯一标识。
5. 网络实例化预制物体
1)在客户端的场景里创建plane,Directional light,创建一个预制物体player(Project-->Create-->Prefab),创建一个Cube拖拽到预制物体player上删除。
2)为预制物体player添加组件:刚体组件和网络视图组件(Add-->Miscellaneous-->Network View)
3)设置网络视图组件:State Synchronization:其他玩家是否能看到你的信息,Off:看不到,Reliable Delta Compressed:插值传输,发生变化的物体传输。Unreliable:发生变化的和不发生变化的内容都进行传输。Observed:决定哪个组件进行传输。
4)创建一个空的游戏物体,命名spawn
5)创建一个脚本playergame.cs:
public class playergame : MonoBehaviour { //用来引用预制物体
public Transform control; void OnNetworkLoaded(){ }
//实例化该目标对象,参数4:0-->代表实例化对象所在的组为0 Network.Instantiate(control,transform.position,transform.rotation,0);
}
6. 当客户端退出时消除物体--断开连接服务器
在客户端脚本中添加的函数:
Void OnDisconnectedFromServer(NetworkDisconnection info){
//移除属于这个玩家的ID的RPC函数 Network.RemoveRPCs(Network.player); //消除属于玩家的物体
Network.DestroyPlayerObjects(Network.player); //重新加载场景 Application.LoadLevel(0); }
7. 实现当客户端与服务器连接成功后如何控制主角的移动
在playergame上添加---运行在客户端
Void Update(){
Vector3
Direction
=
new
Vector3(Input.GetAxis(“Horizontal”),0,Input.GetAxis(“Vertical”));
Float speed = 5.0;
GameObject.FindGameObjectWithTag(“Player”).transform.Translate(speed*Direction*Time.deltaTime); }
使用usenat网络地址转换器开启,显示外网IP:string exip=Network.player.externalIp;
授权服务案例:----多人网络的基础 1. 创建授权服务器
服务器与客户端代码与非授权一样?? 2. NetworkPlayer网络玩家:
a) NetworkPlayer是一个数据结构,保存着你可以从网络定位的另一位玩家的信息。 3. 网络实例化命令:
a) Transform playerTrans =
(Transform)Network.Instantiat(playerPrefab,transform.position,transform.rotation,play
erID);//参数1:实例化的对象,参数2:实例化对象的位置,参数3:实例化对象
的旋转角度--根据脚本附在哪个物体上。参数3:玩家ID,实例化玩家的ID
4. 在控制角色的移动脚本里需要身份认证
Void SetPlayer(NetworkPlayer player){
ownerPlayer = player;//身份认证
If(player == Network.player){
enabled = true;//如果身份正确则可以调用本脚本 }
}
5. Unity中执行函数的顺序
Awake()函数:唤醒函数,当程序执行时执行一次,最先被调用 -->Start()函数-->Update()函数-->OnGUI()函数
Network.isClient:检测是否运行客户端,允许游戏在服务器端
6. 不启动脚本时发生什么?---脚本被取消执行,勾掉对勾
脚本中除了Awake()函数执行外其他函数都不执行
7. 多人网络游戏如何控制角色移动脚本
后台运行:发布游戏时Player Settings...-->Run In Backgroud:发布的exe文件可以在后台运行,失去焦点时也可以使用。
8. Input.GetAxis(“Horizontal”);//返回值为-1、1、0
9. 远程过程调用函数:
networkView.RPC(“SendMovementInput”,RPCMode.Server,currentHInput,curentVInput);
//NetworkViw.RPC:远程过程调用
Function RPC(name:string,mode:RPCMode,params args:object[]):void:在所有连接端调用一个RPC函数。RPCMode远程过程调用模式:用于NetworkView.RPC,谁将接收RPC的选项(变量有Server:仅发送到服务器,Others:除了发送方,发送到每个人,OthersBuffered:除了发送方,发送到每个人,并添加到缓冲区。All:发送到每个人,AllBufffeed:发送给每个人,并添加到缓冲区)
10. 游戏对象旋转的命令:transform.Translate(Vector3.up,playerRotate);//参数1:旋转方向:Y轴,参数2:旋转角度
小地图中红色小箭头代表场景中的主角,然后人物方向的转变,小地图中箭头也随之改变方向。
11. 聊天室程序脚本:
1)NetworkPeerType.Client 运行于客户端
2)PlayerPrefs 玩家偏好:在游戏回话中存储和访问玩家偏好设置。在Windows独立模式下,PlayerPrefs被存储在注册表的 HKCU\\Software\\[company name]\\[product name]键下,这里company和product名是在Project Setting中设置的.类函数SetInt:设置由Key确定的偏好值,GetInt:如果存在,返回偏好问价中Key对应的值... HasKey:如果Key在偏好中存在,返回true。DeleteKey:从偏好中删除Key和它对应的值。DeleteAll:从偏好中删除所有key。
3)NetworkMessageInfo 网络数据信息:刚从网络接收的数据的相关新会被保存到这个结果中,它揭示了从哪里来(数据源),什么时间发送和什么网络视图发送,其包括:数据源,发送时间,网络视图
4)聊天室结构图---①、连接脚本----lj.cs
NetworkPeerType.Client NetworkPeerType.Disconnected NetworkPeerType.Connecting NetworkPeerType.Server 开始(连接脚本) 定义IP,Port,nickname变量 在OnGUI中判断端连接类型Network.peerType 设置昵称功能