一日分の備忘録

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

遂に発売!聖剣伝説3 Trials of Mana!

合法エロゲやら性剣伝説やらいろいろ言われてますが遂に発売しました

聖剣伝説3 Trials of Mana

 

 

 

思い出せばいろいろ苦労しました。

そう・・・とても・・・苦労しました・・・

しかしこうやって無事に発売され、昨今では実況プレイで生配信などでユーザーの声が聞ける!良い時代になりました。

 

評価の方は概ね好評。中には「リメイクとはこうあるべきだ。ほかのリメイクも聖剣伝説を見習うべきだ」と評価していただいてありがたい限りです。

個人的にはもう少し面白さを求められたのではゲフンゲフン

 

私自身はSteam版を購入予定ですので現時点(2020/4/24 22:00)ではまだプレイできないのですが、今からプレイするのが楽しみです(死ぬほどプレイしたはずなんですけど楽しみです)

いろいろ知見や実装方法などたまったので、一部分をこう使えば良いよね、といったことをブログ化しても良いかもしれないですね。

 

ということで皆様、聖剣伝説3 Trials of Manaをよろしくお願いいたします!

新モニターを購入した

あまり大きくないモニターがほしくてつい買ってしまった。

12000円。まぁ安くはないけどなかなか満足の行く買い物だったかなと思う。

ついでに部屋の掃除もして作業環境を整えた。

※真ん中下の奴は液タブ

f:id:oneday-memorandum:20200119220334j:plain

 

 

最近スマホ二台持ちしたいなぁとか思い始めてきたけど、ほしい端末がありすぎて困る。でも二台持ちしたからといって何に使うかといわれると、用途が思い浮かばない。

なのでここは「買う理由が値段なら買うな。買わない理由が値段なら買え」という信条にさらに「用途を考えて迷うなら買うな」が追加されました。

まぁ当たり前のことなんだけどね。

本当に欲しいものだったら値段がいくらでも買うと思うし、必要ないかも?なものが安かったらとりあえず買っとこって言って結局使わないことが多くなる。

今後は物を買う前はこれを口に出そうと思う。そうしたらより良いお金の使い方ができそうだ。

 

日記的なブログ記事はもしかすると初めてかもしれない。最初で最後の可能性はなくもない。

Oculus QuestをUE4で使う備忘録

忘年会でOculusQuest当てたので


UE4.24.1

何番煎じかわからんけどとりあえず備忘録ってブログ名だし・・・いいよね!

①USB接続のType-Cを購入
https://www.amazon.co.jp/dp/B01LQ26IYM/ref=cm_sw_r_tw_dp_U_x_AS2bEbBQSPVQT
NintendoSwitchですでに購入済みだった。ラッキー

②Oculus アプリをPCにインストール
たぶんOculus Linkとかで調べてPCゲーやろうとしている人は既に入ってるはず
www.oculus.com
Rift Sのソフトウェアをダウンロード・インストール

③Oculus Questを開発者モードにする
kimono-oyaji.com

Android Codeworksをインストール

EngineInstallPath\UE_4.XX\Engine\Extras\AndroidWorks\Win64
CodeWorksforAndroid-1R7u1-windows

AndroidSDK4.4.2用をインストール。
上記完了後下記バッチからAPI19を選択してインストール

NVPACK\android-sdk-windows\tools
android.bat

⑤プロジェクトを作成。
取りあえずVRテンプレート。C++でやりたい場合はBlankとかで。

UE4Android用設定
プロジェクト設定->プラットフォーム->Android
最低限のSDKバージョンとターゲットSDKバージョンを19以上にする
Oculus モバイルデバイス向けのパッケージにOculusQuestを追加
上記完了後一応再起動する

⑦セットアップ完了!あとはお好きにVR開発ライフを!
f:id:oneday-memorandum:20191229194202p:plain


詰まった点
VRプレビューしてもプレビューできない
→OculusLinkでPCとOculusQuestを接続しておく必要がある。
②OculusQuestのそもそも初期設定ができない
iPhone or Androidで対応のOculusアプリをインストールして初期設定
③コントローラーが動かない
→なんか適当にやったら治った。謎(調べないと)


過去にこんな講演してるんで開発に役立ててやってください

www.slideshare.net

ブログ記事
oneday-memorandum.hateblo.jp

BuildConfigration.xmlの備忘録+α

