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

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

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

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

Unity

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

Q&A

解決済

1回答

1430閲覧

インスタンス化したゲームオブジェクトへのシーン変更後のアクセス方法

Izayoi-san

総合スコア12

C#

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

Unity

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

0グッド

0クリップ

投稿2020/07/15 00:58

編集2020/07/15 06:26

現在Unityを使用して2D RPGの会話イベント発生時のプレイヤーキャラの移動制限をプログラムで作成しています。

その際に、下記の方法で実現している移動制限の解除がうまくいかず、プレイヤーキャラへの移動入力が受け付けられないというバグが発生しています。
・ゲームの状況を把握するオブジェクト(以降GManagerと記載)をゲーム開始時にインスタンス化して作成[下記プログラム1をご参照ください]
・会話イベント発生時にGManagerのisStopをtrueにする(GManager.instance.isStop = true;により状態を変更)
・プレイヤーキャラの移動など制限したいプログラムはif(!GManager.instance.isStop){}内に記述する。

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class GManager : MonoBehaviour { public static GManager instance = null; public bool isStop = false; void Awake() { if (instance == null) { instance = this; DontDestroyOnLoad(this.gameObject); } else { Destroy(this.gameObject); } } }

移動制限の解除は下記の手法で実現しています。
・Gmanagerの子オブジェクト(普段は非アクティブ化)に下記のプログラム2を持たせる。
・会話イベント終了のタイミングでプログラム2を持った子オブジェクトをアクティブ化

