UE4 VR局域网(三)调试,UI,RPC函数的问题解决

http://blog.csdn.net/liulong1567/article/details/73201022  //UE4网络介绍参考

一篇关于局域网的文档(非常重要!):

https://pan.baidu.com/s/1mhJedxI

 

必须先要知道的注意点:

1.只存在服务器向客户端的同步;客户端不能主动向服务器同步自己的数据,除非使用RPC传递参数;客户端之间也不能直接通信,只能先通过服务器,然后服务器散发。

2.同步功能只存在于Actor及其子类(static mesh actor 也可以)

3.actor同步时,里面的组件需要用set is replicated才能同步!!!蓝图Replication那些勾选条件只适用于整个actor,不包括里面的组件。比如,整个actor瞬移到另一个位置,actor同步了位置,但是里面的mesh 不会过去,必须开启它的同步。

4.UMGCreate widget只能在客户端,蓝图中它提醒了,只能由本地的character 或者player controller创建,否则无法调用!!!

5.特别再提下player controller :在连接过程中,GameMode::Login时在服务器上的playercontroller会同步到客户端上去,在客户端上会有个临时的,但是在此时调用playercontrollerRPC函数是不安全的,因为客户端上的临时的会被服务器上的这个替代掉!所以需要等到GameMode::PostLogin调用时才可以用playercontroller里的RPC


HTC VIVE

1.打包出来后无法打开多个实例:

https://answers.unrealengine.com/questions/592480/run-two-game-instance-on-one-computer.html   //SteamVR导致

解决方法,Plugin设置里不启用SteamVR

 

2. HTC vive 的MotionController 里的操作接口可以放在player character里也可以放在playerController里,如果player character也有,则只响应player controller里的player character不会执行。

 

 

调试

1.调试:如果使用VS调试然后打开多个窗口,那么第一个作为服务器create session 后,第二个客户端上join session。这个过程所有的UE_LOG并不能都输出,只能输出当前操作的那个的输出。(同样打包出来运行时产生的Log文件也是如此)

 解决办法:做一个实时显示在摄像机面前的Text Render作为输出。

 

2.打印输出:

   打包后saved里的Log日志里的输出,客户端加入场景前服务器客户端的log都会输出在日志上,客户端加入场景后,服务器和客户端各自只输出自己的log。

 

3.判断是不是多人游戏。(用于执行不同的逻辑)

   //利用OnlineSubsystem来判断

   IOnlineSubsystem*OnlineSub =IOnlineSubsystem::Get();

   If(OnlineSub){}

 

4.多模块相互引用class的函数时出现无法解析的外部符号:

  1.确保在XXX.Build.cs里包含了那个模块。

  2.#include “XXX.h”

  3.如果那个被引用的类是UE的扩展类,需要加上XXX_API,否则不会暴露符号给其他模块。



RPC函数

1.player controller里不要用广播RPC。

https://answers.unrealengine.com/questions/265818/multicast-causes-clients-to-unpossess-and-if-the-p.html



用遍历player controller 执行Client RPC。

 

2. RPC函数:client可以省略WithValidation,server不行。(具体原因-框架问题)

 

3. actor(包括character 和controller等)的beginplay里调用RPC要慎重!!!坑的不是一次两次!!!因为此时可能会导致数据的获取和设置失败。解决办法:1.可以封装成一个函数,在数据使用时判断为空的情况下动态调用这个函数,不是很可取!2.最恰当的办法:判断actor 的有效性(是否完全同步加载完成)后再初始化数据。比如:character可以判断此character的连接状态是否被controller控制等。

 

4.不在服务器上的actor(除了在connection里的如player controller/player character)

无法调用RPC函数。

 

 

3D UI

1. Motion触发了UI后,之后的操作不会执行。(确保响应UI的同时不会触发其他操作)

 

2. 总共有两个或两个以上的玩家时,会出现之前加入的玩家触发不了3D button的onClicked事件,最后用onPressed事件代替解决。(恶心了我一个多星期)其中尝试了独立服务器,设置input Game Mode,设置actor的所属等方法,都无效。

 

会话部分

1. https://wiki.unrealengine.com/How_To_Use_Sessions_In_C%2B%2B  //wiki创建,加入,查找,删除会话C++实现

2.无法进入到新的一个场景:

 检查create sessionopen leveloption是否设置为listen


猜你喜欢

转载自blog.csdn.net/qq_35760525/article/details/78581805