C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

UE4: 点や線を簡易的に3D空間内へ描画する方法、あるいは UKismetSystemLibrary::DrawDebug 系の紹介

概要

見栄えはともかく、3D空間内の任意の座標へ、点や線、あるいは立方体や球などを、さっくりと簡単に表示したい事がしばしばあります。特にデバッグ用途でそのような表示機能を上手く仕込んで置くと開発効率が向上します。

そのような場合に、わざわざ Billboard にテクスチャーを貼ったオブジェクトを用意したり、BOXを引き伸ばして配置したり、 UProceduralMeshComponent を使うまでもなく便利に使える UE4 に標準搭載された UKismetSystemLibrary::DrawDebug 系の機能を紹介したい。

f:id:USAGI-WRP:20171221045628p:plain

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 をどうぞ。

この方法の特徴

  1. 見栄えはともかく、表示したいだけならばとても簡単。すぐに実装できる。
  2. 表示だけ、なので当たり判定を取りたい場合などには役に立たない。
  3. 色に不透明度を定義しても反映されない。
  4. 球などの立体も稜線しか描画できない。
  5. ライティングも適用されないし、発光もできない。

参考