最初のシーンに飛んでプレイ開始をエディタ拡張でワンボタンでやろうとしたら謎の現象が起きた

テストプレイをするのにいちいちタイトルシーンやステージセレクトみたいなシーンに戻るのめんどくさいですよね。そこでワンボタンでそれらを終わらせるエディタ拡張を作ったのですが、どうやら動きがおかしい

何が起きた?

ステージセレクトに飛んでプレイ開始としか指示を出していないのに、なぜかステージが選ばれるところまでセットで行われてしまう

コード解説

private void OnGUI()
    {
        if (GUILayout.Button("ステージセレクトからテストプレイ開始"))
        {
            EditorSceneManager.OpenScene(ここにシーンのパス);
            EditorApplication.ExecuteMenuItem("Edit/Play");
        }
    }

OpenScene()はそのままシーンを開くメソッドです。私はここにステージセレクトのシーンのパスを入れてました

EditorApplication.ExecuteMenuItem("Edit/Play"); 
この1行でUnity上でのプレイが開始します。再生ボタンを押した時のアレですね

なぜかステージ選択が勝手に行われる

ステージ選択画面では、ボタンをクリックすることで対応するステージに飛ぶようにしていました。と言ってもボタンは一つしか置いてませんでしたが。
しかし、テストプレイを開始した瞬間になぜかボタンが押されているのです。別の理由も考えましたが、コードにDebug.Log()を仕込ませて調査する分にはボタンが押されているので間違いなさそうです

解決

なんと、このエディタ拡張のウィンドウをGameビューの下から右側に移動することで解消しました。
ウィンドウの位置が変われば、ウィンドウ内のボタンをクリックしたときのマウスの位置も当然変わります。
ここから「テストプレイ開始」のボタンを押した時に、ちょうどよくゲーム内のステージ選択ボタンも押していたのでは……という結論になりました。正直これで合っているかはわかりません。
ゲーム内のボタンも一つしか配置していないので大きめではありますが、画面サイズよりは小さいです。画面の外をクリックしてそのボタンを押したことになるとも思えませんが、他に理由は思いつきませんでした。

追記

自分はUnity標準ではなく自作ボタンを使っていました。もしかしたら、Unity標準のボタンだと起こらない現象かもしれません。あるいは本当は起こるけど対策されてるかもしれません。

ちなみに、コールバックの登録やクリック時の反応を柔軟に設定できるようになるので、ボタンを自作するのはおすすめです。最初は最小限の機能でも作っておけば、後で機能や押した時の反応を足すこともできます。Unity標準のボタンもすぐに使える点で便利ですが、見た目によりこだわりたくなってきたり、スクリプトに慣れてきたら作ってみてもいいかもしれません。コルーチンかUniTaskが扱えれば問題なく作れると思います

この記事が気に入ったらサポートをしてみませんか?