Engine\Programs\NotForLicensees\UnrealBuildTool\BuildConfiguration.xml

Engine\Saved\UnrealBuildTool\BuildConfiguration.xml

C:\Users\username\AppData\Roaming\Unreal Engine\UnrealBuildTool\BuildConfiguration.xml

C:\Users\username\Documents\Unreal Engine\UnrealBuildTool\BuildConfiguration.xml

 

この順番で読み込まれる。後に読み込まれるやつほど優先度が高い。

 

 

AndroidとかWindowsなど、プラットフォームに分けて処理

#if PLATFORM_○○(ANDROIDとかWINDOWSとか)
#endif

 

プロジェクトC++コードをバッチでビルドする備忘録+α

for /f "tokens=1,2,*" %%A IN ('reg query "ROOTKEY\SUBKEY" /v "VALUEKIND"
') do if "%%i"=="RegistoryKey" SET GET_VALUE=%%k

%GET_VALUE%Engine/Build/BatchFiles/Rebuild.bat GameProjectEditor Win64 Development -Project="uprojectpath\project.uproject" -WaitMutex -FromMsBuild 
pause

エンジンインストールしてるパスを取得して中にバッチリストの中からRebuildバッチを指定してプロジェクトをリビルドする感じ。多分行ける。
"GameProjectEditor "部分は各プロジェクト名に応じて変わる。気を付けるべし。
もちろんBuild.batもある。

ROOTKEYメモ

HKEY_LOCAL_MACHINE → HKLM
HKEY_CURRENT_USER → HKCU
HKEY_CURRENT_CONFIG → HKCC
HKEY_CLASSES_ROOT → HKCR
HKEY_USERS → HKU

↓↓↓もっと詳しく↓↓↓
www.atmarkit.co.jp

これ見てもわからない人はレジストリ触ろうとしないでね。(今回は編集してないけど)
↑の記事が消えていたとき用
f:id:oneday-memorandum:20191024113339p:plain:h128:w128

レジストリの構成要素
レジストリとは、Windowsシステム内部の各種設定値を保存しておくためのデータベースである。
システムの設定やソフトウェアの構成内容、ユーザーごとの環境設定など、Windows OS内で動作しているさまざまなコンポーネントがこのレジストリを参照して動作している。
レジストリ中には、ツリー状の「キー」が構築されている。
トップにあるのが「ルートキー」、その下にあるのが「サブキー」だ。
それらの中に、幾つかの「値」が設定されている。値は名前と種類(型)、データで構成されている。
これは「ユーザー環境変数」を保持しているレジストリキーの例である。

+α
powershellで特殊パス取得~

Desktop C:\Users\accountname\Desktop
Programs C:\Users\accountname\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
Personal C:\Users\accountname\Documents
MyDocuments C:\Users\accountname\Documents
Favorites C:\Users\accountname\Favorites
Startup C:\Users\accountname\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
Recent C:\Users\accountname\AppData\Roaming\Microsoft\Windows\Recent
SendTo C:\Users\accountname\AppData\Roaming\Microsoft\Windows\SendTo
StartMenu C:\Users\accountname\AppData\Roaming\Microsoft\Windows\Start Menu
MyMusic C:\Users\accountname\Music
DesktopDirectory C:\Users\accountname\Desktop
MyComputer
Templates C:\Users\accountname\AppData\Roaming\Microsoft\Windows\Templates
ApplicationData C:\Users\accountname\AppData\Roaming
LocalApplicationData C:\Users\accountname\AppData\Local
InternetCache C:\Users\accountname\AppData\Local\Microsoft\Windows\Temporary Internet Files
Cookies C:\Users\accountname\AppData\Roaming\Microsoft\Windows\Cookies
History C:\Users\accountname\AppData\Local\Microsoft\Windows\History
CommonApplicationData C:\ProgramData
System C:\Windows\system32
ProgramFiles C:\Program Files
MyPictures C:\Users\accountname\Pictures
CommonProgramFiles C:\Program Files\Common Files


~リダイレクタ修正~

UE4Editor.exe ProjectName -run=fixupredirects

ウインドウのアクティブ・非アクティブの瞬間を取得する方法の備忘録

どうやらApplicationLifecycleComponentというものがあるらしいので使ってみた。
結果->失敗
モバイル機のみらしい・・・

ということでエンジンを見てみた。
WindowsApplication.cppで色々制御を行っていてFWindowsApplication::ProcessDeferredMessageという関数があったのでここにApplicationLifecycle(FCoreDelegates::)のデリゲート呼び出したら行けそう。

WindowsApplication.cpp 1543行目~

int32 FWindowsApplication::ProcessDeferredMessage( const FDeferredWindowsMessage& DeferredMessage )
 {
	if ( Windows.Num() && DeferredMessage.NativeWindow.IsValid() )
	{
		HWND hwnd = DeferredMessage.hWND;
		uint32 msg = DeferredMessage.Message;
		WPARAM wParam = DeferredMessage.wParam;
		LPARAM lParam = DeferredMessage.lParam;
==================================================省略==================================================
~~~~~~~1980行目くらい
			// Window focus and activation
		case WM_ACTIVATE:
			{
				EWindowActivation ActivationType;

				if (LOWORD(wParam) & WA_ACTIVE)
				{
					ActivationType = bForceActivateByMouse ? EWindowActivation::ActivateByMouse : EWindowActivation::Activate;
				}
				else if (LOWORD(wParam) & WA_CLICKACTIVE)
				{
					ActivationType = EWindowActivation::ActivateByMouse;
				}
				else
				{
					ActivationType = EWindowActivation::Deactivate;
					/********↓ここを追加↓*********/
					FCoreDelegates::ApplicationWillEnterBackgroundDelegate.Broadcast();
				}
				bForceActivateByMouse = false;

				UpdateAllModifierKeyStates();

				if ( CurrentNativeEventWindowPtr.IsValid() )
				{
					BOOL Result = false;
					Result = MessageHandler->OnWindowActivationChanged( CurrentNativeEventWindowPtr.ToSharedRef(), ActivationType );
					return Result ? 0 : 1;
				}

				return 1;
			}
			break;

		case WM_ACTIVATEAPP:
			UpdateAllModifierKeyStates();
==================================================省略==================================================
 }

行けました。

if (LOWORD(wParam) & WA_ACTIVE)
else if (LOWORD(wParam) & WA_CLICKACTIVE)

こいつらどう挙動がちがうんだろう。
マウスでアクティブ化したときとalt+tabとかでアクティブ化した時の場合分けやろ(多分)
暇な時に要検証・・・知ってる人いたら教えて下さい。

12/29追記
Twitterで教えてもらいました
感謝です。
docs.microsoft.com

場面転換的なクロスフェードの備忘録

お久しぶりでございます。

平成も終わり令和になりましたので久しぶりの記事を書きます。今回はクロスフェードの実装。

クロスフェード自体は一瞬で終わるので、クロスフェードの中でも、ワープや場面転換に使えそうなクロスフェードを実装。

一瞬で終わるクロスフェードの実装

マテリアル作成してMaterialDomainをPostProcessにして以下の通りにノード組んでBPでLerpを0-1で変動サせていくだけ!簡単!

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

 

↑に追加実装をしてみる。

今回はこんな感じで実装。

youtu.be

 

SceneCapture2Dを使います。なんかこの間登壇したときもその前登壇したときもこれについて喋った気がする。SceneCapture2D大好き。

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

 

例えばこんな感じで配置(ここに配置しているのはSceneCapture2Dではなく、普通のカメラです。)

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

 

今回の実装用にマテリアルを組み直し。

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

このときマテリアルの設定のBlendableLocationの設定次第ではかなり絵が暗くなるので、ポストプロセス的に問題なければ、BlendableLocationはToneMapping前にしておくと良いでしょう。(実はなんで絵が変わるかは雰囲気でしかわかってない。教えてほしい・・・切実に)

 

次にBPの実装

今回は汎用性は何も考えずにレベルブループリントに書いていく。

scenecapture2dで使う用のrendertarget生成

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

 

パラメータ変更用にDynamicMaterialInstanceを生成(処理負荷的に少しでも抑えるために、SceneCapture2Dの毎フレームのキャプチャー処理をオフに)

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

 

クロスフェード前処理

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

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

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

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

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

Lerpのパラメータ更新にはタイムラインノードを使用
f:id:oneday-memorandum:20190502150137p:plain

 

以上で完成。

上記のままだと1回しかできないので、各々使い方に応じて適宜追加・修正してください。

なお激重なので基本的にはFrameGrabberを使うか、エンジン改造でシェーダー書かないとダメそうかも。