using System.Collections; using System.Collections.Generic; using UnityEngine; public class GManagerStopEnd : MonoBehaviour { [Header("ストップ解除オブジェクト")] public GameObject ThisObj; //Inspectorからこのプログラムを持った子オブジェクトを指定 // Update is called once per frame void Update() { GManager.instance.isStop = false; ThisObj.SetActive(false); } }

発生しているバグの状況は下記になります。
・ゲーム開始(GManagerのインスタンス化)→シーン変更(スタートのシーンから会話イベントのあるシーンに移行)
→会話イベント発生(プレイヤーキャラの移動制限の付与)→会話イベント終了(プレイヤーキャラの移動制限の解除)
上記のフローにおいて、プレイヤーキャラの移動制限が解除されない。
・デバッグとして、会話イベントが発生するシーンからゲームを開始した場合、会話イベント終了後のプレイヤーキャラの移動制限は解除される。

シーンの変更を挟まなければプレイヤーキャラの移動制限が解除されるため、別シーンでインスタンス化したオブジェクトへのアクセスが
うまくできていないことが原因と考えています。

解決方法がわかる方がいらっしゃれば、ご指導ご鞭撻のほど何卒よろしくお願いいたします。

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

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

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

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

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

sakura_hana

2020/07/15 04:45

「会話イベントが発生するシーンからゲームを開始した場合、会話イベント終了後のプレイヤーキャラの移動制限は解除される。」 本来これはあり得ません。GManager.instanceが存在しないのでNullエラーが発生するはずです。 それが起こっていないとしたら会話シーンにもGManagerを付けたオブジェクトが存在しているのではないかと思います。 他にも予期せぬ動きをしている部分があるかもしれないので、 isStopの値切り替えを行っている部分・判定する部分等にDebug.Logをしかけて、その部分が実行されているかと各種の値の確認を行ってください。 なお、質問文中でプログラムは上下の行の「```」を入力すると見やすくなるので編集をお願いします。 (入力欄上部の<code>ボタンも利用してみてください)
Izayoi-san

2020/07/15 05:16

ご回答いただきありがとうございます。 まず、ご指摘いただいた下記に関してですが、こちらの説明不足で申し訳ありません。 GManagerは全てのシーンにおいているため、どのシーンから始めてもGManager.instanceが生成されてます。Nullエラーが発生していないことも確認済です。(この手法が問題なのではないかと考えています) ”「会話イベントが発生するシーンからゲームを開始した場合、会話イベント終了後のプレイヤーキャラの移動制限は解除される。」 本来これはあり得ません。GManager.instanceが存在しないのでNullエラーが発生するはずです。 それが起こっていないとしたら会話シーンにもGManagerを付けたオブジェクトが存在しているのではないかと思います。” 次にDebug.Logを仕掛けるという提案ですが、やはりシーンを切り替えた場合はisStopをfalseにするタイミングで所望のログが出ませんでした。(シーンの切り替えを行っていないとログが出ます) そのため、やはり別シーンでインスタンス化した場合のみ、GMAnager.instanceへのアクセスがうまくいっていないように感じます。 最後に、下記に関してですが、私の理解が及ばず申し訳ありません。 ''' プログラム全文 ''' という入力方法にするということでしょうか? お手数おかけしますが、こちらに関してもご享受していただけると幸いです。 ”なお、質問文中でプログラムは上下の行の「```」を入力すると見やすくなるので編集をお願いします。 (入力欄上部の<code>ボタンも利用してみてください)”
sakura_hana

2020/07/15 06:15

「ゲーム開始(GManagerのインスタンス化)」とあったのでここでしかインスタンス化していないものと思っていました。全シーンで行なっているということなら理解できます。 「シーンを切り替えた場合はisStopをfalseにするタイミングで所望のログが出ません」ということは、そもそも「その部分が実行されていない(=GManagerStopEndのUpdateが呼ばれていない=GManagerStopEndが付いているオブジェクトがアクティブになっていない)」のではないでしょうか?(厳密にはどこにDebug.Logを仕掛けたかによりますが) GManagerStopEndのオブジェクトを制御しているコードも確認してみてください。 コードを括る文字は「'''」ではなく「```」ですが、書き方はそれで合っています。 (編集画面で<code>ボタンを押してみると意味が分かると思います)
Izayoi-san

2020/07/15 06:45

更に確認を進めたところ、会話イベントに用いているAssetのFungus内で問題が生じていることがわかりました。 FungusnのCommand(Set Active)を用いてGManagerStopEndのオブジェクトをアクティブ化する際に、 GManagerが最初にゲームを開始したシーン以降ではDontDestroyOnLoadのシーン下に残り続けているため、 GManagerの子オブジェクトが会話イベントを発生させているシーンに存在しない判定になっていました。 (例えばOSIROシーンからゲームを開始したとき、OSIROシーンにあるGManagerがインスタンス化され、DontDestroyOnLoadが生成される。 この状態でOSIROシーンからBARシーンにシーンを変えるとBARシーンにはGManagerそのものがない。という状態になっており、アクティブ化する対象を発見できていませんでした。 【Awakeの時点ではOsiroシーンにはGManagerが存在するため、一度もシーン変更を行っていなければGManagerStopEndのオブジェクトをアクティブ化が成功すると思われます。】) そのため、GManagerStopEndのオブジェクトをGManagerの子オブジェクトとしてではなく、各シーン下に独立したオブジェクトとして配置することで解決しました。 こちらの確認不足によるバグの発生に対し、お手数をお掛けして大変申し訳ありませんでした。 気づきを与えていただいたのでベストアンサーとさせていただきます。
Y0241-N

2020/07/16 00:32

外野から失礼します、質問が既に解決済みでしたら自己回答にて上記の解決方法を記載の上、この質問をクローズしていただくと今後同様の問題に突き当たった方の助けとなりますので、ご協力お願い致します。
guest

回答1

0

ベストアンサー

(質問への追記・修正の依頼より)

isStopの値切り替えを行っている部分・判定する部分等にDebug.Logをしかけて、その部分が実行されているかと各種の値の確認を行ってください。

「シーンを切り替えた場合はisStopをfalseにするタイミングで所望のログが出ません」ということは、そもそも「その部分が実行されていない(=GManagerStopEndのUpdateが呼ばれていない=GManagerStopEndが付いているオブジェクトがアクティブになっていない)」のではないでしょうか?(厳密にはどこにDebug.Logを仕掛けたかによりますが)
GManagerStopEndのオブジェクトを制御しているコードも確認してみてください。

→「更に確認を進めたところ、会話イベントに用いているAssetのFungus内で問題が生じていることがわかりました。」とのことでした。

投稿2020/07/16 01:47

sakura_hana

総合スコア11427

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問