SideQuestでobbファイルをインストールしようとするとCannot read property 'match' of undefinedというエラーが出る

問題

Meta Questの実行ファイルをAPKファイルとOBBファイルに分割してSideQuestでインストールしようとすると Cannot read property 'match' of undefined といったエラーが出る。

解決方法

OBBファイル名をmain.[version-code].[package-name].obbというフォーマットにする。SideQuestはファイル名でアプリケーションのインストール先を判別している。 なお、[version-code]Android特有の整数で指定するアレで、[package-name]com.example.appnameみたいなアレ。

ちなみに以下のページで書かれているOculusの場合とはファイル名のフォーマットが違うので注意。 www.toshizabeth.com

OBBファイルは/sdcard/Android/obb/以下にインストールされるので、そこを見れば正常にインストールできたか確認できる。

もっといい解決方法

どうもSideQuestではAPKファイルだけを使用することが標準のようだ。SideQuestで使用する実行ファイルは分割しないで、APKファイルだけにまとめた方がいい。

An asset is marked with HideFlags.DontSave but is included in the build: というエラー

症状

Unityでビルド時にAn asset is marked with HideFlags.DontSave but is included in the build:というエラーが出てビルドが通りません。

解決策

当該ファイルをResourcesフォルダの外に出すとビルドが通りました。

参考: https://gist.github.com/RimuruDev/ed6e8b69fcfc4420004c4d928821b102

しかし、Resourcesフォルダから出してもダメなファイルがあり、それはファイルを削除するしかなかったです。意味が分からないです。

このページでは「Project Settingsを消す」という方法が紹介されていたので試してみましたがダメでした。 kasugayu.hatenablog.com

autosshでsshトンネリング(ポートフォワード)を維持する

動的IPアドレスのクライアントにsshトンネリングを維持させる方法です。思いのほか苦労したので記録しておきます。ちなみにcygwinのautosshを使用しています。

1. sshd側でClientAliveIntervalを設定する

これを設定しないとネットワーク切断後にもsshdのプロセスが永久に残り続けるという恐ろしい事態が発生します。sshdのプロセスが残っているとトンネルしたいポートが占有され続けて、トンネルを再開できなくなります。

sshdClientAliveIntervalの間隔(秒)でクライアントに対して応答確認を行い、失敗したらsshクライアントを切断します。

この非常に重要なClientAliveIntervalGentooではデフォルト値が設定されているようですが、Ubuntuでは設定されていないようです。

# /etc/ssh/sshd_config
ClientAliveInterval 15
ClientAliveCountMax 3

sshd_configを編集したらsshdを再起動して設定を反映させる必要があります。 ebizou-rion.hatenadiary.org

2. autosshの-Mオプションで通信監視ポートを固定する

autosshの-Mオプションで通信監視ポートを必ず固定する必要があります。このポートには使用されていない適当なポートを指定します。トンネルしたいポートを指定してはダメです。

この設定により、ネットワーク切断後、上記1.の設定によりsshdのプロセスが終了されて通信監視ポートが解放されるまでautosshは接続をリトライし続けます。つまり、autossh接続は排他制御されて、同時に存在するautossh接続は1つだけになります。

この設定をしないと、sshdのプロセスがサーバーにまだ残っている段階でautosshがssh接続を再開してしまいます。そうするとssh接続は再開するものの、まだ残ってる古いsshdプロセスがトンネルしたいポートを占有しているので、トンネリングを再開させることができません。

なお、ちょっと設定は不明ですが、素のOpenSSHクライアントでもトンネリングに失敗した時ssh接続を切断するというに設定にもできるようなので、それで排他制御することも可能かもしれません。ここでは-Mオプションで排他制御しました。

ちなみに-Mオプションを使用しないと空いているポートが通信監視に使用されるためautossh接続の排他制御になりません。-M 0にすると通信が監視されません。これらの設定にしてはいけません。

3. その他必須ではないが必要かもしれない設定

3.1. autosshのポーリング間隔を設定する

autosshのポーリング間隔はデフォルトで600秒です。これは長すぎる気がするので短くしました。オプションではなく環境変数で設定します。

AUTOSSH_POLL=15

3.2. ExitOnForwardFailureは設定しない

ExitOnForwardFailureYesになっていると、ポートフォワードが失敗した時にautosshも終了してしまいます。ExitOnForwardFailureが設定されてないか~/.ssh/configの記述を確認しましょう。

3.3. autosshにハートビートさせる

上記1.で設定したClientAliveIntervalsshd側のハートビート設定で、クライアント側のハートビート設定がServerAliveInterval になります。タイムアウトさせないためにはどちらか片方だけ設定すれば十分なので、別に設定しなくていいですが、両方設定しても問題はないです。クライアントにもハートビートさせたい場合はどうぞ。

