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

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

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

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

Q&A

解決済

2回答

446閲覧

シングルトンについて。

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

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

1グッド

0クリップ

投稿2018/05/24 02:35

前提・実現したいこと

シングルトンにもいろいろな書き方があると思いますが、
簡単な書き方でクラスで取得したくて(もちろん、破棄したい場合はゲームオブジェクトごと)、
こちらのサイトを参考に、下記コードを作成しました。
しかし、2つ疑問点があります。

・参考サイトだと「Destroy (this);」で、スクリプトを破棄していると思うのですが、
これは間違っていませんか?
実際、検証してみたら、そのシーンに戻ってきた際、
ゲームオブジェクトは破棄されずにスクリプトだけ取り外された新しいゲームオブジェクトが生成されてしまっていました。
それとも、これは何か意図があるのでしょうか?

・参考サイトの書き方に倣って、あえて「DontDestroyOnLoad(this);」と書いてみたら、
シーン遷移した際、スクリプトだけでなく、ゲームオブジェクトも破棄さずれに引き継がれました。
このような挙動になるのは何故でしょうか?
DontDestroyOnLoad(this);だとスクリプトだけ破棄されない状態を保つように思えるのですが、
ゲームオブジェクトは破棄されて、それにアタッチしているスクリプトだけ生き残る状態なんてありえないから、
結果的にゲームオブジェクトごと破棄されない状態になるということでしょうか?
この書き方はなんだか、すっきりしないので、
DontDestroyOnLoad(this.gameObject);
と書いたほうが明解でよい気がするのですが、いかがでしょうか?

自己解釈としては、
DestroyもDontDestroyOnLoadも、

C#

1 Destroy(this.gameObject); 2 DontDestroyOnLoad(this.gameObject);

と書くべきだと思っているのですか、いかがでしょうか?
ご教示お願いします。

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Player : MonoBehaviour { 6 7 private static Player mInstance; 8 9 public static Player Instance { 10 get { 11 return mInstance; 12 } 13 } 14 15 void Awake () { 16 if (mInstance == null) { 17 mInstance = this; 18 DontDestroyOnLoad(this); 19 } else { 20 Destroy (this); 21 } 22 } 23 24}
KSwordOfHaste👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

Destroy(this.gameObject)ではなくDestroy(this)なのは
複数のゲームオブジェクトに対し同スクリプトがアタッチされていた場合
シングルトンなのにいくつも同じスクリプトは要らないため破棄しています。

その際にGameObjectごと破棄するとそのゲームオブジェクトには他に本当に必要なスクリプトがアタッチされているとそれも破棄されてしまうのでそれは困るので重複したスクリプトのみを破棄している感じです

投稿2018/05/24 04:52

MMashiro

総合スコア2378

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

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

退会済みユーザー

退会済みユーザー

2018/05/24 06:23 編集

ご回答ありがとうございます。 なるほど、スクリプトの為のシングルトンだったのですね。 念の為、確認させていただきたいのですが、 「取得するものはクラスになるけど、ゲームオブジェクトの唯一性を保つシングルトンにする」場合は、 下記のようにすればよいということでしょうか? void Awake () { if (mInstance == null) { mInstance = this; DontDestroyOnLoad(this.gameObject); } else { Destroy (this.gameObject); } }
MMashiro

2018/05/24 16:31

ゲームオブジェクト自体を一つにしたい場合はそれで良いと思います
退会済みユーザー

退会済みユーザー

2018/05/24 23:32

ご回答ありがとうございます。 勉強になりました。 ありがとうございました。
kakeiteiya

2018/05/25 01:50

>その際にGameObjectごと破棄するとそのゲームオブジェクトには他に本当に必要なスクリプトがアタッチ>されているとそれも破棄されてしまうのでそれは困るので重複したスクリプトのみを破棄している感じです なるほど????
guest

0

公式リファレンス見ても DontDestroyOnLoad(this.gameObject);と書いてありますし、そうしたほうがいい気がしますね。。。
https://docs.unity3d.com/ja/current/ScriptReference/Object.DontDestroyOnLoad.html

DontDestroyOnLoadの引数もobject型にするよりGameObject型限定にした方がいい気もしますが、なんか意図あるのかな。。。

ゲームオブジェクトは破棄されて、それにアタッチしているスクリプトだけ生き残る状態なんてありえないから、

結果的にゲームオブジェクトごと破棄されない状態になるということでしょうか?

ここは自分も同じ解釈です。

なんにせよ人が設計して作っているものなので抜けや漏れがあって必ずしも全てが合理的になっているとは限らないですしね。。。

投稿2018/05/24 02:55

kakeiteiya

総合スコア252

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

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

退会済みユーザー

退会済みユーザー

2018/05/24 23:32

ご回答ありがとうございます。 勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問