一日分の備忘録

ゲーム制作におけるいろいろな実装の備忘録。基本的にはゲームエンジン中心。その中でもUE4がメイン。プログラマーなのでプログラム的な記事が多くなるかも

プロパティ指定子の備忘録

プロパティ指定子使いそうなものについてまとめ

UPROPERTY()で設定できるもののこと


AdvancedDisplay
Detalis(詳細)パネルの拡張ドロップダウンリストに表示される。

AssetRegistrySearchable
メンバー変数として格納するアセットクラスインスタンスからこのプロパティと値が自動でアセットレジストリに追加される。
構造体やパラメータの使用は厳禁
難しく言ってるけど要するに検索できるようにする。

BlueprintAssignable
マルチキャストデリゲートのみ使用可能。ブループリントへ割り当てるためにプロパティを公開する。

BlueprintCallable
マルチキャストデリゲートのみ使用可能。ブループリントのグラフでの呼び出しのために公開するプロパティです。

BlueprintReadOnly
プループリントでの読み取りのみ可能。

BlueprintReadWrite
ブループリントでの読み書き可能

Category
プロパティのカテゴリを指定をする。"|"を使ってネスト(入れ子)設定もできる。

UPROPERTY(Category="CategoryName|SubCategoryName")
Type VariableName;

Config
iniファイルで値を保存することができ、作成時にロードされる。編集はできない。

EditAnywhere
プロパティエディタに公開されて編集可能になる。
前記事参照oneday-memorandum.hateblo.jp


EditDefaultsOnly
プロパティウィンドウでのみ編集可能。Visible* とは互換性がない。

EditFixedSize
配列の長さの変更を制限する。

EditInline
アンリアルエディタのプロパティインスペクタ内で編集できるようになる。

EditInstanceOnly
詳細タブのみ編集可能になる。

NoClear
オブジェクト参照がNoneにならないようにする。

VisibleAnywhere
エディターでプロパティで表示する。編集は不可。

VisibleInstanceOnly
詳細タブでプロパティで表示する。編集は不可。

多分こんなもん

TGSに参加してきました。

1日目

グランツーリスモSPORTS
初心者用のブレーキ、ステアリングが自動
中級者向けのブレーキ自動が嬉しかった。

 

真・女神転生VR
コントローラーでタブレットを持って命令を送ると行った手法。タブレットに情報を入れるとなかなか良いのではないかとおもった。
途中地震の演出があり建物が崩れるのだが、その時に画面が揺れて気持ち悪くなったが、よく観察してみると、カメラは揺れておらず、周りの建物のみ上下に揺れていると行った演出をしていた。せめてもの酔い対策ということか。確かにカメラは揺らしてない。でも吐いた。ゲロゲロ

 

シリコンスタジオ
運転シュミレーター
酔い対策などは見受けられなかった。開発者と話をしたところ、シュミレーターだから酔い対策はしなかったとのこと。この話を聞いて、VRのコンテンツで何から何まで酔い対策を考える必要はないのだなと思った。新たな発見

 

インディーズ
自分にお金があればぜひ支援したいと思うようなゲームが非常に多かった。お金欲しい。あとはスイッチが結構あった。PSVRもそこそこ展示が増えた印象。もう少し英語話せるようになりたい。今後はスイッチに流れがそこそこきそうでした。

 

tobii
VR視線追従周りの技術でもがあった。
制度は良いが遅延がかなり気になった。お話を聞かせていただいたが、今後の酔い対策や処理不可の面で必ず必要になるだろうとtobii開発者と共通の認識だったので安心?した(なお話ししていただいたのはtobiiマーケティング部の方)。今後の対応が待たれるが、次のVRはスタンドアロン型のHMDが来ると予想されているので先はまだ長いか・・・待ち遠しい。

 

学生
ある程度のスペースがある学校には大体VR作品があり。どれも学生ながら非常によくできていた。

人気コンテンツ
MHWとCODWWⅡはすごく人気。会場15分ほどで受付終了すると言ったレベル。

またVRも、HMDをかぶるだけのVRと言うのは受付中止になるほどではなかったが、専用筐体や最新のVRウェアなどを着て参加するものはすぐに受付中止になっていた。

 

2日目
匂いVR
VRサクラ
チョコの匂いやスイカの匂い、香水の匂いが体験できる。中々たまらない感じがでてて非常によかった。今後この技術も発展していってほしいと思います。いけないことをしている気分になりました。これ以上は言葉で表すのは非常に難しい。そのような体験でした。

 

ペットと遊ぶやつ
不快な匂いは割りとそれだけで気分が悪くなった。やはり五感すべてが快適な体験が行えないとVR酔いと言うものが発生するのかと思う。このコンテンツに関しては自らはその場を動かず犬とたわむれるだけといったものなのだが、本当に匂いだけで気分が悪くなった。また新しいことを感じれたので、気分は悪くなったが満足した。

 

seiya
VR音ゲー。ノートが音になり、ノートを拾えなかったら音はならない。パンチするときの力が得点に加算される。結構疲れるもののVRの体験としては良いものではないかなと思われる。

 

ボトムズ
対戦系コンテンツ。専用コントローラーで移動などを行う。ゲームが始まると対戦相手と戦うのだが、相手が誰かわからない。2戦目にしてようやくルールが理解できた。
内容自体は非常に楽しく、コックピット系VRに専用コントローラーはかなり良い体験になることを再確認。Gyroと合わせられるような技術になると良さそう。やはりVRはアトラクション系との親和性はかなり高い。


Gyro
360度超回転するVR
VR酔いよりもアトラクション酔いが強いと感じる。映像と体にかかるGが少しだけタイミングがずれている部分があり、そこで一瞬胃液がこみ上げた。映像と体にかかるGを更に正確にすることが直近の課題だろう。しかしながら映像に合わせると没入感は群を抜くものになるだろう。アトラクションとしてぜひともはやってほしい。

 

閃の軌跡

完全に趣味。特に語ることはなく、ただただ楽しみ。

 

------------------------------------------------------------------------------------------------------------------------------------

全体

やはりと言うかなんというか注目はMHWだろう。これに関してはビジネスデーにも関わらずどこもかしこも人で溢れていた。全体的にスマートフォンゲームブースの人はそこまで多くなく、コンシューマ系に人がかなり多く流れていっていた。これはゲームの周期が一周したと言うのはまだ早いかもしれないが、ごくごく近い未来そうなるのではないかなと思う。

とは言うもののスマホの出店数は前年とほぼ同じくらいと言った印象。
去年に比べ、アーケードゲームは前年に比べ少ない?(というか全く見なかった)

コンシューマは各ハード少し減ってスイッチが参入してきたと言った感じ。

VRに関してはPSVRがかなり減ってviveがかなり増えた。というのも、上記で上げた専用筐体などを使ったものの影響がかなり大きいのかなと思う。VRは家庭で楽しむものというよりもアトラクション的な要素として楽しませていく方向にシフトしつつあるのか、果たしてと言った感じだった。もちろん前年に比べ、家庭で遊べるゲームも増えている。

また、PCゲームが去年に比べ、少し増えていたかなという印象、中でもPUBG(PLAYER UNKNOWN BUTTLE GROUND)はいたるところで見かけた。

こういった部分を見るとesportsやSteam配信(PCゲー)の時代にも流れになりつつあるのかもしれない。

処理時間計測の備忘録

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