質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

WebGL

WebGL(ウェブジーエル)は、ウェブブラウザで 3次元コンピュータグラフィックスを表示させるための標準仕様です。

Q&A

1回答

735閲覧

ゲームの二重起動防止コードが機能しない

terrat

総合スコア14

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

WebGL

WebGL(ウェブジーエル)は、ウェブブラウザで 3次元コンピュータグラフィックスを表示させるための標準仕様です。

0グッド

0クリップ

投稿2019/09/18 04:16

WebGL向けのゲームを作っています。タブやウィンドウを複製して二重起動されないように下記コードを追加したのですが、うまくいきません。
エディタで二重起動を再現する方法がよくわかっていないのでビルド&ランをして試しているのですが、アドレスをコピーして別のタブでもう一つ起動してみても何の問題もなく起動してしまいます。

確認すると、エディタ上で起動した際は proc.Length = 1 と(textに)表示されたところが、ビルド&ランすると proc.Lengthの値は変動しない(textの初期値9999)ままなので、おそらくビルド後はprocが存在しないとか、アクセスできないとかそんなところかなと想像しています。が、じゃあどうすればいいのかというのは全くわかりません。

どうすればいいんでしょうか?(汗)
ぶっちゃけどんな方法でも二重起動が防げればいいのですが・・・。

C#

1 void Start() { 2 if (IsDuplicated()) Quit(); // 二重起動したら終了 3 } 4 5 bool IsDuplicated() { 6 Process[] proc = Process.GetProcessesByName( 7 Process.GetCurrentProcess().ProcessName 8 ); 9 10  // proc.Lengthを確認 11 procLengthText.text = "" + proc.Length; 12 13 if (proc.Length > 1) return true; 14 return false; 15 } 16 17 void Quit() { 18 #if UNITY_EDITOR 19 UnityEditor.EditorApplication.isPlaying = false; 20 #elif UNITY_STANDALONE 21 UnityEngine.Application.Quit(); 22 #endif 23 } 24

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

二重起動防止の効果は分かりませんが、そもそもビルドしたものは必ずvoid Start()を実行していますか?
Start()またはIsDuplicated()が実行されているかを確認することは可能ですか?
(ログを出力するとか、メッセージボックスを表示するとか)

投稿2019/09/18 06:22

kenshirou

総合スコア772

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

terrat

2019/09/18 08:03

Start()はtext = "aaa"を置いて画面に反映されたので実行されてるみたいです。IsDuplicated()は下記コードのようにtextへの代入を3つ挟んで調べてみたところ、実行されてはいるようですが、proc.Lengthによる条件分岐以降は処理されてないようでした。 ちなみになんですが、プラットフォームをWebGLからstandaloneに切り替えてビルド&ランしたところ proc.Length = 1 とエディタでの結果通り表示されました。 WebGLではこの方法は使えないってことでしょうか。。。 bool IsDuplicated() { txtA.text = "IsDuplicated()最初"; // 表示される(でもなぜか日本語部分表示されない) Process[] proc = Process.GetProcessesByName( Process.GetCurrentProcess().ProcessName ); UnityEngine.Debug.Log ("proc.Length = " + proc.Length); procLengthText.text = "" + proc.Length; if (proc.Length > 1) { txtB.text = "IsDuplicated()終わり(>1)"; // 表示されない return true; } txtB.text = "IsDuplicated()終わり(<=1)"; // 表示されない return false; }
kenshirou

2019/09/18 09:10 編集

WebGLでしたね。スミマセン。 WebGLで動作する場合、そもそもProcessのクラス自体が使えないのかも知れません。 (ブラウザ上の話ですもんね。) 大変失礼しました。
terrat

2019/09/18 12:30

コメントいただけただけでありがたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問