检查重叠时虚幻编辑器崩溃
Unreal Editor Crashes when checking for Overlap
unreal初学者,我只是写了下面的代码让Trigger Volume打开一扇门(Changes Actors Yaw)。如果选定的 Actor (ActorThatOpens) 进入它但是在播放虚幻编辑器时会立即崩溃。谁能帮忙?我希望它足够清楚我试图实现的目标,如果不是请询问。
将此代码添加到 .h:
private:
UPROPERTY(VisibleAnywhere)
float OpenAngle = 90.0f;
UPROPERTY(EditAnywhere)
ATriggerVolume* PressurePlate;
UPROPERTY(EditAnywhere)
AActor* ActorThatOpens; //Pawn inherits from actor
这是.cpp:
void UOpenDoor::OpenDoor()
{
AActor* Owner = GetOwner();
FRotator NewRotation = FRotator(0.0f, -160.0f, 0.0f);
Owner->SetActorRotation(NewRotation);
}
// Called every frame
(line 42) void UOpenDoor::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
// ...
if (PressurePlate->IsOverlappingActor(ActorThatOpens))
{
OpenDoor();
}
}
我确实将压力板设置为 TriggerVolume,并将其作为组件添加到 Actor(门)。
我收到此错误(UE 编辑器崩溃):
Fatal error!
Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0x00000340
UE4Editor-Engine.dll!0x00000000AB8790A1
UE4Editor-BuildingGame-9929.dll!UOpenDoor::TickComponent() [d:\users\lf\documents\repos\unrealcourse\buildinggame\source\buildinggame\opendoor.cpp:42]
UE4Editor-Engine.dll!0x00000000ABC2C05F
UE4Editor-Engine.dll!0x00000000ABC51A15
UE4Editor-Engine.dll!0x00000000AC7DD9DD
UE4Editor-Engine.dll!0x00000000AC7E385D
UE4Editor-Core.dll!0x00000000C09ED84D
UE4Editor-Core.dll!0x00000000C09EDC6D
UE4Editor-Core.dll!0x00000000C0A0CCEB
UE4Editor-Engine.dll!0x00000000AC808861
UE4Editor-Engine.dll!0x00000000AC819532
UE4Editor-Engine.dll!0x00000000AC147B64
UE4Editor-Engine.dll!0x00000000AC1501AD
UE4Editor-Engine.dll!0x00000000ABF05B17
UE4Editor.exe!0x000000007A96DEE3
UE4Editor.exe!0x000000007A95EB40
UE4Editor.exe!0x000000007A95EBBA
UE4Editor.exe!0x000000007A970A29
UE4Editor.exe!0x000000007A9722B6
KERNEL32.DLL!0x00000000E8692774
ntdll.dll!0x00000000E8F90D61
ntdll.dll!0x00000000E8F90D61
(遵循本教程:https://www.udemy.com/unrealcourse/learn/v4/t/lecture/4621210?start=15)
这看起来像是一个空指针异常。在某些时候,您正在访问一个未正确初始化的指针。
"ActorThatOpens"在哪里初始化的?还有 "PressurePlate",仔细检查以确保它们是有效的指针。
如果将重叠称为 on/from 空对象,它可能会导致崩溃。
Sai Narayan可能是对的,你可以在调用游戏逻辑代码之前检查你的指针有效性。
if ((PressurePlate != nullptr) && (ActorThatOpens != nullptr))
{
if (PressurePlate->IsOverlappingActor(ActorThatOpens))
{
OpenDoor();
}
}
如果您之前没有设置 PresurePlate
或 ActorThatOpen
,它可以防止您的程序崩溃。
请记住,TickComponent
函数将在拥有您的组件的 actor 在游戏世界中生成后立即启动。所以 TickComponent
可以在你实际初始化你的组件成员之前被调用。
不要为此使用 Tick,这是不必要的开销。 UE4是事件驱动的,所以实现OnOverlapBegin函数调用你的具体代码。
编辑:首先在蓝图中进行,确保您的逻辑和执行路径合理,然后将其移至代码。这正是蓝图的意义所在。
unreal初学者,我只是写了下面的代码让Trigger Volume打开一扇门(Changes Actors Yaw)。如果选定的 Actor (ActorThatOpens) 进入它但是在播放虚幻编辑器时会立即崩溃。谁能帮忙?我希望它足够清楚我试图实现的目标,如果不是请询问。
将此代码添加到 .h:
private:
UPROPERTY(VisibleAnywhere)
float OpenAngle = 90.0f;
UPROPERTY(EditAnywhere)
ATriggerVolume* PressurePlate;
UPROPERTY(EditAnywhere)
AActor* ActorThatOpens; //Pawn inherits from actor
这是.cpp:
void UOpenDoor::OpenDoor()
{
AActor* Owner = GetOwner();
FRotator NewRotation = FRotator(0.0f, -160.0f, 0.0f);
Owner->SetActorRotation(NewRotation);
}
// Called every frame
(line 42) void UOpenDoor::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
// ...
if (PressurePlate->IsOverlappingActor(ActorThatOpens))
{
OpenDoor();
}
}
我确实将压力板设置为 TriggerVolume,并将其作为组件添加到 Actor(门)。 我收到此错误(UE 编辑器崩溃):
Fatal error!
Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0x00000340
UE4Editor-Engine.dll!0x00000000AB8790A1
UE4Editor-BuildingGame-9929.dll!UOpenDoor::TickComponent() [d:\users\lf\documents\repos\unrealcourse\buildinggame\source\buildinggame\opendoor.cpp:42]
UE4Editor-Engine.dll!0x00000000ABC2C05F
UE4Editor-Engine.dll!0x00000000ABC51A15
UE4Editor-Engine.dll!0x00000000AC7DD9DD
UE4Editor-Engine.dll!0x00000000AC7E385D
UE4Editor-Core.dll!0x00000000C09ED84D
UE4Editor-Core.dll!0x00000000C09EDC6D
UE4Editor-Core.dll!0x00000000C0A0CCEB
UE4Editor-Engine.dll!0x00000000AC808861
UE4Editor-Engine.dll!0x00000000AC819532
UE4Editor-Engine.dll!0x00000000AC147B64
UE4Editor-Engine.dll!0x00000000AC1501AD
UE4Editor-Engine.dll!0x00000000ABF05B17
UE4Editor.exe!0x000000007A96DEE3
UE4Editor.exe!0x000000007A95EB40
UE4Editor.exe!0x000000007A95EBBA
UE4Editor.exe!0x000000007A970A29
UE4Editor.exe!0x000000007A9722B6
KERNEL32.DLL!0x00000000E8692774
ntdll.dll!0x00000000E8F90D61
ntdll.dll!0x00000000E8F90D61
(遵循本教程:https://www.udemy.com/unrealcourse/learn/v4/t/lecture/4621210?start=15)
这看起来像是一个空指针异常。在某些时候,您正在访问一个未正确初始化的指针。
"ActorThatOpens"在哪里初始化的?还有 "PressurePlate",仔细检查以确保它们是有效的指针。
如果将重叠称为 on/from 空对象,它可能会导致崩溃。
Sai Narayan可能是对的,你可以在调用游戏逻辑代码之前检查你的指针有效性。
if ((PressurePlate != nullptr) && (ActorThatOpens != nullptr))
{
if (PressurePlate->IsOverlappingActor(ActorThatOpens))
{
OpenDoor();
}
}
如果您之前没有设置 PresurePlate
或 ActorThatOpen
,它可以防止您的程序崩溃。
请记住,TickComponent
函数将在拥有您的组件的 actor 在游戏世界中生成后立即启动。所以 TickComponent
可以在你实际初始化你的组件成员之前被调用。
不要为此使用 Tick,这是不必要的开销。 UE4是事件驱动的,所以实现OnOverlapBegin函数调用你的具体代码。
编辑:首先在蓝图中进行,确保您的逻辑和执行路径合理,然后将其移至代码。这正是蓝图的意义所在。