2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

UE4のデストラクタについて

Posted at

よくある問題

ゲームの実装にアクター(Actorクラス)や、
アクターコンポーネント(ActorComponentクラス)を使用すると思います。
これらを破棄するにはDestroyを使用すると思います。

Actor
// e.g.
AACtor* Alice;
:
Alice->Destroy(); // ここでデストラクタは呼ばれ…?

実はこの場合、Destroy時にすぐデストラクタは呼ばれません。

詳しくは後述しますが、
デストラクタが呼ばれるのはDestroyしたタイミングではありません。
そのため処理順によってはバグに繋がります:scream:

デストラクタはいつ呼ばれるの?

アクターに対してDestroyをかけた場合は、
IsPendingKill のフラグがたち、
GCなどによってフラグがたっているもの全てが破棄されます。
このときに呼ばれます。

それまでは内部的には実体が残っているのでデストラクタは呼ばれません。
アクターのライフサイクル(公式ドキュメント)

終了処理はどう書くの?

ではデストラクタではなく、どこにゲーム中の終了処理を書くかについてです。
EndPlay をオーバーライドすることで終了処理を書けます。

Actor
class MY_API AAlice : public AActor
{
:
    virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;

これであればDestroyされたり、
Levelがアンロードされたときに終了処理がすぐ呼ばれます。

まとめ

デストラクタに終了処理を無闇に実装するのは処理順の関係上危険です:warning:
特殊な処理やデバッグ処理を書かない限り、
基本的にデストラクタは書く必要がないでしょう。

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?