Unity Unet组件、方法探索

来源:互联网 发布:软件外包好不好 编辑:程序博客网 时间:2024/06/10 10:39

两个基本组件

NetworkManager

基本组件,主要功能是实现联网的基本功能 。

基本属性

SpawnInfo属性集

  • PlayerPrefab=>客户端加入时自动生成的Prefab
  • AutoCreatePlayer=>自动生成Prefab。
  • PlayerSpawnMethod=>Prefab的生成方法,两个选项。使用这个方法首先要有指定的位置。(NetworkStartPosition)
    • Random=>随机生成
    • RoundRobin=>轮询,在指定的地点轮流生成
  • RegisteredSpawnablePrefabs=>在这个数组中放置的Prefab是需要在网络中生成的,加入到这个数组中,才可以在网络中同步生成。

NetworkManagerHUD

一个测试用的链接UI界面,可以在测试时使用,但是在真正的游戏中不会保留。

Prefab上的组件

NetworkIdentity

NetworkIdentity组件表明这个预设体是一个网络对象,可以设置这个预设体是在客户端生成还是只在服务器端生成

  • ServerOnly=>只在服务器端生成,不会在客户端批量生成
  • LocalPlayerAuthority=>如果这个对象是由拥有它的客户端控制的,本地玩家对象在这个客户端拥有它的权限,这个属性常被其他组件使用例如Networktransfrom。

NetworkTransform

同步对象在所有客户端上的Transform属性,可以选择同步Rigidbody属性

  • NetworkSendRate(seconds)=>同步的评论,0代表在生成是同步一次
  • TransformSyncMode=>同步的组件
    • SyncNone=>不同步其他组件
    • SyncTransform=>同步Transform组件,就算不选,也会同步
    • SyncRigidbody2D=>同步Rigidbody2D组件,
    • SyncRigidbody3D=>同步Rigidbody3D组件

NetworkStartPosition

这个组件是将这个对象的位置作为Player生成的位置

方法

引用新的父类

引用UnityEngine.Networking,并使对象继承自NetworkBehaviour

using UnityEngine.Networking;public class PlayerControler : NetworkBehaviour {
  1. bool 类型 isLocalPlayer,如果这个对象是标识本地机器上的播放的那个对象,则返回值为真
  2. bool 类型 isServer,如果这个对象是服务器,则为真
  3. bool 类型 isClient,如果这个对象运行在客户端的话,则为真
    与player有关的都用localPlayer处理,与player无关的,用服务器处理
  4. 方法OnStartLocalPlayer(){}在服务器联入时并且游戏开始时调用,相当于普通的Start方法。
    public override void OnStartLocalPlayer() {}
  5. NetworkServe.Spawn(Prefab);将Prefab同步到所有的客户端上。在所有已准备好的客户端上同步给定的游戏对象的生成,注意,这个方法并不会同步物体的移动。

标志方法

[Command]

[Command]的功能是标志以下的方法只能在服务器端调用,客户端调用该方法时,会自动调用服务器端的方法。
要求,这个方法必须以Cmd开头,且不能是静态方法。

[ClientRpc]

[ClientRpc]的功能是标志的以下方法只能在客户端调用,服务器调用该方法时,也会在客户端调用。
要求,这个方法Rpc开头

[SyncVar(hook=”OnChangeHealth”)]

[SyncVar]标记是作用在属性前的,作用是同步该属性到所有的客户端和服务器端。
这个标记中可以增加方法=>[SyncVar(hook=”FunctionName”)],引号中是方法名。当标记的数据值发生变化时,会自动调用引号中的方法,同时将变化后的属性那个值调用到这个方法中。

[SyncVar(hook="OnChangeHealth")]//同步该数据,并在数据发生变化时,调用该方法,同时,这个数据也会被调用到该方法中。private int currentHealth = MaxHealth; void OnChangeHealth(int health) {    healthSlider.value = health / (float)MaxHealth;}