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

发表于2018-01-25
评论0 2.9k浏览
前面两篇介绍的是VR局域网开发的基础知识,下面开始进入VR局域网开发中一些比较实用的问题。

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

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

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

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

5.特别再提下player controller :在连接过程中,GameMode::Login时在服务器上的playercontroller会同步到客户端上去,在客户端上会有个临时的,但是在此时调用playercontroller的RPC函数是不安全的,因为客户端上的临时的会被服务器上的这个替代掉!所以需要等到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 session的open level里option是否设置为listen。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引