Unity Mirror local player自定义prefab问题的思考

·  阅读 37

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第42天,点击查看活动详情

前言

最近在使用Mirror开发的过程中,遇到一些问题挺有意思的,思考过程分享一下。

Mirror服务器上的场景会渲染吗?

在使用Mirror的过程中,需要一直思考什么应该放服务器上,什么应该放客户端上。那么就必须知道Mirror提供的基础功能在服务器和客户端上分别是什么情况。比如场景,我们知道服务器和客户端都有场景。那么你觉得服务器上的场景会渲染吗?我们只看server only模式。使用Mirror Example中的Tanks测试一下。

启动Tanks

Tanks并不会切换场景,因此启动后就会直接显示默认场景。

image.png 其实,这时候你已经发现了,这个场景肯定是渲染的。虽然现在还没有启动服务器,也没有启动客户端,只是打开了这个游戏程序。但是对于服务器来说,打开游戏程序,就是启动了这个服务器的进程,虽然还没有提供服务,但是服务器已经算运行了。然后点击Server Only再看一下。

Tanks 服务器运行中

image.png 由于没有切换场景,服务器运行中还是在渲染默认场景。那么结论就有了,Mirror并没有屏蔽掉服务器场景的渲染。但是这样会有问题吗?我不知道,但是Unity可以编译专门的独立服务器,应该可以像batch mode那样直接从底层屏蔽掉渲染吧。我暂时还没有试过。其实如果想在游戏中以让场景不渲染,一个简单的方法是disable场景中的camera。总之,如果作为一个存服务器,当然是没必要渲染的,Mirror没有做任何处理,可能是觉得Unity可以简单处理吧。

服务器和客户端上的Player的一些问题

如果想让local player使用不同的prefab会有问题吗?

这个问题说的不是每个player使用不同的prefab,而是同一个玩家,自己看见的自己,和别人看见的自己不一样。对于自己看见的自己,就是在自己的客户端上,这个player是local player,而在别人的客户端上就不是local player。首先,在Mirror默认的情况下,客户端的player是服务器先生成player之后发送消息让所有客户端生成。在这种情况下,客户端使用服务器spawn message中的assetsID去获取到player的prefab然后实例化,因此默认肯定是使用和服务器一样的prefab。假设服务器上已经有3个player,我现在连上去,服务器就会让我这个客户端生成4个player对象,即已存在的别人的3个player和我自己这个player。很显然,这4个player的prefab必须和服务器上的4个player的prefab一致。重复一下,我说的是默认情况。再声明一下,这4个player之间是可以不一样的,只要使用自定义的Add Player消息,让服务器使用Add Player消息中不同的prefab或者配置生成不同的player即可,但是对于同一个player,服务器还是会把他使用的prefab的assetsID发送给每个客户端。所以,每个客户端都会生成同样的player。那么回到这个问题,如果我真的向让我自己看到的自己和别人看到的我不一样行不行,当然可以,因为spawn message中有一个isLocalPlayer的字段,我可以根据这个字段,给local player使用一个其他的prefab。然后别人客户端上的生成我这个player的消息这个字段是false,因此就还是使用服务器上我这个player的prefab。

那么问题来了

这样做这之后,我的客户端上,我自己的player和服务器上的我的player使用了不同的prefab,这会不会有问题?我觉得,会不会有问题要看服务器上进行了什么计算,比如计算物理,如果这两个prefab的碰撞框不一样,那物理计算是在服务器上进行的,比如服务器这个prefab的碰撞框很小,但是客户端prefab看上去很大,那么在客户端上你看上去就是你自己会穿到物理层里面。当然这个只是视觉错误。会不会有其他问题,这个真得具体分析了。总之,你可以这么做,但是差异也不能太大,首先prefab上该挂的脚本都要挂上,因为一般Player脚本上是带有command和clientRpc的,如果挂少了肯定不行。然后物理形状应该差不多,可能有差别的只是模型的细节,那应该就没什么大问题了。

分类:
前端
标签:
收藏成功!
已添加到「」, 点击更改