3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

UE4 ゲーム開発記 2020/8/2

Last updated at Posted at 2020-08-02

#概要
こんにちは。パンダマスターと申します。
最近、UE4でゲームを作り始めました。

#注記
この記事の内容はEpic Gamesとは何の関係もありません。

#免責事項
当記事に記載されている内容、サンプルコードを使用することによって被った、いかなる損害に対しても筆者は一切責任を負いません。当記事のサンプルコードの使用に際しては自己責任にてお願いします。
上記に同意していただける方のみ、続きをお読みください。
続きを読むことによって、上記の免責事項に同意したことになります。

#今回の目標
モデリングとアニメーションの作成及び適用。

#バージョン情報
Unreal Engine 4.25.3

#実装
早速、実装を見ていきましょう!
まだ整理された状態ではないため、コード全体ではなく苦労した点についてかいつまんで書いていきます。
投稿中のコードはプロジェクトからの抜粋ですので、それだけでは動きません。

##Blenderでもモデリングとアニメーション作成
シェイプを加工してパンダを作ります。
最初に出来上がったのがこれ。
panda1.png
大変雑な作りになってますが、サブディビジョンかけて手足をくっつけて、UVをちゃんと設定したらこうなりました。
panda2.png
多少、マシになりました。
UE4にインポートしてみます。
panda3.png
シェーダー万歳。UE4様様ですね。

上の画像でも適用されていますが、さらにBlenderでアニメーションを作成していきます。
ボーンとリグの設定はAuto-Rig Proを使ってサクッと生成しました。
Auto-Rig Proは$40でボーンとリグの自動生成をした後、UE4向けにエクスポートもしてくれるので、大変便利です。
これがないとモデリング初心者の私にはつらいですね。
アニメーションの作成はプログラミング要素ゼロなので割愛します。ググればいくらでも資料出てきますし。

##アニメーションの適用
さて、エクスポートしたFBXをインポートして、動かしてみましょう。
アニメーションの適用順序は以下の通りです。

・3ループだけIdle
・そのあと目標地点に移動しながらRun
・目標地点に到達したらIdle

###3ループだけIdle
これはアニメーションコンポジットと通知を使用します。
始めはモンタージュ使っていたのですが、現段階ではうまく扱えなかったため、同じくUE4でゲーム制作している知人から助言を得てコンポジットにしました。
compsite.png
モーションの繰り返しは単純にAsset Browserからアニメーションアセットをドラッグ&ドロップするだけです。
画面右端のEndIdleという黄色いタグのようなものが通知で、これの通知を受け取ることによってBP側ではアニメーションの切り替えを行い、C++側では移動を開始します。
ちなみにモデルの名前がDORKASになっているのは、当初はバーチャロンの二次創作をしようかと思っていたので、その名残です。

以下のコードは前回の記事の追加コードになります。
新たにHandleNotifyメソッドをオーバーライドして、通知を受け取るようにします。

UAnimInstanceを継承したクラス.h
UCLASS(minimalapi)
{
class UAnimInstanceEx : public UAnimInstance
	virtual bool HandleNotify(const FAnimNotifyEvent& AnimNotifyEvent) override;

	UPROPERTY()
	bool StartRun = false;

	UFUNCTION(BlueprintPure, meta = (BlueprintThreadSafe))
		bool RunRule();
};
UAnimInstanceを継承したクラス.cpp
bool UAnimInstanceEx ::HandleNotify(const FAnimNotifyEvent& AnimNotifyEvent)
{
	StartRun |= AnimNotifyEvent.NotifyName.IsEqual(FName(TEXT("EndIdle")));
	if (StartRun) {
		ACharacterEx* _Pawn = Cast<ACharacterEx>(TryGetPawnOwner());
		if (_Pawn)
		{
			AAIControllerEx* _Controller = Cast<AAIControllerEx>(_Pawn->GetController());
			_Controller->EnableRun();
		}
	}
	return StartRun;
}

bool UAnimInstanceEx ::RunRule()
{
	return StartRun;
}

通知を受け取ったら単純にフラグを立てるだけです。
また、ブループリントのIdle→Runのトランジションのために、RunRuleで通知で立ったフラグを返しています。
このようにコンポジットに作られた通知を基に、C++で処理を書くことができます。
もちろん、BPだけでもできる処理だとは思うのですが、BP苦手なのでC++で処理しています。

##出来上がり
Youtube動画
UE420200802.png

##感想
UE4はやり方が分かるまでは躓きますが、分かってしまうと一気に全てが動き出す優れたツールです。
すっかりはまってしまいました。

また進捗あれば投稿します。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?