1
0

More than 3 years have passed since last update.

UE4 CurveTableについてのメモ

Posted at

概要

UnrealEngine のデータテーブルのカーブテーブルについてのメモです。

環境

Windows10
Visual Studio 2017
UnrealEngine 4.22

参考

以下を参考にさせて頂きました、ありがとうございます。

[UE4] CSVデータを扱う方法 CurveTable編
UE4 値が補完されるCSVファイルを使う(Curve Table、Evaluate Data Table Row)

カーブテーブル(CurveTable)

アンリアルにはカーブアセットがたくさんあります。

curve_kind.jpg

↑のカーブではなく、データテーブル派生のカーブテーブルについて扱います。

カーブテーブルアセットの作成

まず、csvデータを用意します。

CT_test.csv
,0,10,20,30,40,50,60,70,80,90,100
Curve01,10,11,12,13,50,51,52,53,1000,1100,1200
Curve02,20,21,22,23,24,25,500,600,700,800,900

コンテンツブラウザにcsvデータをドラッグ&ドロップします。
データテーブルと同様にインポートメニューが表示されます。

DataTableOption.jpg

インポートを[CurveTable]、カーブ補間タイプを[Liner]を選択します。
補間タイプによっては別途選択が必要です。

できたアセットを開くとデータを見ることができます。
csvデータと同じです。
CurveTable_Data.jpg

[ウィンドウ] -> [CurveView]を選択すると表示が切り替わります。

CurveTable_View.jpg

微妙に見にくいですが、カーブの具合を見ることができます。
(カーブと違い、なぜかカーブテーブルはズームすることができないです。。)

また、カーブの補間タイプは最初のインポート時で決まり、変更ができないようです。

補足

上記例ではcsvから作成しましたが、データテーブルのようにjsonからでも作成ができます。
その場合は以下のようなJSONデータになります。

CT_test.json
[
    {
        "Name": "Curve01",
        "0": 10,
        "10": 11,
        "20": 12,
        "30": 13,
        "40": 50,
        "50": 51,
        "60": 52,
        "70": 53,
        "80": 1000,
        "90": 1100,
        "100": 1200
    },
    {
        "Name": "Curve02",
        "0": 20,
        "10": 21,
        "20": 22,
        "30": 23,
        "40": 24,
        "50": 25,
        "60": 500,
        "70": 600,
        "80": 700,
        "90": 800,
        "100": 900
    }
]

BPでのカーブデータ取得

BPでは[Evalute Curve Table Row]を使い、テーブルデータと行の名前を指定して取得できます。
(ソースは "Engine\Source\Runtime\Engine\Private\DataTableFunctionLibrary.cpp" です)
EvaluteCurveTable_.jpg

上の例では[In XY]で 15.0 を指定しているので、[Out XY]で 11.5 が返ってきます。(カーブの補間方法が違うと値も変わります)

C++でのカーブデータ取得

以下がC++での取得コード例です。

.h
UPROPERTY()
UCurveTable* CurveTable;

CurveTableアセットのポインタをコンストラクタでFindして、FCurveTableRowHandle 経由で取得するか、カーブを一旦保持してから値を取得します。

.cpp
#include "Classes/Engine/CurveTable.h"

// コンストラクタ
// CT_test というカーブテーブルを探す
static ConstructorHelpers::FObjectFinder< UCurveTable > find_curvetable(TEXT("CurveTable'/Game/CT_test.CT_test'"));
if (find_curvetable.Succeeded()) {
    CurveTable = find_curvetable.Object;
}

...

// カーブデータを取得例1
FCurveTableRowHandle _Handle;
_Handle.CurveTable = CurveTable;
_Handle.RowName = *FString::Printf(TEXT("Curve01"));
float _OutXY;
static const FString _ContextString(TEXT("GENERAL"));

if (_Handle.Eval(15.0f, &_OutXY, _ContextString)) {
    UE_LOG(LogTemp, Log, TEXT("OutXY = %f"), _OutXY);
}

// カーブデータを取得例2
auto _Curve = CurveTable->FindCurve(*FString::Printf(TEXT("Curve02")), _ContextString);
if (_Curve != nullptr) {
    UE_LOG(LogTemp, Log, TEXT("Value=%f"), _Curve->Eval(25.0f) );
}

コンポジットカーブテーブル(Composite Curve Table)

4.21から追加されたアセットタイプのようです。
複数のカーブテーブルをまとめることができるます。

compositecurvetable.jpg

CT_test と CT_test2 のカーブテーブルをまとめています。
compositecurvetable_editor.jpg

Rowデータの取り出しは通常のカーブテーブルと同様に[Evalutate Curve Table Row]ノードを使って取り出すことが可能のようです。
コンポジットカーブテーブルを使うとカーブ補間タイプが違うカーブテーブルをまとめて1つのアセットのように扱うことができます。

複数のカーブテーブルを取りまとめるため、Row名がかぶるとどうなるのかは検証しきれていませんが、警告のようなものは確認できませんでした。
使う場合は、Row名のルール決めが必要だと思われます。

まとめ

カーブはいろいろ種類が多く、エディターのビューも違うため注意が必要なようです。
カーブテーブルはシンプルなつくりのためキャラクターのパラメータの補間などの用途には使えると思います。

1
0
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
1
0