一日分の備忘録

ゲーム制作におけるいろいろな実装の備忘録。基本的にはゲームエンジン中心。その中でもUE4がメイン。

処理時間計測の備忘録

BPのある部分のみ処理時間を計測したくなったのを気になったので作成。
この処理自体の処理時間はわかりません。

C++クラスを作成。
.h

UFUNCTION(BlueprintCallable, Category = "Clock")
static void StartClock();

UFUNCTION(BlueprintCallable, Category = "Clock")
static float EndClock();

.cpp

#include <windows.h>

static LARGE_INTEGER freq;

static LARGE_INTEGER start_time, end_time;

void UClock::StartClock()
{
	QueryPerformanceFrequency(&freq);
	QueryPerformanceCounter(&start_time);
}


float UClock::EndClock()
{
	QueryPerformanceCounter(&end_time);
		
	return 1000 * (float)(end_time.QuadPart - start_time.QuadPart) / freq.QuadPart;
}

適当に重い処理を書いて計測。
f:id:oneday-memorandum:20170816160207p:plain

こんな感じで使う
f:id:oneday-memorandum:20170816160212p:plain

レベルに配置したActorのインスタンス変数の編集可否をフラグで管理する方法についての備忘録

BPではmetadataにアクセスできなさそうなのでC++クラスを作成。
下記コードを追加
Trueのときに編集可

UPROPERTY(Category = "test", EditAnywhere, BluePrintReadWrite, meta = (EditCondition = "EditTest"))
int hoge;
UPROPERTY(Category = "test", EditAnywhere, BluePrintReadWrite)
bool EditTest;

これだけ。後は作ったC++クラスを継承したアクターをレベルに配置するとこういう感じで表示されるので、チェックONOFFで編集状態が切り替わる。
f:id:oneday-memorandum:20170809165851p:plain

Falseのときに編集可にする場合は下記の通り

UPROPERTY(Category = "test", EditAnywhere, BluePrintReadWrite, meta = (EditCondition = "!EditTest"))
int hoge;
UPROPERTY(Category = "test", EditAnywhere, BluePrintReadWrite)
bool EditTest;


enumで編集可、不可の設定

UPROPERTY(Category = "enumtest", EditAnywhere, BluePrintReadWrite, meta = (EditCondition = "EnumValue==enable"))
int enableEdit;
UPROPERTY(Category = "enumtest", EditAnywhere, BluePrintReadWrite, meta = (EditCondition = "EnumValue==disenable"))
int disenableEdit;
UPROPERTY(Category = "enumtest", EditAnywhere, BlueprintReadWrite)
enumtest EnumValue;

としたいところだが、どうやらEditConditionは式を判別できない模様。
ということでこんな感じでまずはコードを書く。(今回はチェックのためにあえてbool型をEditAnywhereにしている。)

/*クラスの外にenumを宣言*/
UENUM()
enum class enumtest : uint8
{
	enable UMETA(DisplayName = "enable"),
	disenable UMETA(DisplayName = "disenable")
};

/*クラス内に変数を宣言*/
UPROPERTY(Category = "enumtest", EditAnywhere, BlueprintReadWrite)
bool enumBool;
UPROPERTY(Category = "enumtest", EditAnywhere, BluePrintReadWrite, meta = (EditCondition = "enumBool"))
int enableEdit;
UPROPERTY(Category = "enumtest", EditAnywhere, BluePrintReadWrite, meta = (EditCondition = "!enumBool"))
int disenableEdit;
UPROPERTY(Category = "enumtest", EditAnywhere, BlueprintReadWrite)
enumtest EnumValue;

書いたらこんな感じで公開される
f:id:oneday-memorandum:20170809165926p:plain
この段階であえて表示しているチェックをONOFFで編集可、不可が切り替わるが、enumを変更しても変わらない。
ここまでできたらコンストラクションスクリプト内でこのようにノードを組む。
f:id:oneday-memorandum:20170809170822p:plain
あとはコンパイルしてenumを切り替えると編集可、不可が切り替わる。できたら使わないbool変数は表示しないようにしておく。

forums.unrealengine.com
ここによるとCanEditChangeをオーバーライドすると式の評価ができるみたいだが、よくわからなかった。
誰か教えてください。

Wwiseのインストールについての備忘録

非商用に限り無償使用可能
ただし性能は制限される。

Audiokineticに無料登録。
https://www.audiokinetic.com/ja/

f:id:oneday-memorandum:20170717171151p:plain


とりあえずSDKやらC++やら全部インストール。
プロジェクトごとにインテグレーションするかエンジン自体にインテグレーションするかがあるがとりあえず検証用なのでプロジェクトに。実際プロジェクトに突っ込むほうが楽そう。

f:id:oneday-memorandum:20170717171141p:plain

プロジェクト見つからないときはBrowse for projectで検索

f:id:oneday-memorandum:20170717171145p:plain

インテグレーションするときOSXSDKがないって言われたのでOSXにチェックを入れ直して再インストールしたら問題なく行けた。
備忘録で書いてるけど正直インストールしてUE4用にインテグレーションするなら書いてあるとおりにやるだけで行ける。Wwiseすごい。

