UE4: 点や線を簡易的に3D空間内へ描画する方法、あるいは UKismetSystemLibrary::DrawDebug 系の紹介
概要
見栄えはともかく、3D空間内の任意の座標へ、点や線、あるいは立方体や球などを、さっくりと簡単に表示したい事がしばしばあります。特にデバッグ用途でそのような表示機能を上手く仕込んで置くと開発効率が向上します。
そのような場合に、わざわざ Billboard にテクスチャーを貼ったオブジェクトを用意したり、BOXを引き伸ばして配置したり、 UProceduralMeshComponent
を使うまでもなく便利に使える UE4 に標準搭載された UKismetSystemLibrary::DrawDebug
系の機能を紹介したい。
UKismetSystemLibrary::DrawDebug 系
UE4 に標準搭載された UKismetSystemLibrary::DrawDebugXxxx
系の関数群を用いると次のジオメトリー群の描画を簡単に実装できる:
- header:
#include "Runtime/Engine/Classes/Kismet/KismetSystemLibrary.h"
- Xxxx: ここは実際には
Point
などジオメトリーの種類で置換する。
Xxxx | 効果 |
---|---|
Arrow | 矢印 |
Box | 立方体 |
Camera | カメラ |
Capsule | カプセル |
Circle | 円 |
Cone | 円錐(長さで開きを定義) |
ConeInDegrees | 円錐(角度で開きを定義) |
CoordinateSystem | 座標系 |
Cylinder | 円柱 |
FloatHistoryLocation | 軌跡 |
FloatHistoryTransform | 変形跡 |
Frustum | 錐台 |
Line | 線分 |
Plane | 平面 |
Point | 点(正方形) |
Shpere | 球 |
String | 文字列 |
使い方
#include "Runtime/Engine/Classes/Kismet/GameplayStatics.h" #include "Runtime/Engine/Classes/Kismet/KismetSystemLibrary.h" // 適当なアクターに実装 void AMyPawn::Tick( float DeltaTime ) { Super::Tick( DeltaTime ); // 2.5 秒ごとに表示を on/off する細工 static float tt = 0; tt = FMath::Fmod( tt + DeltaTime, 5.0f ); if ( tt < 2.5f ) { // アクターの位置に赤い球を描画 UKismetSystemLibrary::DrawDebugSphere( GetWorld(), GetActorLocation(), 100.0f, 12, FLinearColor::Red, 0.0f, 3.0f ); // プレイヤーの位置を取得(本題と直接は関係しない) auto l0 = UGameplayStatics::GetPlayerPawn( GetWorld(), 0 )->GetActorLocation(); // プレイヤーの位置からこのアクターの位置へ黄色の矢印を描画 UKismetSystemLibrary::DrawDebugArrow( GetWorld(), l0, GetActorLocation(), 100.0f, FLinearColor::Yellow, 0, 3.0f ); } } // プレイヤーのアクターに実装 void TestCharacter::Tick( float DeltaTime ) { Super::Tick( DeltaTime ); // プレイヤーの位置に "PLAYER[0]" を緑色で描画 UKismetSystemLibrary::DrawDebugString( GetWorld(), GetActorLocation(), TEXT( "PLAYER[0]" ), nullptr, FLinearColor::Green, 0 ); }
このシリーズの関数の引数は始めに UWorld
を取り、続く前半はそれぞれ点であったり、始点と終点であったり、さまざま、後半は色と表示の持続時間、それと設定可能な場合は線の太さなどを与える仕組みです。具体的には API Reference をどうぞ。
この方法の特徴
- 見栄えはともかく、表示したいだけならばとても簡単。すぐに実装できる。
- 表示だけ、なので当たり判定を取りたい場合などには役に立たない。
- 色に不透明度を定義しても反映されない。
- 球などの立体も稜線しか描画できない。
- ライティングも適用されないし、発光もできない。
参考
- UKismetSystemLibrary::DrawDebugArrow | Unreal Engine
- UKismetSystemLibrary::DrawDebugBox | Unreal Engine
- UKismetSystemLibrary::DrawDebugCamera | Unreal Engine
- UKismetSystemLibrary::DrawDebugCapsule | Unreal Engine
- UKismetSystemLibrary::DrawDebugCircle | Unreal Engine
- UKismetSystemLibrary::DrawDebugCone | Unreal Engine
- UKismetSystemLibrary::DrawDebugConeInDegrees | Unreal Engine
- UKismetSystemLibrary::DrawDebugCoordinateSystem | Unreal Engine
- UKismetSystemLibrary::DrawDebugCylinder | Unreal Engine
- UKismetSystemLibrary::DrawDebugFloatHistoryLocation | Unreal Engine
- UKismetSystemLibrary::DrawDebugFloatHistoryTransform | Unreal Engine
- UKismetSystemLibrary::DrawDebugFrustum | Unreal Engine
- UKismetSystemLibrary::DrawDebugLine | Unreal Engine
- UKismetSystemLibrary::DrawDebugPlane | Unreal Engine
- UKismetSystemLibrary::DrawDebugPoint | Unreal Engine
- UKismetSystemLibrary::DrawDebugSphere | Unreal Engine
- UKismetSystemLibrary::DrawDebugString | Unreal Engine