カメラが勝手に傾きます

22 views
Skip to first unread message

Takashi Endo (surface0)

unread,
Jun 21, 2024, 7:49:20 AM (12 days ago) Jun 21
to 宴ユーザーグループ
・宴のバージョン:4.0.9
・Unityのバージョン:2023.2.16f1
・OSバージョン:Windows11

お世話になります。
宴のUIをカスタムしてたところ、いつの間にか実行時にSpriteCameraとUICameraのRotationが勝手に1,1,1になってしまう現象が発生するようになりました。

ソースコードを確認したところ、CameraRootクラスのstartEulerAnglesの初期値がVector3.oneになっているのに気が付き、
ブレークポイントを張ってみると、Awakeより先にOnClearが呼び出されていたので、エディタ上の設定に関わらずthis.transform.localEulerAnglesがstartEulerAnglesの1,1,1に設定されてしまっているようでした。
そこでCameraRootコンポーネントの付け外しをしたところ、Awakeの呼び出し順序が変わり、初期値が利用されなくなったので問題は一見解消したかに見えます。

以上から、予測困難なAwakeの呼び出し順序によってエディタの設定が無視されてしまうのは問題だと思いますが、
そもそも、startEulerAngles = Vector3.oneになっているのはVector3.zeroと間違いではないかと思うのですが、いかがでしょうか?

宜しくお願い致します。

マッドネスラボ

unread,
Jun 21, 2024, 6:01:59 PM (11 days ago) Jun 21
to 宴ユーザーグループ

>予測困難なAwakeの呼び出し順序によってエディタの設定が無視されてしまうのは問題だと思いますが、
UnityのScript Execution Orderで、スクリプトの特定のイベント関数の実行順を設定することが可能で、Awakeもこの順番に従います。

CameraRootの実行順は、-100に設定してします。
ss_0404.png
CameraRootのOnClearが呼ばれるのは、AdvEngineのOnClearSubメソッドを呼んだときで、ゲームの開始、終了、ロード時などのクリア処理で呼ばれます。
「宴」のデフォルトでは、AdvEngineStarterのisLoadOnAwakeをオンにしていたときに、Awake時にAdvEngineの起動処理を呼ぶのでその時がもっとも早いタイミングになります。
ただ、AdvEngineStarterの実行順は10になっていて、CameraRootだけではなく、通常のスクリプトよりも遅い順番の設定になっています。

なので、考えられる原因としては、以下のいずれかの状態だと思われます。
・CameraRootと同じかそれよりも早い「Script Execution Order」が設定されているスクリプトから、直接・または間接的にAdvEngineの起動処理を行っている
 (Awakeと同時にOnEnableも呼ばれるので、早い実行順を持つスクリプトのOnEnableから呼び出している可能性も考えられます。)
→対応
スクリプトの実行順の問題であれば、可能であればCameraRootよりも遅い段階で呼ばれるように、呼び出し側のスクリプトの実行順を調整してください。
調整が難しいようであれば、Awake時に呼び出さず、Start等の後のタイミングで呼ばれるイベント関数から呼び出すようにしてください。
CameraRootなど宴のほうのScriptの 「Script Execution Order」  を変更することでも対応自体は可能ですが、
この順番は各スクリプトのmetaファイルに記録されるため、変更してしまうと宴のアップデートをしたときに上書きされて巻き戻ってしまうため再設定が必要になります。

・Awakeよりも早い段階で呼ぶことのできる処理(RuntimeInitializeOnLoadMethodなど)で起動処理を行っている。
→対応
このタイミングでは呼び出さないでください。

・Cameraがシーンロード時には非アクティブで、OnClearが呼ばれる段階ではAwakeがまだ呼ばれていない
→対応
最初からアクティブにしておくか、宴の起動処理を呼び出すプログラム内で起動前にアクティブになるようにプログラムを追記してください。

  > そもそも、startEulerAngles = Vector3.oneになっているのはVector3.zeroと間違いではないかと思うのですが、いかがでしょうか?
すみません。ご指摘の通りです。修正いたします。




2024年6月21日金曜日 20:49:20 UTC+9 Takashi Endo (surface0):

マッドネスラボ

unread,
Jun 21, 2024, 6:21:50 PM (11 days ago) Jun 21
to 宴ユーザーグループ
Awakeで初期化済みかをチェックする処理と、startEulerAngles = Vector3.zero; とする修正をしましたので、
添付のパッケージファイルを適用してください。
(添付ファイルのダウンロード後に、拡張子が *. gzになっている場合は、*.unitypackageに変えてからプロジェクトに適用してください)

ただ、上記の対応は行ったほうがより安定するかと思いますので、なるべくならご対応お願いいたします。



2024年6月22日土曜日 7:01:59 UTC+9 マッドネスラボ:
FixCameraRoot.unitypackage

surface0

unread,
Jun 23, 2024, 11:20:19 PM (9 days ago) Jun 23
to 宴ユーザーグループ
>  UnityのScript Execution Orderで、スクリプトの特定のイベント関数の実行順を設定することが可能で、Awakeもこの順番に従います。
なるほど、この設定で実行順が決まっているのですね。
他の人からは設定はできないと言われてたので、そうだと思い込んでいました。
ただ、プロジェクト設定を確認したところ、この実行順がまったく設定されてなかったので、どうやらこれが原因のようでした。
おそらくmetaファイルの内容がなんらかの原因で消失してしまったのかと思います。
こちらは別途調査してみます。

> Awakeで初期化済みかをチェックする処理と、startEulerAngles = Vector3.zero; とする修正をしましたので、
修正ありがとうございます。
適用させていただきます。

ご対応ありがとうございました。
2024年6月22日土曜日 7:21:50 UTC+9 マッドネスラボ:
Reply all
Reply to author
Forward
0 new messages