Unity的FishNet相关知识
FishNet和常规网络手游不太一样,他是可以将客户端和服务器写成一套代码的,也就是客户端也可以作为服务器
C#特性:
[ServerRpc] 方法添加了这个特性后,这个方法只会在服务端执行,由客户端调用,但是客户端不会执行这个方法
[ObserversRpc] 添加了这个特性的方法,只会在客户端运行,并且由服务端调用,服务端调用后,所有客户端都会被执行
[TargetRpc] 添加了这个特性后,只会在客户端运行,由服务器调用,并且需要指定一个NetworkConnection,只会给这个connection调用
对于ObserverRpc的使用情况如下:
假如说现在客户端需要有一个playerId,并且每个玩家都要有。如果我是基于TargetRpc,如下:
[TargetRpc] //这是错误使用!
public void SyncData(int playerId, int teamId, string playerName, bool isRobot)
{
Data = new PlayerData()
{
playerId = playerId,
teamId = teamId,
playerName = playerName,
isRobot = isRobot
};
Debug.Log("玩家数据同步完成 id==" + playerId);
}
那么当玩家生成后服务器调用SyncData时,只有当前客户端的Owner能同步到数据,其他玩家没有反应。
比如现在有3个客户端,一共3个玩家ABC,那么当我玩家A登录的时候,客户端A会收到服务器发来的SyncData A,当玩家B登录的时候,客户端A并不会收到任何消息,也就是在客户端A中,玩家BC完全是没有数据的! 他们的数据只在客户端B和客户端C中。
这时就需要用ObserversRpc,将SyncData改为ObserversRpc后,玩家A登录时客户端A能正常收到消息,当B登录时,客户端A也可以收到SyncData,并且playerId是B的playerId
所以ObserversRpc的原理就是:将这次数据发送给所有客户端,并且找到他们对应的player对象的对应方法。并不是说:我将这次数据发送给这个客户端的所有player对象,那这样所有的player都拿到的是一个数据了
我们平时开发有2种办法实现FishNet:
1.所有代码集成在一个项目中,服务器和客户端逻辑写在一起
2.服务器和客户端分成2个项目,分别处理逻辑
分成2个项目的时候需要注意踩坑点:
1.NetworkBehavior对象必须客户端和服务器同时有,并且类名完全一样。比如一个Player上有PlayerHealth脚本,那么客户端和服务器都得挂上这个脚本,并且名字不能改,否则会报错提示协议错误
其他的踩坑点:
1.Player上有Camera,那么客户端只有isOwner为true的情况才开启这个Camera,并且其他玩家Camera必须默认隐藏,不然会导致客户端的视角错乱,因为会有很多相机存在场景里unity不知道是哪个!
2.NetworkTransform如果勾选了Client Authoritative,那么只会由客户端控制Transform,服务器自己拖动坐标是没有用的,如果没有勾选,那么就是由服务器控制Transform
网络物体错误加载的情况
注意:如果服务器和客户端是两个Unity工程的情况下,在服务器中创建一个NetworkObject,并创建预制体,之后将这个预制体文件复制到客户端工程下,有概率在服务器加载NetworkObject预制体的时候,客户端找到的是不同的预制体索引,也就是加载成其他的NetworkObject,或者报错,或者完全不加载。
这种会提示警告:ObserversRpc not found for hash 0 on object HashGrid_Moving(Clone) [id 5] . Remainder of packet may become corrupt. 这个HashGrid_Moving(Clone)是FishNet自带的预制体,还可能会加载成其他的FishNet预制体,比如一个胶囊体
,甚至什么都不加载。这种问题一旦出现就是每次运行一定会有的
如果出现这个问题,优先检查服务器和客户端的FishNet插件路径是否一致,Fishnet插件也要保持路径一致!其次就是所有的网络物体,路径一定必须保持一致,就算你看到的DefaultPrefabObjects列表是一致的,但是实际上他们的内部id并不一致,只有严格按照相同的Assets路径放置才有效!
如果路径都完全一致了还生成错误,可以试试:不要复制预制体,而是两边单独创建,并且放在另外的路径下面,不清楚其他版本会不会有这种问题,或者将预制体ctrl+d复制一个然后直接运行
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)