ヒマがあるならゲームつくってね

こんなとこ見てないでゲームをつくろう

UE4:AIControllerからPawnにNavMesh移動の移動情報を通知している流れ

 Characterクラスではなく、PawnをNaviMesh移動させたかったので、C++のソースを読んでAIControllerからPawnには、どんな情報を通知して、NaviMesh移動しているのか調べました。
 AIController(厳密には、ビヘビアツリーのMoveToのようなTaskノード)から、Pawnの中のMovementComponentのVelocityベクトルに、目的地まで移動するための移動ベクトルが設定されているみたいです。
PawnにはMovementComponentがないので、追加する必要はあります。
 例えば、C++で、カスタムPawnクラスにPawnMovementComponentを追加して、BPからVelocityを取得して、そのベクトルをもとに、移動を行えば、NaviMeshによる移動がPawnクラスでもできるみたいです。
 BPからは、PawnMovementComponentは追加できないので、C++で追加する必要があります。

	Movement = CreateDefaultSubobject<UPawnMovementComponent>(TEXT("Movement"));

f:id:siu3:20150527210225p:plain

 実際のところは、特別な動きのPawnを作ってNaviMesh移動する必要がない限りは、NaviMeshによる移動は、AIControllerとCharacterクラスを利用すれば、C++のコードも書かずに簡単に利用できるので、そちらを使ったほうがいいです。
ビヘイビアツリーのクイックスタートガイド | Unreal Engine

UE4:C++プロジェクトのMacとWin間の移動

C++プロジェクトをMacからWinにもってくる場合は、VS用のソリューションファイルを生成してあげる必要があります。
プロジェクト内の*.uprojectを選択して、右クリックメニューを開くと「Generate Visual Studio project files」という項目があるのでそれを実行すれば、VS用のソリューションファイルが生成されます。
また、Mac側で日本語のコメント書いたソースファイルは、文字コードがUTF-8になっているので、S-JISに変更しないとビルドエラーになります。


f:id:siu3:20150518223815p:plain


WinからMacも同じような手順でxcodeのプロジェクトファイルを生成できました。
この場合、右クリックメニューではなく、Finder->サービスから「Generate Xcode Project」を実行です。
f:id:siu3:20150519195341p:plain

UE4:C++Actorから色々な型の変数をUPROPERTYしてみた。

エディタやブループリントからC++で作ったActorのメンバー変数にアクセスするには、UPROPERTYマクロを指定する必要があるらしいので、色々な型の変数をUPROPERTYしてみました。
その時、わかったことがあるので記します。

  1. とりあえずなら、UPROPERTYは、UPROPERTY(EditAnywhere, BlueprintReadWrite)にしておけば、エディターとBPからアクセスできる。
  2. 整数はuin8とInt32以外は、エディターとBPからアクセスできないみたい。(コンパイルエラーにはならない)
  3. 浮動小数はdoubleはだめで、floatのみエディターとBPからアクセスできるみたい。コンパイルエラーにはならない)
  4. enum は UENUM()マクロ と TEnumAsByteテンプレートを使う必要がある。ので記述がちょっと面倒。
  5. 配列はTArrayテンプレートをつかえばいい。
  6. UPROPERTYマクロの引数Categoryは取り合えずは必要ないけど、変数が増えてきたら、分類するのに便利。名前は自由につけられる。
  7. 変数のデフォルト値の設定は、クラスのコンストラクタで設定すれば、それがデフォルト値になる。
//enumの上にUENUM()をかかないと、エンジンが認識しないです。
UENUM()
enum ETestEnumType{
   TypeA,
   TypeB,
   TypeC,
   TypeD,
};
:
:
// 整数はuin8とInt32以外は、エディターとBPからアクセスできないみたい。

	UPROPERTY(EditAnywhere, BlueprintReadWrite,Category=Integer)
	uint8 uint8Value;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Integer)
	uint16 uint16Value;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Integer)
	uint32 uint32Value;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Integer)
	uint64 uint64Value;
	
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Integer)
	int8 int8Value;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Integer)
	int16 int16Value;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Integer)
	int32 int32Value;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Integer)
	int64 int64Value;
//浮動小数はfloatのみエディターとBPからアクセスできるみたい。
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Float)
	float floatValue;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Float)
	double  doubleValue;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Boolean)
	bool  bBoolValue;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Boolean)
	uint32 bBFBoolValue:1;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = String)
	FString  FStringValue;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = String)
	FName  FNameValue;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = String)
	FText  FTextValue;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Object)
	AActor* ActorValue;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Object)
	UStaticMeshComponent* StaticMeshCompValue;


	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Etc)
	FVector FVectorValue;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Etc)
	FRotator  FRotatorValue;
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Etc)
	FColor FColorValue;
//enum は TEnumAsByteというテンプレを使う必要がある。
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Etc)
	TEnumAsByte<ETestEnumType> ENumValue;
//配列はTArrayテンプレートをつかえばいい。
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Etc)
	TArray<int32>  arrayValue;


f:id:siu3:20150516163055p:plain


わかれば、なんてことないけど、Unityでクラスの変数をエディターに公開するより、癖がありました。
公式ドキュメントのページには、UPROPERTYの言語説明のページはあるけど、使い方の説明が足りない気がします。



参考

マック版のUE4エディタのフリーズを解消できず、WIN版にもどる。

 MacBookProで、4.6.xも4.7.xも色々試したのですが、どうしても、C++でクラスを追加しようとするとUEのメニューを表示するときに、フリーズしてプログラムが戻ってこない。
 残念ながらWIN版のUE4の開発環境を復活させて、しばらくは、そっちで利用することにしました。
こういう時、BootCampは便利。

UE4 「ビヘイビアツリーのクイックスタートガイド」 を修正してみた。

UE4のビヘイビアツリーを勉強しようとして、ドキュメントのクイックスタートガイドを試していたのですが、ページが無くなっていたり、バージョンが上がったせいか無くなったBPのノードがあったので、勉強と思い調べて動くようにしました。
まあ、写経するよりは、覚えたと思います。
そこで、修正したところを載せておきます。

続きを読む

UE4 カスタムのブループリントノードの作成

C++でカスタムのブループリントのノードを作成するのは、思った以上に簡単でした。
英文だけど、以下ページに方法がほぼ書いてあるので参考になります。
Custom Blueprint Node Creation - Epic Wiki

作成のステップは以下のような感じです。

  1. エディターで「プロジェクトにコード追加」を選択します。
  2. 親クラスにBluePrintLibraryを指定してクラスを生成します。
  3. そのクラスにUFUNCTIONマクロと共にstaticメソッドを追加すれば、そのメソッドがブループリントノードになります。メソッド複数追加できます。メソッドはpublicに指定しないと外部からアクセスできないので注意。

UFUNCTIONに関しての説明
関数 | Unreal Engine