KRNKRS
(KRNKRS)
1
同等の、というと語弊があるかもしれませんが、BPでExecuteConsoleCommandでコマンド実行していたのをC++で呼び出したいです。ということです。
自分なりに色々外国の方のpostなども検索して以下の事までは分かっています。
- ExecuteConsoleCmmandと同等の機能は「GetWorld()->Exec(GetWorld(), コマンド)」で可能である
- GetWorld()はconst修飾
- GetWorld()は"Engine/World.h"インクルードで使用可能
しかし、呼び出す(実装したい)関数自体はFunctionLibraryとしたく、故にstaticつけてTargetSelfを除外したいと考えています(ExecuteConsoleCmmandはそうですし、自作関数の方でもどこでも呼べるようにしたい)。しかし、そうするとGetWorld()を呼べなくなり、コマンド実行することが出来ない。と言った状態になっています。
staticを付けつつ(selfピンを除外しつつ)、GetWorld()を呼び出す方法。もしくは、別のアプローチで解決する方法はありますでしょうか。
宜しくお願いいたします。
KRNKRS
(KRNKRS)
2
ちなみにですが、ExecuteConsoleCmmand関数の中身はどのような実装が行われているのかを知るためにUE4 内ソースコードをソリューションレベルで検索かけたのですが、ヒットしませんでした(Android関連のコード内にはあったが多分別物?)。探し方が間違ってるのでしょうか…それともそもそも検索かけて見つけるものでもないのでしょうか
paperbag
(paperbag)
3
ひとつひとつお答えしていきますね。
①BlueprintFunctionLibrary等GetWorldを使用しない場合のWorld情報の取得方法
// Header定義
UFUNCTION(BlueprintCallable, Category="Example",meta=(WorldContext="WorldContextObject"))
static void ExampleFunction(UObject* WorldContextObject);
// cpp定義
void UExampleFunctionLibrary::ExampleFunction(UObject* WorldContextObject)
{
// DoAnything.
}
上記のようにmeta指定子を使ってWorldContextというものを使います。
引数のWorldContextObjectには呼び出し側がUObjectを継承していれば、thisを渡してやればいいです。
呼び出し例(UObjectを継承したクラス)
UExampleFunctionLibrary::ExampleFunction(this);
②ExecuteConsoleCmmandの定義
下記に定義が書かれています
Engine\Source\Runtime\Engine\Classes\Kismet\KismetSystemLibrary.h
Engine\Source\Runtime\Engine\PrivateKismetSystemLibrary.cpp
③ExecuteConsoleCommandのC++側での呼び出し
例としてstat fpsの呼び出しを行っています。
#include "Kismet/KismetSystemLibrary.h"
UKismetSystemLibrary::ExecuteConsoleCommand(this, "stat fps");
第3引数はPlayerControllerが必要ですが、指定しない場合はExecuteConsoleCommand側で取得して呼び出します。
もし自前のPlayerControllerを使用している場合はそちらを第3引数に渡してください。
KRNKRS
(KRNKRS)
4
無事実行することが出来ましたありがとうございます!
多重質問していることに気づいていませんでした申し訳ありません