ue4 总结十一

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、测试时绘制的线一般是在服务端绘制

猜你喜欢

转载自blog.csdn.net/zhangxiaofan666/article/details/82530782