-o ServerAliveInterval=15 -o ServerAliveCountMax=3

ssh 接続をタイムアウトしないようにする · GitHub

autosshのコマンドライン

以上まとめると最終的なコマンドは以下のようになります。

AUTOSSH_POLL=15 autossh -vvv -M 54321 -i 証明書のパス -L 12345:127.0.0.1:12345 -R 8080:127.0.0.1:8080 ホスト名

-vvvは冗長なログを表示するオプションです。 localhostではなく127.0.0.1を使用しているのは私のcygwin環境だとlocalhostが解決できないためです。

所感

以上のとおりautosshのオプションとsshの設定が調和して初めてトンネルを維持できるようになっており、非常にややこしいです。


【Unity】超おすすめの神アセット総まとめ 2023年版

前提として私が作るゲームは主にFPS、TPS、VR等の3Dゲームです。VRChatはあまりプレイしないので、VRChat対応かどうかは重視していません。

絶対に買うべき

Final IK

キャラクターに武器を持たせたり、スイッチを押させたりといったインタラクティブなアニメーションをさせることができます。 UnityにもIKはあるので、お金を節約したい人はUnity標準のIKでもいいかもしれませんが、Final IKは公式ドキュメントやぐぐった時の情報量が多いので分かりやすいです。

Realistic Eye Movements

キャラクターにまばたきさせたり、目線を動かしたりさせることができます。キャラクターがとても生き生きするのでオススメ。TPSみたいにキャラクターとカメラの距離が遠いゲームではいらないかも。

あるとちょっと便利。セールで安ければ買ってもいいかも

PuppetMaster

ラグドールです。主にキャラクターの死亡アニメーションを作るのに使用しますが、そういうのは普通のアニメーションでも十分なので別になくても困りません。あればちょっと嬉しいっていうところです。Unityにもラグドール機能があるので、ちょっとラグドールを使う程度ならUnity標準のラグドールでいいかもしれません。

UMotion Pro

キャラクターのアニメーションをUnity上で編集することができます。こういうアセットを買わなくてもBlenderやCascadeurとかのフリーソフトでアニメーションは編集出来ます。ただ、Unity上で編集できるとちょっと便利なこともなくはないので持っててもいいかもしれません。

Very Animation

UMotion Proと同じくキャラクターのアニメーションをUnity上で編集することができます。こういうアセットを買わなくてもBlenderやCascadeurとかのフリーソフトでアニメーションは編集出来ます。ただ、Unity上で編集できるとちょっと便利なこともなくはないので持っててもいいかもしれません。

買わなくてよい

Animancer Pro

キャラクターのアニメーションをブレンドしたり遷移させたりできるアニメーションシステムです。Unity標準のアニメーションシステムより高機能なんですが、FPSとかTPSのアニメーション程度ならUnity標準のアニメーションシステムで十分だし、標準の方が情報量が多いです。ほとんど使用していないので買ったのを後悔しています。

Unity上でメッシュを編集できようにするアセット

Blenderで出来るし、Blenderの方がやりやすいです。

簡単な編集ならフリーのアセットでもできるものがあります。 booth.pm

github.com

ステージ背景やマップとかのモデル

フリーのアセットでもクオリティの高いものがあります。フリーで十分です。セールで買うと積みアセットになりがちです。必要になった時に買いましょう。

返金

購入したアセットが気に入らなかったら返金してもらうことが可能です。返金してもらえるかどうかは販売者の裁量なので確実に返金されるとは言えませんが。セールで買ったものでも可能です。メガバンドルは下記のリンクではできそうなことが書かれていますが不明(誰か試してみてください)。

アセットストアの返金ポリシーについて知りたい

Unityの変なエラー

記事にするほどでもなさそうなエラーはとりあえずここにまとめることにしました。

1. Unity起動時に No valid user created or default window found. というエラーが出てUnityが起動しない。

対処

Libraryフォルダを削除してUnityを再起動したらエラーが消えました。なんか変なエラーが出たらLibraryフォルダ削除になりがちだなあ・・・

2. Androidビルド時にgradleが変なエラーを出す。

  • Value 'xxxxxxxx' given for org.gradle.java.home Gradle property is invalid (Java home supplied is invalid)

環境変数を変えても直りませんでした。

対処

C:\Users\ユーザー名\.gradle以下のgradle.propertiesを修正する。

Unityは自前のJDKとgradleを使用するのですが、gradleの設定ファイルはユーザーディレクトリを参照するようです。

Windows 10のHyper-VでGPUパススルーはできない

