1、对于多人游戏,AI控制只受服务端的管理,客户端无需进行寻路计算,所以这些逻辑全部放到服务端
2、有时候看不到某些actor效果很可能是由于立即Destroy造成的,这是很常见的bug
3、求出物体向目标点倒下30度
4、判断一个Tarray的某个元素是否存在
不对(程序会崩):
if (TOuterItemMgrArray[0])
正确(原因:万一TOuterItemMgrArray不存在就会崩,该函数做了判断):
if (TOuterItemMgrArray.IsValidIndex(0))
5、
TSubclassOf转UObject*: 使用->GetDefaultObject()方法
TSubclassOf转UClass* : 前面加*
6、
UObject
为对象系统的基类。类层次为:
UObjectBase
UObjectBaseUtility
UObject
UClass
C++语言不像C#,Java那样提供完整的反射功能,我们需要定义一个数据结构(UClass)来描述C++中的类信息,这个数据结构也称为类的元数据。当然在UE4中UClass实例不仅仅用于描述C++(Native)类,也用来描述Blueprint生成的类。
类继承层次:
UObject
UField
UEnum
UProperty
UBoolProperty
UEnumProperty
UNumericProperty
UObjectProperty
...
UStruct
UClass
UFunction
UScriptStruct
链接:https://www.jianshu.com/p/1f2de6ea383c
7、
template <typename ElementType, typename IteratorType>
struct TDereferencingIterator
{
explicit TDereferencingIterator(IteratorType InIter)
: Iter(InIter)
{
}
FORCEINLINE ElementType& operator*() const
{
return *(ElementType*)*Iter;
}
}
这里ElementType&是返回值类型,因此返回ElementType的指针前面加个*,也即返回类本身
8、EditAnyWhere和EditDefaultsOnly的区别
如果一个UPERPROTY设为EditAnyWhere,该蓝图类拖到场景中,修改蓝图的这个变量,场景中的变量不会改变,场景中的保存以前的变量,
如果一个UPERPROTY设为EditDefaultsOnly,该蓝图类拖到场景中,修改蓝图的这个变量,场景中不能配置该变量,全部读取蓝图中的变量
9、在BeginPlay设置一些变量可能失效
解决方法:
delay 0.2秒再设置
10、TimeLine在同步时记得勾选Replicated
11、用于防止同步抖动的骚方法
//每一帧都更新rotation
if (fDeltaTimeServer>0.0f)
{
float fTimeSecondsDelay = UGameplayStatics::GetGameState(GetWorld())->GetServerWorldTimeSeconds() - UGameplayStatics::GetTimeSeconds(GetWorld());
fDeltaTimeServer = UKismetMathLibrary::FMax(fDeltaTimeServer, fTimeSecondsDelay);
}
else
{
fDeltaTimeServer = UGameplayStatics::GetGameState(GetWorld())->GetServerWorldTimeSeconds() - UGameplayStatics::GetTimeSeconds(GetWorld());
}
float fTimeSecondsAddTimeServer = UGameplayStatics::GetTimeSeconds(GetWorld()) + fDeltaTimeServer;
12、相机和物体发生碰撞bug:
解决方法:把物体对相机的碰撞改成overlap
13、SplineComponent
如果让一个物体沿着曲线轨迹运动,使用该组件,在场景中选中该组件的顶点,按alt+鼠标左键脱出下一段轨迹
在蓝图中,这样让物体沿轨迹运动
14、DestructiableComponent的Overlap事件和StaticMeshComponent的OverLap事件效果不太一样,
DestructiableComponent的Overlap事件:
人撞到物体触发
物体撞到人不触发
StaticMeshComponent的OverLap事件:
人撞到物体触发
物体撞到人触发
解决方法:在DestructiableComponent下面再放个StaticMeshComponent,触发事件全部调用StaticMeshComponent里的Overlap
15、对于可破碎物体,如果破碎后禁掉碰撞,记得一定在fracture回调函数中禁用碰撞,不能用自己函数多播禁
16、对于粒子特效,在播放时候调用SetActive函数
记得在粒子特效蓝图中取消勾选Auto Active,否则,特效一开始进入就播放
17、用vs编译热加载ue编辑器有时会出现一些bug,需要用vs启动
18、有时打开一个c++文件,显示已被删除或被remame,无法打开
解决方法:项目重新generate
19、检测墙后面的玩家不受到爆炸伤害
做法:
使用LineTraceForObejct方法,检测两点之间(人物和爆炸桶)做一条射线是否有物体ObjectType为某个枚举,比如墙的ObjectType设为WorldStatic,就会返回true,输出的hit保存射线碰撞点的相关信息,可以获取到碰撞到碰撞到的actor,component等相关信息。
Obeject Type在这里设:
20、将碰撞通道转换为ObjectType:
TArray <TEnumAsByte<EObjectTypeQuery>> WorldStaticObjectTypes;
WorldStaticObjectTypes.Add(UEngineTypes::ConvertToObjectType(ECollisionChannel::ECC_WorldStatic));
也即这句话
UEngineTypes::ConvertToObjectType(ECollisionChannel::ECC_WorldStatic
21、测试时绘制的线一般是在服务端绘制