学习中遇到的问题

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.开启角色蹲下 

CPP 蹲伏蓝图

 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由于不用生成临时变量,且以引用方式返回,故没有构造与析构的开销,效率更高。

总结如下:

  1. 简单使用时,俩这效率没有什么区别!
  2. 对于自定义类型,在类里使用的时候,++i的效率更高!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值