前回の記事Linux上でROCmが使用できるようになったので、Hyper-V上のゲストLinuxにホストのAMDGPUをパススルーして、ROCmを使用しようとしたらWindows 10が完全にクラッシュしました。

結論を言うと、Windows 10でGPUパススルーは不可能

以下の記事によると、

DDAは、Windows 10では利用できず、Windows Server 2019はサポート対象であるにも関わらず、動かないようです。つまり、現在公式資料にある方法ではHyper-VGPUを利用出来ない状態です。

とのこと。

qiita.com

以下の記事に従って設定したのですが、 Windows Server 2019の仮想マシンでGPUパススルーをする | ガジェット好きの趣味blog Dismount-VMHostAssignableDeviceコマンドを実行した段階で、プライマリGPUを外してしまったことに気づき、そのままだと作業しにくいのでプライマリGPUを戻そうとしたのですが、結局最後までホストにGPUを戻せませんでした。

Mount-VMHostAssignableDeviceを実行するとブルースクリーンになって「SYSTEM THREAD EXCEPTION NOT HANDLED」と表示されます・・・。どゆこと?引数なしで実行してもブルースクリーンになります。ヤバすぎる。

ぐぐった情報を基に デバイスマネージャーでGPUドライバをアンインストールしたり、 Hyper-Vをアンインストールしたり、 Dismountされたデバイスが記載されているレジストリを削除しようとしたんですが駄目でした。

どうやら上記のことができるのはWindows Server 2019だけで、Windows 10で上記コマンドを実行するとブルースクリーンになるということが判明しました。

結局、たまたま直前にCドライブの完全バックアップを取っていたので、それで復旧させました。 もし皆さんがHyper-Vでパススルーを試す場合は、必ずバックアップを取ってからやってください。

Radeon RX 500シリーズでROCmを使用してStable Diffusionで遊ぶ

RX 470, RX 480, RX 570, RX 580(Polarisアーキテクチャ)はROCm 4.5でサポートされなくなって残念と勘違いしていましたが、リンク先の記事をちゃんと読んだらOpenCLがサポートされないだけで、ROCm自体は普通に動くようです。ROCm 5.5で確認済み。ROCm 6.0でついにバイナリから除外されたみたいですが、ROCmを自分でビルドすればまだいけそう・・・みたいです。てか最近はOpenCLじゃなくてHIPっていうライブラリの方がメジャーみたいなんですね。全然知りませんでした。

なお、OpenCL環境変数ROC_ENABLE_PRE_VEGA=1を設定すればRX 500シリーズでも使用できるようです。ROC_ENABLE_PRE_VEGA=1 clinfoROC_ENABLE_PRE_VEGA=0 clinfoで、clinfoの出力が変化することを確認しました。もちろんOpenCLを使わないなら設定する必要はないです。

ROCmは今も普通に動くのですが、各ディストリビューションのアプリはRX 500シリーズを対象にビルドされていないのでアプリが動かないです。Arch LinuxだけはRX 500シリーズを対象にしたパッケージを今も提供してくれてるようですが。

ということで自分でアプリをビルドすればROCmでRX 500シリーズを動作させることができます。Stable Diffusionで遊ぶ場合は、pytorchとtorchvisionを自分でビルドしてやればよいです。ROCmを使用するアプリを自分でビルドするには、開発用ライブラリをインストールする必要があります。よってGPUドライバのインストールを次のオプションで行います。

amdgpu-install --usecase=rocm,mllib,mlsdk

or

amdgpu-install --usecase=rocm,hip,hiplibsdk

mlsdkhiplibsdkの違いはよく解りません。どちらでもだいたい同じライブラリがインストールされるようです。

ライブラリは/opt/rocm/にインストールされるので、ここにパスを通した上で、アプリがRX 500を使用するように設定してビルドすればOKです。

あと、グループの設定が必要でした。反映させるのに再起動が必要。

sudo usermod -a -G render $LOGNAME
sudo usermod -a -G video $LOGNAME

pytorchのビルド方法はだいたい以下リンクのThe old approachというセクションのとおり。 are-we-gfx1100-yet.github.io

pytorchビルド時に変更すべき設定はこんな感じです。

export CMAKE_PREFIX_PATH=hogehoge:/opt/rocm/
export USE_CUDA=0
export PYTORCH_ROCM_ARCH="gfx803;gfx900;gfx906;gfx908;gfx90a;gfx1030"

gfx803がRX 500シリーズを指します。

PYTORCH_ROCM_ARCHの記述はArch Linuxの設定を参考にしました。PKGBUILD · 2.0.1-2 · Arch Linux / Packaging / Packages / python-pytorch · GitLab