【Unity】Unhandled exception. System.BadImageFormatException: Could not load file or assembly ILPostProcessorRunner.exe の直し方
Editorで開発中、突然「実行前にコンパイルエラーを直す必要があります」と言われ、Editor実行ができなくなった。 コンソールログを見ると以下のエラーが赤アイコンでたくさん並んでいた。
Unhandled exception. System.BadImageFormatException: Could not load file or assembly 'C:/Program Files/Unity/Hub/Editor/2021.3.14f1/Editor/Data/Tools/ILPostProcessorRunner/ILPostProcessorRunner.exe'. Format of the executable (.exe) or library (.dll) is invalid. File name: 'C:/Program Files/Unity/Hub/Editor/2021.3.14f1/Editor/Data/Tools/ILPostProcessorRunner/ILPostProcessorRunner.exe' at System.Runtime.Loader.AssemblyLoadContext.LoadFromPath(IntPtr ptrNativeAssemblyLoadContext, String ilPath, String niPath, ObjectHandleOnStack retAssembly) at System.Runtime.Loader.AssemblyLoadContext.LoadFromAssemblyPath(String assemblyPath) at Program.Main(String[] args)
結論
UnityHubから該当のUnity2021.3.14f1を再インストールすることで直った。
修正までの経緯
・起きる直前の作業は、コードを変更してCtrl+Rでスクリプトをロード
・普通のMonobehaviourコードで、特別なコードは書いていなかった。
・手元の変更がない他のプロジェクトを開いたところ、やはり同じエラーでEditor実行が出来なかった
・PCを再起動したが、治らなかった
・エラー内にあるILPostProcessorRunner.exeのフォルダを見に行ったところ、ファイルサイズが0KBになっており、更新日時がこの時点の1時間ほど前になっていた。
・UnityHubからUnityEditorをアンインストールして、再度インストールした
・無事に正常にEditor実行できるようになった
・再度ILPostProcessorRunner.exeを見たところ、46KBだった。
推測
意図しない何らかのプロセスがILPostProcessorRunner.exeを破損させた(例えばアンチウィルスソフトなど)
直前の作業や手元の変更は関係がないと思われる。
【Unity】VRゲームでCameraを重ねた固定位置UIは基本作れない
SteamVR Pluginに関する技術メモです!
前提
時間制限のような固定位置でのUI要素を作りたい!
- SteamVR PluginでのVR開発
- Unity2021.3.14f1
- Meta Quest 2 (Quest Linkを使用)
- Windows10
分かったこと
結論から言うと、ヘッドセットに描画出来るカメラは1つだけです。
普通のゲームと同じ要領で、Depthを上げたUI用カメラをCanvasの中に入れて通常のカメラの描画結果の上に重ねて・・という方法は、おそらく不可能です。
動作検証の詳細
画像の通りプレビューではUIが表示されていますが、実行するとヘッドセットでは消えてしまいました。 機能している1人称カメラを試しに消したところ、UI用カメラの結果だけが描画されるのでなく、何も描画されない結果になりました。
いろいろ試したところ、UI用カメラに以下の条件が満たされているとUI用カメラのみがヘッドセットで描画されました。
- Projection: PerspectiveはOK。OrthographicはNG
- ClearFlags: Sky boxはOK。Depth OnlyはNG。(おそらくSkybox or Solid Color)
- Depth: -1~1はOK。2はNG(おそらく2以上がNG)
- Target Display: 1はOK。2はNG
- Target Eye: BothがOK。NoneはNG (これは当然)
これらOK条件を全て満たしている場合のみ、Cameraがヘッドセットに描画されました。
そのようなカメラが複数ある場合は、Depthが高いものが優先されるようです。 条件を見れば分かる通り、そもそも複数のカメラで重ねて描画する設定が選択出来ません。
理由は不明ですが、ひとまずUIも含めて1カメラでシーン内に作っていくしかなさそうです。
推測
SteamVR PluginがUnityのカメラと深く結びついていて、マルチカメラが想定されていないまたは意図して制限しているのかもしれません。
一般的にいってカメラが複数あるとゲームのフレームレートは下がりますし、高FPSが必要とされるVRでは頑張って1カメラで作りなさいということなのかもしれませんね。
【おしながき】ゲームマーケット2022秋
【おしながき】コミックマーケット100
こんにちは! 丸ダイスです!
場所は
8/13(土)1日目 西し-19a
です!
1.「さかだちの街」(C100体験版)100円
さかだちをして視点をひっくり返すことでぶら下がってることになっちゃう
製作中のさかだちパズルアクションです!
インディーゲームコネクト2022、東京ゲームダンジョンで展示した内容と大体同じで、序盤のワールドを体験出来るものです!
ダウンロードURLのついてポストカードを頒布します!
ほか既作
- 「EQUALINE」(既作)1000円
- 3.「Treehouse Riddle ver2.04」(既作)1500円
他では手に入らないディスク版ですが、今月中に販売されるSteam版、Switch版の翻訳やコントローラー対応はないです!
ファングッズだと思って頂ければ。
- 4.「ピタゴラスの永久機関」(既作)1000円
「さかだちの街」の完成版も翻訳済みSteam版が初出の可能性があり、「コミケでパッケージ版を初出」も段々過去のものになっていくのかもな・・
という思い。 冬コミも出るかどうか・・ちょっと考え中です。
【Unity】unityroomのゲーム中で動画を再生する方法【Video Player】
例えば、このアニメーションロゴ動画をゲームの起動時に再生したい! www.youtube.com
そのやり方です。WebGL上でUnity の Video Playerを使うのは困難ですが、AWSを使ったら出来ました。
※動画の利用は出来ましたが、問題があって起動時にロゴ動画は表示してません(最後まで読むとわかります)
1. AWSにパブリックアクセス可能な動画を用意
WebGLから再生するには、unityroomからアクセス出来る場所に動画を置いておく必要があります。
1.1. AWSのアカウント登録
AWS(Amazon Web Service)は、IT業界では超有名なサーバーサービスです。
メールアドレス、クレカ等を用意してこちらのURLからポチポチ押していれば簡単にアカウントが作れます。
1.2. アカウントのブロックパブリックアクセスを設定
「このアカウントのブロックパブリックアクセス設定」→「編集」
全チェックを外して「変更の保存」
※セキュリティがゆるいので、AWSを他用途でも使うなら適宜見直して下さい
1.3. S3ストレージにバケットを作成
バケット(ファイルを入れるフォルダのようなもの)を作成します。
AWSのコンソールから サービス/ストレージ/S3 を選択。
「バケットを作成」をクリック。
バケットに被りのない適当な名前を付けます。
画像のようにチェックを設定し、全パブリックアクセスを有効にします(放置するとマズいのでこれ以後は最後まで進んで下さい)
「バケットを作成」する
1.4. 動画を置く
作成したバケットをクリックして
アップロードを選択。
アップロード画面に動画をドラッグ&ドロップして、上げるファイルを確認して「アップロード」
無事にアップロード完了。「閉じる」。
1.5. 動画URLを取得
オブジェクト(ファイル)のリンクをクリック
動画のURLをコピー。Unity上で使うので、どこかにメモして下さい。ブラウザに貼ればそのまま表示出来るはず。
1.6. バケットポリシー設定
バケットの「アクセス許可」から・・
バケットポリシーの「編集」
以下の内容を入れて「変更の保存」。 バケット内のファイルが読み取れるようにします。 (marudice-test-test はバケット名で置き換えて下さい)
{ "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::marudice-test-test/*" } ] }
1.7. CORSの設定
多分これが一番大事です。 CORSというのは、ざっくり言うとウェブサイトAのファイルをウェブサイトBが勝手に表示するのを禁止するルールです。 ウェブサイトAに「ウェブサイトBは友達だから表示していいよ」と書いてある場合のみ表示でき、その設定をしています。
CORSの「編集」から・・
以下のコードを貼り付けて「変更の保存」します。
[ { "AllowedHeaders": [], "AllowedMethods": [ "GET" ], "AllowedOrigins": [ "https://unityroom.com" ], "ExposeHeaders": [] }, { "AllowedHeaders": [], "AllowedMethods": [ "GET" ], "AllowedOrigins": [ "https://object-storage.tyo1.conoha.io" ], "ExposeHeaders": [] } ]
※CORSの設定についてはこちらを参考にしました。 S3でCORSの設定を行う | AutomationTechブログ
1.8. 不要なパブリックアクセスを閉じる
ゆるゆるガバガバな設定になってるので、閉じます。
ブロックパブリックアクセスの「編集」から
上3つをチェックして「変更の保存」
2. VideoPlayerで動画を再生
2.1. Video Playerの設定(超シンプル版)
適当なGameObjectにVideoPlayerをAddComponentから追加して、
Sourceを「URL」に、Cameraにシーン内のカメラをアタッチします
※RenderTextureを使ってCanvas RawImageに描画なども出来ます。詳しくはこちら や、Unity VideoPlayerで検索ゥ!!
2.2. スクリプトから再生
以下のコードで再生します。 ゲーム本体と別のサーバーに動画があるのでネットワーク状況で読み込み失敗があり、エラー処理は必須です。
public UnityEngine.Video.VideoPlayer video; void Start() { video.url = (動画ファイルのURL); video.prepareCompleted += PrepareCompleted; video.errorReceived += ErrorReceived; } // エラー発生時に呼ばれる private void ErrorReceived(UnityEngine.Video.VideoPlayer vp, string message) { Debug.LogWarning($"動画の読み込みに失敗しました. message:{message}"); vp.errorReceived -= ErrorReceived; vp.prepareCompleted -= PrepareCompleted; // エラー時処理 } // 動画の読み込みが完了したら呼ばれる void PrepareCompleted(UnityEngine.Video.VideoPlayer vp) { Debug.Log("動画ロード完了"); vp.prepareCompleted -= PrepareCompleted; vp.Play(); }
以上です!!
先週作ったゲームに、タイトル画面で「E+R+U+I」を同時押しするとロゴ動画が再生されるバックドアを仕込んであるので、動作確認出来ます!
フラッグマニア エクストリーム パズルxクイズ | フリーゲーム投稿サイト unityroom
3. 起動時に即動画を再生すると起きる問題
この方法で、よく話題に上がるCORSの問題も解決しunityroom上で動画は再生出来ましたが、実は使ってません。
どうも、WebGLのVideo Playerは埋め込みWebGLが非アクティブな状態ではPlay()を読んでも動画が進まない問題(仕様?)があるようで、 「ゲームの起動時に動画を再生」とすると、「ページ読み込み後にWebGL画面をクリックしない限り動画が再生されない」という挙動になりました。
Run in backgroundなども試しましたが、解決不能なようなので諦めました
3.1. え、じゃあどうやったの?起動時にロゴ動画出てるじゃん?
Adobe After Effects から Unity Animation に気合で目コピしました!
元々のロゴアニメ動画も1時間くらいで作ったので、1時間で終わりました。
Video Playerの技術検証と調査は2日くらいかかってます・・・。つら・・・。
【Visual Studio】複数箇所の同時編集を改行付きでやる方法
Alt+Shiftを押しながら上下キーを押すと、複数行に同じテキストを入力出来ることは有名ですが
複数行選択のまま改行をすると、上下左右キーでカーソル位置を変えても複数行選択が維持されます。
なので、動画のように似たような関数をまとめて作るみたいな時に活用できます。
自動フォーマットで選択箇所がおかしくなったりもするのでややクセがありますが、うまく使えば役に立ちそうです。
【Unity】タイルが呪われることがある【Tilemap】
タイルパレット上のタイルが呪われる(?)ことがあるようです。
こちらは開発中のゲームのタイルパレットです。 パレットの画像の位置は、TileがBridge4なのにSpriteがPlayerInvになっていて、Bridge4タイルの本来のSpriteではないです。 似た現象として、TileがnullでSpriteだけ残ったりもします。
どうやら、なにかのきっかけで2つのタイルごとに組み合わせで呪われるようで、このケースではBridge4とPlayerInvの組が呪われています。 一度タイルがこの状態になると、呪われたタイルをA, Bとして
- (TileがNonなので)パレット上でSpriteが表示されているにも関わらず消しゴムでは削除出来ない
- パレット上でタイルAを置くと、もう一方のタイルBもタイルAに切り替わる
- パレット上でタイルAを消すと、タイルBも消える
といったことが起きてしまいます。 パレット上からタイルを消してもダメなようでタイルを作り直すくらいしか解決策がなく、非常にやっかいです。
発生のきっかけは、パレットへのタイル追加がバージョン管理上で衝突した後に起きているような雰囲気です。
呪われたTileやSpriteのGUIDをパレット上で検索すると参照カウンタの配列にヒットするので、参照カウンタが壊れているのかもしれません。