杂记:学习Unreal4中的C++内容

C++, Unreal4,多人联机

Posted by zhuowl on October 8, 2018

前言

之前一直是只有用到虚幻的蓝图,但是作为一个有梦想的咸鱼,c++什么的怎么能不学起来呢,所以下面就是我在学习虚幻中的c++中遇到的一些感觉比较重要的点。也因为是杂记,所以可能比较散乱。


版权声明:欢迎分享,转载请注明此文链接。

针对vs2015中出现误判波浪线的解决方法:把Disable Squiggles设置成true,如下图 把Disable Squiggles设置成true 在vs2017中则是没有这个问题的。

用Unreal4自带 Compile的热编译容易出现问题。在vs中对变量进行修改,然而在编辑器中没有改变,最好的建议是不使用编辑器中的compile键,而是关掉编辑器,在vs中用F5进行调试。我常遇到的情况就是在vs中修改了默认变量的值,然而在蓝图中并没有变化。

避免在头文件中添加额外#include文件,因为头文件不知道要做什么,而这样也会增加了编译时间。所以其他#include文件写在cpp中。而在头文件中如果要用到其他类,则要在前面声明即可。

如果代码没有完全对齐,可以 编辑->高级-》设置选定内容的格式,来矫正排版。 快捷键 Ctrl+K ctrl+F调整格式快捷键

对于枚举类型,如果要公开给蓝图使用,需要将其显示为unit8。 格式

服务器具有命令权,而客户端只负责模拟游戏世界的内容。

对于两个玩家参与游戏时,服务器上会有两个PlayerPawn和两个PlayerController,各自的客户端上有两个PlayerPawn和一个PlayerController。

Compile里面有个On Success Only的选项,如果编译成功则自动保存,节省了编译后手动保存的时间。04

创建控制台变量。 例子: 05

对于在C++中为Protected的函数,在蓝图中仍可以被其他类调用, 除非加上“ BlueprintProtected”的关键词才可以禁用蓝图调用。 (因为蓝图和C++的规则略有不同)

利用别名可以提高代码的可读性

通常会把灰阶遮罩纹理(grayscale masking)禁用sRGB项,这可以让待处理的数据范围更大。

关于c++的文件重命名:

在VS中暴力的把所有的地方重命名了即可,再重新编译即可。(引擎肯可能需要更新才可以看到已经改名) 需要重命名的地方:

  • 头文件和源文件的文件名
  • include文件中
  • 代码内容中(可以用快捷键快速全部重命名 Shif+Alt+R

联机测试(打包出来的联机测试)

  • 双击打包出来的exe文件, “~”,输入“open FirstPersonExampleMap?listen

  • ( 一般这时候会出现防火墙提示,选择同意)
  • 再次运行exe文件,输入“open 127.0.0.1”,是建立与自身的连接
  • (当把游戏打包发送给他人,需要把WindowsNoEditor文件压缩打包发送,且需要获取他的IP地址)
  • 如果想要别人连接需要把7777作为端口,也就是要输入“open host.ip.here:7777”,
  • 我当前的是要输入“open 127.0.0.1:7777
  • (如果无法和朋友建立连接,可能是因为自己本身的路由器规则上,比如某些路由器的NAT规则十分严格,能够阻挡外界连接,所以需要我们在7777这个特定端口上使用端口转发)

RPC

RPC(Remote Procedure Calls):本地被调用,远程被实现 默认情况,RPC值是unreliable值 called(调用),executed(执行) Client:服务器调用,客户端执行 Server:客户端调用,服务器执行 Multicast:服务器调用,服务器和所有被连接的客服端执行。或客户端调用,只在其本地执行。 使用要点:

  • 函数必须由Actor调用
  • Actor必须是 replicated
  • 如果该函数是在服务器调用,客户端执行,只有拥有Actor的客户端才会执行该函数。
  • 如果函数时再客户端调用,服务器执行,客户端上必须要有该Actor
  • Multicast是个例外。

BeginPlay中的内容是会在服务器上和客户端上各运行一次。

  • 在处理(server)服务器函数时,要在其前面加上Server前缀,末尾加上“_Implementation

  • 同理处理客户端(client)函数时,需要在其前面加上Client前缀
  • 服务器端函数 有WithValidation时,需要在cpp中添加一个返回bool值的 _Validate函数,其思想是,如果RPC的验证功能检测到任何参数都不好,它可以通知系统断开发起RPC调用的客户机/服务器。

默认情况客户端上是不加载导航网格体的

遇到的坑:

  • 在C++里用AddDynamic来绑定函数时,在构造函数里绑定可能会不起作用,所以最好在BeginPlay函数内绑定
  • 在c++中类附加了其他组件,然而在继承该类的蓝图中,组件的Details界面显示不出来,注意要把组件的UPROPERTY设置为VisibleAnyWhere,然后在c++中重命名下该组件的变量名就可以了。

更新

创建Widget和移除Widget事件在PawnProgressbar中调用,而不要在BeginPlay中调用。