2017-04-16 20 views
0

虛幻初學者在這裏,我只寫了下面的代碼以讓觸發器卷打開一扇門(變化角色偏航)。如果一個選定的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,並將此作爲組分演員(門)。 我得到這個錯誤(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

回答

2

Sai Narayan可能是對的,你可以在調用遊戲邏輯代碼之前檢查指針的有效性。

if ((PressurePlate != nullptr) && (ActorThatOpens != nullptr)) 
{ 
    if (PressurePlate->IsOverlappingActor(ActorThatOpens)) 
    { 
     OpenDoor(); 
    } 
} 

它可以防止你的程序的情況下崩潰你之前還沒有設置PresurePlateActorThatOpen

請記住,TickComponent函數將在擁有您的組件的actor在遊戲世界中產生後開始。所以TickComponent可以在你真正地初始化你的組件成員之前調用。

+0

另外,如果你期望遊戲對象可以被銷燬,你應該做IsValidLowLevel()檢查。 –

1

這看起來像一個空指針異常。您正在訪問一個尚未正確初始化的指針。

「ActorThatOpens」在哪裏初始化?和「PressurePlate」,仔細檢查以確保這些指針是有效的。

如果在空對象上調用重疊,它可能會導致崩潰。

+1

他們是UProtpertys,所以我可以在關卡編輯器中設置它們。或者我錯了? – Lerrrtaste

+0

不,你是對的,他們可以在編輯器中設置,所以如果他們設置,那應該不是一個問題。 您是否嘗試過使用斷點進行調試,以查看它確切崩潰的位置? –

0

不要爲此使用Tick,這是不必要的開銷。 UE4是事件驅動的,因此實現OnOverlapBegin函數來調用您的特定代碼。

編輯:首先在藍圖中執行此操作,確保您的邏輯和執行路徑正確,然後將其移至代碼。這正是藍圖的意義所在。