読者です 読者をやめる 読者になる 読者になる

simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

UnrealEngine4.12のC++プラグイン機能を利用する

オブジェクト(UE4だとActor)のTransformをC++のコードから編集したいだけなんです。

私がどんな落とし穴にハマっていくか、記録していきます。

Visual Studio 2015 を Community からインストールしました。
あ、ここまでは大丈夫です。
C++がディフォルトで入っていないことは下調べして知っているので、ちゃんとC++の項目にチェックを入れてインストールしました。

7/2 追記:
公式ドキュメント入門書もバッチリ読んでます。
間違いようがないです。

そしてその作業フローを実行すると

コンパイル失敗」

Unreal Engine を 4.12, 4.11, 4.10 と試しても同じエラーが出ました。
これは…Visual Studio の Update に問題があるのかな?

と調べると、確かにそんな記述が数時間前から公式フォーラムにちらほら上がりだしてきた。

When i start UE4 with C++ it gives me compile failed every time - UE4 AnswerHub
Unreal Error "This project could not be compiled. Would you like to open it in Visual Studio?"
Compile Failed when creating Cpp project - UE4 AnswerHub

どうも、Unreal Engine 4 のビルドエラー祭りにナイスタイミングでハマったようだ。
4.12.4 の次期バージョンでは直る予定とのことで
お急ぎの方はひとまず Visual Studio 2015 の Update 3 を Update 2 に戻して使ってほしいとのことです。

めっちゃ時間がかかっていますが Visual Studio のバージョン差し戻し作業しています。
なんか…Visual Studioのバージョン戻しても同じエラーが起こりそうな予感はしているのだけど、とりあえずやってみます。

具体的には、先に Update 3 が適用された Visual Studio をアンインストールして
次のリンクから Update 2 のインストーラ(Visual Studio Community 2015 with Update 2)を取得してインストールするだけです。
Visual Studio Release Notes | Visual StudioVisual Studio 2015 Update 2 now available for download


追記:
ぎゃあぁあああ!
update-2 のインストーラでインストールしても update-3 になってしまった!
終わった。
どうやったら update-2 のまま使えるのか…戻す方法とか無いの!?
何よりここまで時間を無駄にしたことに腹が立っている

追記:
と、ここで転機がおとずれる
実はリンク先で取得した Visual Studio は英語版だったので、今までUE4が文字化けして表示していたエラー内容が表示されるようになった
そこをキーワードに検索をかけて解決策の提示にたどり着く

forums.unrealengine.com

具体的な解決方法は
C:\Program Files (x86)\Epic Games\4.12\Engine\Source\Runtime\Core\Public\Windows\WindowsPlatformCompilerSetup.h
ファイルの末尾に#pragma warning(disable : 4599)を追記して Unreal Engine 4.12 をC++で起動してみると良いとのこと。

うおぉおお!初めてコンパイルエラーが起きずにプロジェクトが立ち上がったぞ!
私の環境では解決した!
やっと入門書の通りに作業が開始できる。

できた!
f:id:simplestar_tech:20160702184120j:plain

Unity の MonoBehaviour を継承したスクリプトコンポーネントに感覚が似ていました。
Unreal Engine だと Actor の Location をいじることで Actor の位置を変えることができました。
以下は実装コードの一部です。

#include "GameFramework/Actor.h"
#include "FloatingAnimActor.generated.h"

UCLASS()
class HEADERREPLACEPROJECT_API AFloatingAnimActor : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AFloatingAnimActor();

	// Called when the game starts or when spawned
	virtual void BeginPlay() override;
	
	// Called every frame
	virtual void Tick( float DeltaSeconds ) override;

	float RunningTime;
	
};

// 以下は実装ファイルの記述

// Called every frame
void AFloatingAnimActor::Tick( float DeltaTime )
{
	Super::Tick( DeltaTime );

	FVector NewLocation = GetActorLocation();
	float DeltaHeight = (FMath::Sin(RunningTime + DeltaTime) - FMath::Sin(RunningTime));
	NewLocation.Z += DeltaHeight * 20.0f;       //Scale our height by a factor of 20
	RunningTime += DeltaTime;
	SetActorLocation(NewLocation);
}

いや、驚きましたよ。
エディタのコンパイルボタンを押したら、即上記のコードの編集内容が反映されてゲームが実行できました。
エントリの目標達成はまだですが、ひとまず一行目に書いたやりたいことまでは確認できました。