🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C#

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

Windows 7

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

ウィンドウ

コンピューター用語において、ウィンドウとはユーザとプログラムのやり取りを可能にするGUIの枠組みのことをいいます。

Unity

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

Q&A

解決済

2回答

4764閲覧

【Unity】PC上でのUnityゲームアプリにてウィンドウがアクティブかどうかを取得したい

megumin

総合スコア78

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C#

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

Windows 7

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

ウィンドウ

コンピューター用語において、ウィンドウとはユーザとプログラムのやり取りを可能にするGUIの枠組みのことをいいます。

Unity

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

0グッド

0クリップ

投稿2019/09/19 07:59

前提・実現したいこと

UnityでPC向けのゲームを作成しています。
ゲームウィンドウが非アクティブになった場合に自動ポーズ機能を追加したいと思い、表題のようにゲームウィンドウがアクティブかどうかを取得したいと考えました。

試したこと

C#で作成しているため対象言語でウィンドウがアクティブかどうかのクラスを調べてみると、「Form.ActiveForm」がまさにその機能だということだったので、下のサイトを参考にDLL(System.Windows.Forms.dll)を「Editor\Data\Mono\lib\mono\2.0」から「Assets\Plugins」にインポートして追加しました。
https://qiita.com/otochan/items/0f20fad94467bb2c2572

発生している問題・エラーメッセージ

Form.ActiveFormがNULLになって返ってきてしまいます。
ビルドしてexe形式で実行しても同様のログが吐き出されました。

NullReferenceException: Object reference not set to an instance of an object

該当のソースコード

(対象箇所のみ抜粋)

C#

1using System.Windows.Forms; 2~~~ 3private Text text; 4void Awake() 5{ 6 text = transform.Find("Text").GetComponent<Text>(); 7} 8void Update() 9{ 10 // デバッグ用に画面に表示する 11 text.text = Form.ActiveForm.ToString(); 12}

補足情報(FW/ツールのバージョンなど)

Unity 2018.3.5f1

どこかが間違っていたり、他の方法の提案などご教授していただけると助かります。

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

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

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

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

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

guest

回答2

0

ベストアンサー

どのスクリプトでもいいので、OnApplicationFocusメソッドを定義すれば、アクティブ・非アクティブ時にメソッドが呼ばれます。
これでいかがですか。

投稿2019/09/19 11:02

katsuko

総合スコア3538

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

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

megumin

2019/09/19 11:31

OnApplicationFocusメソッドを利用したいと考えているのですがシーンが読み込まれる前から別ウィンドウをクリックしていると、再度何かのウィンドウをクリックされるまでOnApplicationFocusメソッドが呼ばれないようです。 一番最初から別ウィンドウを選択しているという前提で作成するとしたら何かいい方法はないでしょうか?
katsuko

2019/09/19 11:40

ゲームの開始時にOnApplicationFocusでフォーカスを管理するオブジェクトを作って、Object.DontDestroyOnLoadでシーンの移行時もDestroyされないようにしておいて、ゲーム中ずっとフォーカスを管理してはいかがですか。 それでも、ゲーム開始時からフォーカスが外れていたらどうするんだ、という問題がありますが、まぁそこぐらいは妥協しましょう。
megumin

2019/09/20 02:52

今回のフォーカス管理はあくまでゲームプレイ中のときだけでいいのでタイトルメニューなどのゲーム起動時からの情報は特に必要ないです。ゲーム開始時のフォーカスについてはタイトルのスタートボタンを押したタイミングで取得するようにしましたので期待した結果を得ることができました。 ありがとうございます! ※以下、抜粋した実装ソースです。 public class Util { // 現在のアクティブウィンドウを取得する [DllImport("user32.dll")] public static extern IntPtr GetActiveWindow(); } ↓タイトル↓ --------------------------------------------------------------- ①ゲーム開始時のボタン押下のタイミングで自ウィンドウのGetActiveWindow()を取得する。 GameManager.Instance.data.ownWindow = Util.GetActiveWindow(); --------------------------------------------------------------- ↓ゲームシーン↓ --------------------------------------------------------------- private IntPtr hwnd; private WindowHandle isHandleConclusive = WindowHandle.Active; private enum WindowHandle { Active, // 自ウィンドウを選択している NotActive, // 別ウィンドウを選択している Pause // ポーズ中 } void Awake() { // ②ゲームシーン開始時にウィンドウ情報を取得する hwnd = Util.GetActiveWindow(); } void Update() { // ③別ウィンドウを選択していた場合はポーズにする if (isHandleConclusive == WindowHandle.NotActive || hwnd != GameManager.Instance.data.ownWindow) { // ポーズ処理 isHandleConclusive = WindowHandle.Pause; } } // ウィンドウをクリックしたときの処理 private void OnApplicationFocus(bool focus) { // ④ゲーム中に違うウィンドウをクリックした場合もポーズにする if (focus) { // ゲームウィンドウをクリックしたとき isHandleConclusive = WindowHandle.Active; } else { // 別ウィンドウをクリックしたとき isHandleConclusive = WindowHandle.NotActive; } }
guest

0

間違っている部分だけ書くと、C#といってもWindows FormとUnityとは基盤システムが違います

Form.ActiveForm はWindows Form用の関数で、返り値もSystem.Windows.Forms.Form です
UnityではSystem.Windows.Forms.Formを使用しないので、null以外が帰ることはないと思います

どうすればいいかはわかりません
一応調べてみたけど、結構厄介なんですかね…?
https://qiita.com/kirurobo/items/82dd484ad6374e725a43

投稿2019/09/19 09:24

izmktr

総合スコア2856

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

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

megumin

2019/09/19 11:39

コメントに記載されていたサイトを参考に、方法2であるOnApplicationFocusメソッドを使用した手法がよさそうかと思い実践しています。しかし、起動時の段階で別ウィンドウを選択していた場合の対処法に悩んでいるため方法3でのウィンドウタイトルによる判別も検討しています。 調べていたときには教えていただいたサイトまでたどり着けなかったため感謝いたします! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問