前言
之前一直是只有用到虚幻的蓝图,但是作为一个有梦想的咸鱼,c++什么的怎么能不学起来呢,所以下面就是我在学习虚幻中的c++中遇到的一些感觉比较重要的点。也因为是杂记,所以可能比较散乱。
版权声明:欢迎分享,转载请注明此文链接。
针对vs2015中出现误判波浪线的解决方法:把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的选项,如果编译成功则自动保存,节省了编译后手动保存的时间。
创建控制台变量。 例子:
对于在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
事件在Pawn
的Progressbar
中调用,而不要在BeginPlay
中调用。