Fisnet 入门

重要概念

服务器权威:数据改变只能在服务器上发生,

客户端权威:数据的改变可以在客户端上发生,意思是客户端也可以作为一个服务器

image-20240806220340377

关键性组件

  1. NetWorkManager:可以在插件中预先设置的prefab中找到该名称的预制件,拖拽到场景管理器中,不做任何对象的子对象和父对象

image-20240806211105999

2.NetworkObject:需要进行网络同步的对象添加该组件即可

image-20240806211420248

3.NetworkTransform:在网络中同步该对象的Transform 变化信息

image-20240806211509257

关键类

NetWorkBehaviour

image-20240806221416057

本机判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private void Update()
{
if (!base.IsOwner) //区分不同客户端,不让在联机的时候一次控制所有Player
return;

float hor = Input.GetAxisRaw("Horizontal");
float ver = Input.GetAxisRaw("Vertical");

/* If ground cannot be found for 20 units then bump up 3 units.
* This is just to keep player on ground if they fall through
* when changing scenes. */
if (_clientAuth || (!_clientAuth && base.IsServerStarted))
{
if (!Physics.Linecast(transform.position + new Vector3(0f, 0.3f, 0f), transform.position - (Vector3.one * 20f)))
transform.position += new Vector3(0f, 3f, 0f);
}

if (_clientAuth)
Move(hor, ver);
else
ServerMove(hor, ver);
}

代表操作

在指定位置生成Player对象

如下图,在场景管理器中选择手动拖拽放置的游戏对象到下图红框区域的Spawns

首先需要在PlayerPrefab选择自己制作的玩家预制件

这个组件并不是唯一指定操作,可以自己手动创建一个,这个就可以作为参考对象

image-20240806223043238

常规生成对象

Player的移动是被一个额外的组件控制着,同时那个组件上还有对权威的控制,如果需要生成对象就建议使用这个了

同时还还需要注意位置的差异,直接在Player本身上生成会收到缩放影响

image-20240807234849039

动画同步

只需要在角色上新加入一个组件就可以了

image-20240809101357605

组件冲突

使用物理组件和NetWorkTransform进行角色控制的时候,客户端这边会受到冲突,物理组件和网络位置控制会同时修改Transform中的位置信息,再加上网络延迟,会造成移动到一半又被网络位置控制影响

提示:mesh collider

image-20240809112240847

同步参数

不同于手动设置Unity消息去实现内容变化响应的功能,应该是固定的标签,对于同步变量这个东西应该绑定了对应的客户端

image-20240809151041175

image-20240809151327641

同步变量的理解:还是需要进行远程过程请求,因为同步字段在最开始就限制着,就算是按照官方文档上的要求添加上了 WritePermission.ClientUnsynchronized 字段允许在本地进行修改,这样的结果不会被同步到客户端上。

ServerRpc很重要

客户端预测:

等待