-
-
Notifications
You must be signed in to change notification settings - Fork 174
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix RootLifetimeScope #654
Conversation
The latest updates on your projects. Learn more about Vercel for Git ↗︎
|
4969671
to
f7eec5b
Compare
Thank you for your prompt response! Verification of the Issue (#652) was not sufficient. ScriptableObject behaviorAs for the behavior of ScriptableObject in UnityEditor, If So, if we believe the above behavior, the following implementation seems to be a good choice. Proposal to fix RuntimeInitialize()How about using If you use By doing #if UNITY_EDITOR
[UnityEditor.MenuItem("Assets/Create/VContainer/VContainer Settings")]
public static void CreateAsset()
{
~~~
}
[InitializeOnLoadMethod]
static void InitializeOnLoad()
{
var instance = UnityEditor.PlayerSettings.GetPreloadedAssets().FirstOrDefault(x => x is VContainerSettings);
if (instance == null)
{
Debug.LogError($"VContainerSettings is not registered in PreloadedAssets.");
}
}
#endif At this time, as a tutorial guidance to the user, it would be good to consider situations where VContainerSettings does not exist or is not registered in PreloadedAssets, and to issue an error or something similar. Also, If I load VContainerSettings with Proposal to fix OnEnable()I'm aware that Also, in relation to eliminating Furthermore, until now, UnityEditor has been loaded with With this fix, both UnityEditor and the runtime (actual device) will be loaded with PreloadedAssets, so it will always be before the scene is loaded, but UnityEditor's behavior is such that even in situations where the playback button is not pressed or immediately after pressing the playback button How about the following modifications, including a solution to this problem? void OnEnable()
{
#if UNITY_EDITOR
if (!EditorApplication.isPlayingOrWillChangePlaymode)
{
return;
}
#endif
if (Instance == null)
{
Instance = this;
SceneManager.sceneLoaded -= OnFirstSceneLoaded;
SceneManager.sceneLoaded += OnFirstSceneLoaded;
}
} Proposal to fix OnDisable()I think it is better to have it because OnDisable() does not leave a cache of static Instance and the behavior should be the same every time. void OnDisable()
{
Instance = null;
} Best regards. (ちょっと英語だと自信ないので、日本語も併記しておきます!) 早速ご対応いただきありがとうございます! Issue (#652) の検証では不十分で、その後以下のようなことがわかったため、併せて修正案もご提案させていただきます。 ScriptableObject の挙動UnityEditor の ScriptableObject の挙動として、 1度でも なので、上記挙動を信じた場合、以下のような実装が良いように思います。 RuntimeInitialize() の修正案UnityEditor の場合、
1度でも このとき、ユーザーへのチュートリアル的な誘導として、VContainerSettings が存在しなかったり、PreloadedAssets に登録されていない状況を考慮して、エラーなどを出しても良いと思います。 また、
OnEnable() の修正案
また、 さらに、今まで UnityEditor の場合は、 今回の修正で、UnityEditor もランタイム(実機)も、PreloadedAssets でロードされるようになるため、必ずシーンのロード前になりますが、UnityEditor の挙動として、再生ボタンを押していない状況や再生ボタンを押した直後でも この問題の対策を含めて、以下のような修正はどうでしょうか? OnDisable() の修正案
引き続き宜しくお願い致します。 |
f7eec5b
to
a75f817
Compare
@hekk-naoya-kishimoto 以下、いただいた提案について考えてみました。
自動的なOnEnableに頼れるならたしかにそのほうがよさそうです。 ただ、以下の点で懸念がありました。
Unity再起動、リフレッシュ、PlayMode on/off などの操作と、Domain Reloadingの設定などの組み合わせのパターンすべてが動く必要があるため、実行時に設定されているものを明示的に有効にするほうが結局問題をコントロールしやすい面はあると思います。
たしかにエディタでエラーが出てしまいますね。playmodeのチェックは結局必要そうです。 また、Domain Reloading 無効の場合を考えると、 といったことを踏まえて、結局、1.14.0時点のものまで一度戻し、二度初期化されているバグだけ対応することにしました。 現在のリリース版では、Editor上でRootLifetimeScopeがロードされなくなった、という問題があるようなので、取り急ぎ一度リリースはしてしまおうと思っています。 この辺に改善点があることは確かなので、また何かあればお願いします 🙏 |
#648 #652