バッテラが如く

プログラミングしましょ!

【Unity】Unity2022にアップグレードしたらInstantiateAttachedAssetでうまくプレハブが生成できなくなった件について

Unity (2022.1.23f1)

はじめに

エディタスクリプトで使うInstantiateAttachedAssetですが、
Unity2021 から2022にアップグレードしたら、うまく動作しなかったのでメモ。

事象

InstantiateAttachedAssetプレハブ生成したゲームオブジェクトをクリックした時に下記エラーが発生します。

ArgumentNullException: Value cannot be null.
Parameter name: prefabInstance

そしてインスペクターを見ると何も表示されないという摩訶不思議な現象が起きます。

無です。 初めて見ました(笑)。

解決策

PrefabUtility.InstantiatePrefabというリンク状態でインスタンス化するメソッドに変更して、
PrefabUtility.UnpackPrefabInstanceでリンク状態を解除するという方法にするとInstantiateAttachedAssetと同じ挙動になりました。

GameObject go = PrefabUtility.InstantiatePrefab(prefab) as GameObject;
PrefabUtility.UnpackPrefabInstance(go, PrefabUnpackMode.OutermostRoot, InteractionMode.UserAction);

あとがき

これでなんとか動いています。ふぅー。アップグレードするとこれがあるから怖いんですよね。。

【Unity】Unity2022にアップグレードしたら updateArtifactID is not valid for guidというのが出た件について

事象

Unity2022にアップグレートした時に以下のエラーログが発生していました。

updateArtifactID is not valid for guid

解決策

調べても分からなかったのですがReimportant Allで治りました。

古いプロジェクトのゴミが残っていたのだろうか。。謎ですが無事解決できました。

【Unity】シーンビューのFieldOfViewが変えられない時の解決策

Unity (2021.3.2f1)

はじめに

シーンビューのカメラアイコンをクリックしたときに表示されるパネルに「Field of View」という項目がありますが、
いつの間にか何故かグレーアウトされて変更できなくなっていました。

これを変更できるようにするにはどうしたらいいか?という内容です。

解決策

シーンビュー右上に表示されているOrientationが「Iso」という表記になっていると変えられなくなります。

「Iso」部分をクリックして「Persp」にしましょう。

これでFieldOfViewが変更できるようになります。

【Unity】UniRXはプレイ状態でコンパイル(ホットリロード)すると動かない件

Unity (2021.3.2f1} UniRX (7.1.0)

プレイ状態でコンパイル(ホットリロード)すると動かない

例としてUpdateを毎フレーム実行するUpdateAsObservableのコードで解説します。

this.UpdateAsObservable()
    .Subscribe(_ =>
    {
                    Debug.Log("Update!!!");
    }, () =>
    {
          Debug.Log("Completed!!!");
    });
int a = 0;  // これを  int a = 1とかに変更

上記コードはプレイ実行すると毎フレームがログ出力されるだけのものです。

今回の内容はプレイ中にスクリプトの中身を書き換えた場合の話です。

どうなるかというと、

スクリプトを書き換えてUnity画面がアクティブになると再コンパイルが走ります。

これは別に普通の挙動ですが、コンパイル後にコンソール画面を確認するとログが止まります。

つまりUpdateAsObservableが動かなくなっている現象が発生しましたというものです。

プレイ終了時にOnCompletedが呼ばれない

通常動作だとUpdateAsObservalはプレイ終了時にDisposeを内部で呼び出しているため、SubscribeしていればOnCompletedが呼ばれるようになっています。

しかしプレイモード中の再コンパイルが走るとなぜか呼ばませんでした。

※一応Updateは止まります。

OnCompletedが呼ばれないのはいいのですが、メモリ上に生き残ってしまっていないかが心配です。というのも再コンパイル時に下記警告が発生することがありました。UniRXが要因かは定かではないのですが、状況から見て濃厚です。

The referenced script (Unknown) on this Behaviour is missing!

さらに一度発生すると次から再コンパイルで100%で発生します。。しかもこの警告誰が発行したかが追えないというもはやハメ技です。

解決方法

UniRXを使うのであればホットリロードは使わないようにするのが吉だと思います。

解決方法としてはプレイモード中にスクリプトを書き換えた場合にプレイ終了までコンパイルされないようにするですね。

それができる設定がUnityにあります!

設定手順ですが、

Preferences > Generalを開きます

[Script Changes While Playing][Recompile After Finished Playing]に変更します。

これでホットリロードはできなくなりますが再コンパイルも走らないので安全にデバッグすることができるようになると思います!

他にも[Stop Playing And Recompile]がありますが、
こちらはプレイを強制終了させてコンパイルするというものです。ただ効率的には微妙だと思います。。

以上となります。

正直根本解決ではないのですがこれがベターな方法だと思いましたので共有させていただきました。

【Unity】 The referenced script (Unknown) on this Behaviour is missing! が再コンパイル時のみ発生するよくわからない現象

事象

実行中に再コンパイルすると以下の警告が発生しました。

アタッチされていないときに出るやつですが今回のは特殊でした。

あと普通はダブルクリックで該当スクリプトに飛べるはずなのですが、
ダブルクリックするとエラーが発生するという恐ろしい現象です。

しかもゲームにも影響が。。ボタンが押しても反応しないとか色々変です。

原因は不明ですが、分かり次第追記していきます。

(追記) UniRXが原因かも

しかしゲームの中も少し変でボタンが押しても反応しないとか色々変です。。。

これはUniRXが原因でした。なのでこれが原因かもしれない。。

www.m2game.net

【Unity】親オブジェクトが選択されないようにする方法

Unity (2021.3.2f1)

はじめに

例えばこのように空のゲームオブジェクトに複数の子オブジェクトを持ってるとした場合

子オブジェクトをクリックすると親オブジェクトが選択状態になります。

その状態でもう1回クリックすると子オブジェクトが選択状態になります。

これをいきなり子オブジェクトが選択されるようにするには?という記事です。

親が選択されるのは都合がいい場合もありますので、使い分けできるようにしたいというのが主旨です。

手順

名前の左をクリックすると指マークが表示されます。

これはクリックしても選択されませんよという機能です。

この機能を利用します。

親オブジェクト以外の指マークをクリックしこのようにします。

これで子オブジェクトをクリックすると直接子オブジェクトが選択できるようになりました。