1:
①: 创建一个空物体 其上添加Network Manager和NetworkManagerHUD两个组件
②:创建一个主角 其上添加NetworkIdentity组件 做成预制体
NetworkIdentity:
ServerOnly:只在服务器端运行、创建
Local Player Authority:在每一个客户端创建(选中此项)
将预制体里面的Player指定为NetworkManager组件中SpawnInfo—PlayerPrefab
③:在player身上添加控制移动的脚本 并添加NetworkTransform组件 进行位置等信息的同步
在脚本中重写OnStartLocalPlayer()方法 这个方法只有在本地角色那里才会调用 当角色被创建的时候(改变localPlay的颜色 即每个玩家看到自身所控制角色都是相同的状态 比如说颜色 都是蓝色 看到的其它玩家角色都是另一种相同的状态 比如说颜色方面 都是白色)
public class PlayerController : NetworkBehaviour {
public GameObject bulletPrefab;
public Transform bulletSpawn;
void Start () {
}
// Update is called once per frame
void Update () {
if(isLocalPlayer==false) //判断是否属于本地角色
{
return;
}
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
transform.Rotate(Vector3.up * h * 120 * Time.deltaTime);
transform.Translate(Vector3.forward * v * 3 * Time.deltaTime);
if (Input.GetKeyDown(KeyCode.Space))
{
Cmdfire();
}
}
public override void OnStartLocalPlayer() //这个方法只有在本地角色那里才会调用 当角色被创建的时候
{
//base.OnStartLocalPlayer();
GetComponent<MeshRenderer>().material.color = Color.blue;
}
[Command] // 该注解的函数只在服务端被执行 //在server运行 在client调用
private void Cmdfire() //这个方法需要在server上调用
{
//子弹的生成需要server完成 然后同步到各个client
GameObject bullet= Instantiate(bulletPrefab, bulletSpawn.position,bulletSpawn.rotation)as GameObject;
bullet.GetComponent<Rigidbody>().velocity = bullet.transform.forward * 10;
Destroy(bullet, 2);
NetworkServer.Spawn(bullet);//将子弹添加到server
}
}
增加攻击 生成子弹 发射子弹方法上添加[Command](表示此方法cerver运行 在client调用)
子弹上也添加NetworkIdentity 将子弹添加到NetwoekManager组件上SpawnInfo–registered Spawnable Prefabs(这个清单上面挂载需要在服务器端生成和同步到每个客户端的游戏对象的预制体 如子弹 敌人等等)
NetworkStartPosition提供一个开始的位置 NetworkManager会自动搜索NetworkStartPosition组件的位置
会根据NetworkStartPosition的位置生成player
关于运动同步:每个和网络有关的游戏对象都需要添加NetworkIdentity组件 每个需要在服务端和客户端位置同步的物体都需要添加NetworkTransform组件
[Command] // 该注解的函数只在服务端被执行
[ClientRpc] //在所有的客户端调用 Rpc远程调用
[Syncvar]该注解的参数会被同步到各个客户端 当服务器端改变了注解参数的时候 客户端会调用hook所指向的方法
NetworkServer.Spawn(enemy);//把生成的敌人同步到服务器端 再通过SpawnInfo–registered Spawnable Prefabs清单同步到每一个客户端
unet基本组件
NetworkManager(核心)。作为多玩家游戏的核心控制组件。通常挂载在一个空的物体,或者一个方便的管理物体上。
Spawn Info属性集(重要)。最常用的一个组件属性,同时又由以下属性构成:
PlayerPrefab。客户端加入时自动生成的预制对象,可以预先定义好。
AutoCreatePlayer。勾选表示自动生成上面定义好的PlayerPrefab。
PlayerSpawnMethod。指定具体的生成方法:
Random。随机生成。
RoundRobin。轮询生成,适合用与对战游戏,在本次项目就采用这种生成方式,可以在指定的地点轮流生成(这里就要用到后面的NetworkStartPosition组件)
RegisteredSpawnablePrefabs。注册接下来需要派生的预制对象,比如一些枪战游戏,子弹就需要在各个客户端同步,需要派生到各个客户端。在本次项目中则是冰球,也需要由服务器派生到客户端。这是一个预制对象的数组,数组中的游戏对象可以在网络中同步生成。
NetworkManagerHUD。一个基础的网络连接UI面板,适合用于简单的应用界面或者最初的开发调试界面(一般后期会被替换成更美观的UI)。所起的作用主要提供现成接口帮助实现前期的开发任务。
NetworkIdentity。将一个预制对象标识为网络中的对象及扮演的角色。
ServerOnly。勾选表示该对象只在服务器端生成和存在。
LocalPlayerAuthority。勾选表示该对象可以在各个客户端中生成和存在,并由拥有它的客户端控制的,在对应客户端具有特定的权限,可以通过isLocalPlayer来识别。
NetworkTransform。用于同步挂载了该组件的派生对象。
NetworkSendRate(seconds)。同步的频率。0代表在生成是同步一次
TransformSyncMode。指定要被同步的组件。一般默认第二个,具有刚体数属性的预制会自动默认为后两个(根据刚体组件是2d还是3d决定)
SyncNone。不同步其他组件
SyncTransform。同步Transform组件。
SyncRigidbody2D。同步Rigidbody2D组件。
SyncRigidbody3D。同步Rigidbody3D组件。
NetworkStartPosition(很有用,也是很必要的一个组件)。指定预制对象的初始位置(可以不同)。因为实际情况往往就很需要多个客户端的玩家对象初始在不同位置,如本项目的两个玩家必须在两对面,不用这个组件就很麻烦,会导致玩家对象都生成在同一个位置。
基本标识
游戏对象判断
IsClient。如果是正在运行的客户端对象,且是从服务器派生的,则为true。
IsLocalPlayer。如果是当前客户端的本地游戏对象(本地玩家——自己),则为true。
IsServer。如果这个对象是激活状态,且在一个被激活的服务器上,则为true。
函数、变量判断
[Command]。用来标识只能在服务端被调用的方法,这些方法名都必须以Cmd开头,且不能是静态方法,否则会导致编译错误。常用于比如联网发射子弹,状态同步只能通过服务器来同步,再派生到各个客户端,因此发射子弹需要由客户端调用服务端上的发射方法,即被[Command]标记的方法。如果该方法用[Command]标记而是任由客户端自己调用的话,在各个客户端之间子弹就是各飞各的,一个客户端射出的子弹不会被另外一个客户端感知。
[ClientRpc]。用来表示只能在客户端被调用的方法,服务器调用该方法时,也会在客户端调用。被标识的方法必须以Rpc开头。
[SyncVar]。用来标识需要同步的变量,可以将被标识的变量同步到所有的客户端和服务器端。作用也是非常大,再拿对战游戏来说,需要同步各个客户端之间的具有不同值的血条,这时就必须将这些记录血量的变量标识为同步变量,否则各个客户端上的变量都是互不相关。