2017-04-16 10 views
0

ここでは、トリガーボリュームがドアを開くようにするために、次のコードを書きました(Changes Actor Yaw)。選択されたActor(ActorThatOpens)が入った場合Unreal Editorを再生するとinstatntlyクラッシュします。誰も助けることができますか?私は、私が達成しようとしていたことを十分にはっきりと願っています。オーバーレイをチェックすると、オーバーラップをチェックするとクラッシュする

追加この.Hのコード:

private: 
    UPROPERTY(VisibleAnywhere) 
    float OpenAngle = 90.0f; 

    UPROPERTY(EditAnywhere) 
    ATriggerVolume* PressurePlate; 

    UPROPERTY(EditAnywhere) 
    AActor* ActorThatOpens; //Pawn inherits from actor 

この.cppファイルに:私はTriggerVolumeに圧力プレートを設定し、コンポーネントとしてこれを追加でした

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(); 
    } 
} 

俳優(ドア)に。 私はこのエラー(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(); 
    } 
} 

それはあなたが前にPresurePlateまたはActorThatOpenを設定しなかった場合にクラッシュするようにプログラムを防ぎます。

関数は、ゲームワールドでコンポーネントが作成された直後に起動することを覚えておいてください。したがって、コンポーネントメンバーを実際に初期化する前に、TickComponentを呼び出すことができます。

+0

また、ゲームオブジェクトが破壊されることが予想される場合は、IsValidLowLevel()チェックを実行する必要があります。 –

1

これは、nullポインタ例外のように見えるが。ある時点で正しく初期化されていないポインタにアクセスしています。

"ActorThatOpens"はどこで初期化されていますか?また、 "PressurePlate"をチェックし、それらが有効なポインタであることを確認してください。

ヌルオブジェクトとの間でオーバーラップを呼び出すと、クラッシュする可能性があります。

+1

これらはUProtpertysで、レベルエディタで設定できます。または私は間違っていますか? – Lerrrtaste

+0

エディタで正しい設定ができないので、設定されていればそれは問題ではありません。 ブレークポイントでデバッグを試したことがありますか? –

0

ティックを使用しないでください。これは不要なオーバーヘッドです。 UE4はイベント駆動型なので、OnOverlapBegin関数を実装して特定のコードを呼び出します。

編集:まず青写真で行い、ロジックと実行パスが健全であることを確認してからコードに移動してください。これはまさに青写真が意味するものです。

関連する問題