f:id:oneday-memorandum:20170717171610p:plain

実際にどういったことができるかは、先人たちの情報に助けられることになりそうだが、これで音ゲーが捗りそう。目指せ、Airtone。
ぷちコンに出す際はWwiseは商用利用じゃないから使っても良いんだろうか・・・(多分良いとは思うが)

 

 

逆行列についての備忘録

ゲームにおける各行列

オフセット

| 1 0 0 0 |

| 0 1 0 0 |
| 0 0 1 0 |

| x y z 1 |

スケール

| x 0 0 0 |

| 0 y 0 0 |

| 0 0 z 0 |

| 0 0 0 1 |

回転

X軸

| 1    0       0    0 |

| 0  cosθ  sinθ 0 |

| 0 -sinθ  cos    0|

| 0    0       0    1 |

Y軸

| cosθ 0 -sinθ 0 |

|   0    1     0   0 |

| sinθ 0   cosθ 0|

|  0    0      0   1 |

Z軸

| cosθ sinθ 0 0 |

|-sinθ cosθ 0 0 |

|  0      0     1 0|

|  0      0     0 1|

回転は面倒くさい。

各行列を掛け合わせることで連続的な変換になる。かける順で結果が変わる。基本的にはスケール、回転、オフセットの順でかける。

 

逆行列

|_11 _12 _13 _14|

|_21 _22 _23 _24|

|_31 _32 _33 _34|

|_41 _42 _43 _44|

と対応する行列を掛けることで結果が

|1 0 0 0|

|0 1 0 0|

|0 0 1 0|

|0 0 0 1|

になる行列のこと。これを利用することでゲーム上ではワールド座標系からローカル座標系に変換することができる。

 

4行4列の逆行列の求め方

余因子行列を用いる方法、掃き出し法を用いる方法がある。

4行4列の逆行列を求めるには、 余因子行列を用いる方法と、 掃き出し法を用いる方法の二つがある。

 

うだうだとたくさん書いたが実はUE4ではBPでは行列の取得はできない。

代わりにTransformを受け取ることができ、そこにはLocation、Rotation、Scaleが格納されており非常に操作しやすい。

 

今回はこれを使って↓のようなミニマップ的なものを作るための土台を作るためのBP操作の備忘録。

f:id:oneday-memorandum:20170716215357g:plain

 

ただし今回のBPはVR用の備忘録なので3D空間に配置したメッシュとメッシュの座標を合わせるだけ。基本的には同じような感じで2D⇔3Dができる。

 

①サイズの異なるメッシュの作成

f:id:oneday-memorandum:20170716215411p:plain

f:id:oneday-memorandum:20170716215403p:plain

 

配置

f:id:oneday-memorandum:20170716215419p:plain

 

②とりあえずデバッグ用にカメラ向きの先にレイを飛ばす

f:id:oneday-memorandum:20170716215432p:plain

 

当たったオブジェクトを判別。相互で位置の共有ができるようにするため。

f:id:oneday-memorandum:20170716215438p:plain

 

クリックしたときにレイのヒットしていたポイントにSphereを出すために値を保存

 

f:id:oneday-memorandum:20170716215443p:plain


③ヒットしたオブジェクトのTransformと位置を共有したい先のオブジェクトの逆行列後のLocationを取得。相互に使用するため2つ用意した。UE4ではInverseTransformLocationがその座標系に合わせて逆行列を掛けローカル座標にするといった(解釈間違ってるかも?)有能なノードがあるのでそれを使用。

f:id:oneday-memorandum:20170716215454p:plain

 

逆行列してローカル座標系にしたLocation共有先のTransformをかける。

マジックナンバーが腹立たしいが解決方法がわからず。

f:id:oneday-memorandum:20170716215501p:plain

イメージ的にはこんな感じしたものを元に戻す感じ。

f:id:oneday-memorandum:20170716220412p:plain

それらを配置するように値を保存し、そこにSphereをスポーンするような処理を書いてやる。

f:id:oneday-memorandum:20170716215513p:plain

ちょっと広めに見たらこんな感じ

f:id:oneday-memorandum:20170716215526p:plain

 

結果

こうなる

f:id:oneday-memorandum:20170716215531g:plain

f:id:oneday-memorandum:20170716215618g:plain

処理不可がそこそこ食いそうな気がするのでもう少し処理不可を軽減したいのであれば、限定的な使い方ではあるが、基準点を2つ用意して位置の最大値最小値を計算して合わせる方法があるがこちらは力技感があるのでがんばってください。

 

逆行列はアニメーションモデルを読み込んだ際にボーンの親子関係などで触った以来だったがUE4では難なく使用できた。

こいつを使うことで侵入してきたものがどちらから侵入してきたかと言った取得もできるので非常に有用。

 

不備や間違いなどあればtwitterで教えていただけると助かります。

twitter.com

開設

ゲーム制作だったり思いついたことの備忘録にTwitterは向かないしEvernoteはなんか違うとなったしでとりあえずブログ開設。

テンプレートはとりあえず初期のままだが後々カスタムしていきたい。

広告を非表示にする