1.UFUNCTION()
不是所有函数都能加UFUNCTION()修饰,涉及UE反射机制。
2.初始化用{}
初始化列表
3.创建C++文件时修改了路径
这时.cpp文件会报错,只需删掉前面多余路径即可
4.函数的移除
1.虚幻5.1 UUserWidget不再包含OnLevelRemovedFromWorld()
转而使用NativeDestruct()
5.修饰符
1.读写时,private
其他时不需要
6.角色控制
1.朝向问题
7.网络复制
1.Replication
UE5 -- Replication(网络复制) - 知乎 (zhihu.com)
1. 属性复制调用函数
当变量发生改变时,执行指定函数
2.RPC
UE4 浅谈网络同步中的RPC - 知乎 (zhihu.com)
UE4 RPC在C++中的使用简例_kismetsystemlibrary:isdedicatedserver-CSDN博客
RPC 修饰时,要指定是否可靠(Reliable )。
可靠的RPC最终一定会到达目标端,但不可靠的RPC可能在弱网或断网环境下丢包,或者在引擎限流的情况下被提前拦截而不去执行。
8.C++知识点
1.一个类访问另一个类的所有属性及方法
2.内联函数
9.将武器装备到人物上
10.为什么在方法后加 _Implementation
表示该方法是从接口继承而来,即将在类中实现。
11.开启角色蹲下
F12,查找声明,即可找到定义,声明
此外,蹲下时,移动速度,碰撞体大小会改变
12.多人游戏中
提前执行想要的操作,然后在服务器更新,解决延迟问题
13.人物朝向
UE4开发随笔3-移动中朝向的同步 - 知乎 (zhihu.com)
bUseControllerRotationYaw:角色的正面最好永远和摄像机的朝向一致
bOrientRotationToMovement:摄像机悬挂在半空,玩家前后左右跑动,脸都会转向移动方向
bUseControllerDesiredRotation:角色也会跟随控制器的朝向移动,但是并不是瞬间设置过去,而是有个平滑的速度来逐步旋转过去
- 使用bOrientRotationToMovement时,bUseControllerRotationYaw必须先设置为false。然后将角色的运动组件CharacterMovementComponent的朝向运动方向属性bOrientRotationToMovement设置为true
- 使用bUseControllerDesiredRotation时,先把bUseControllerRotationYaw设置为false,然后bOrientRotationToMovement设置为false,把CharacterMovementComponent的bUseControllerDesiredRotation勾选置为true。
14.当你使用了网络复制时
当你某些功能使用了网络复制时,测试时需要修改运行模式,不要用第一个
15.摄像机FOV等设置
UE4-Post Process Volume各参数的释义 - 哔哩哔哩 (bilibili.com)
16.类型转换
UE4 变量类型转换_ue4 fstring转int-CSDN博客
FString 转 Int
int IntVal = FCString::Atoi(*StrVal);
Int 转 FString:
FString StrVal = FString::FromInt(IntVal);
FString 转 Float
float FloatVal = FCString::Atof(*StrVal);
Float 转 FString
FString StrVal = FString::SanitizeFloat(FloatVal);
FString To double
FCString::Atod(*StrVal);
double To FString
FString StrVal = FString::Printf(TEXT("%.15f"), DoubleVal);
FString 转 FText
FText TextVal = FText::FromString(StrVal);
FText 转 FString
FString StrVal = TextVal.ToString();
FString 转 FName
FName NameVal = FName(*StrVal);
FName 转 FString
FString StrVal = NameVal.ToString();
FString 转 std::string
std::string std::strVal(TCHAR_TO_UTF8(*StrVal));
std::string 转 FString
FString StrVal(std::strVal.c_str());
FString 转 TCHAR*
TCHAR CharVal = *StrVal;
FString To const char*
const char* Val = TCHAR_TO_ANSI(*StrVal);
FString To bool
bool bVal = StrVal.ToBool();
注:
FText 转 FName
先转 FString,再转 FName
FName 转 FText
TextVal = FText::FromName(NameVal);
TChar* 与 char* 的互相转换
TCHAR_TO_ANSI(*StrVal)
ANSI_TO_TCHAR(*StrVal)
TCHAR_TO_UTF8(*StrVal)
UTF8_TO_TCHAR(*StrVal)
i++ 与 ++i
单独使用,++i和i++,效果都是一样的,就是i=i+1。
但是作为运算符是有区别的
a=i++,这个运算的意思是先把i的值赋予a,然后在执行i=i+1;
- 当i初始等于3时,执行a=i++,最终结果a=3,i=4.
a=++i,这个的意思是先执行i=i+1,然后在把i的值赋予a;
- 当i初始等于3时,执行a=++i,最终结果a=4,i=4.
i++是先用临时对象保存原来的对象,然后对原对象自增,再返回临时对象,不能作为左值;
++i是直接对于原对象进行自增,然后返回原对象的引用,可以作为左值。
由于要生成临时对象,i++需要调用两次拷贝构造函数与析构函数(将原对象赋给临时对象一次,临时对象以值传递方式返回一次);
++i由于不用生成临时变量,且以引用方式返回,故没有构造与析构的开销,效率更高。
总结如下:
- 简单使用时,俩这效率没有什么区别!
- 对于自定义类型,在类里使用的时候,++i的效率更高!