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

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

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

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

Unity

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

Q&A

解決済

1回答

2039閲覧

【Unity】コルーチンを利用したクラス内メソッドを別クラスから呼び出し実行したい

masahase

総合スコア26

C#

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

Unity

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

0グッド

0クリップ

投稿2021/06/08 06:42

#問題点
コルーチンを使用したクラス内メソッドを外部から使用するとエラーが標示されてしまい、困っています。

#詳細
コルーチンを用いた一文字づつ表示する事が可能なメッセージウィンドウのクラスと、それに表示を分岐や条件によってメッセージを送るクラスの作成を考えています。

最初の一文字づつ表示させるクラスは完成しています。
外部クラスから上記クラス内メソッドにテキストとゲームオブジェクトを渡して下記のエラーとなってしまいます。何か問題なのでしょうか?
NullReferenceException: Object reference not set to an instance of an object

#コード
一文字づつ表示する為のクラスの一部です。元々は外部クラスからTextオブジェクトを持ってくる仕様になっておらずこちらをTextオブジェクトにアタッチしていました。今回の目的の為にIEWrite()やWrite()の引数にTextオブジェクトを取る用にしています。

C#

1public class MessageWriter: MonoBehaviour 2{ 3 public Text textObj; 4 IEnumerator IEWrite(string s, Text to) 5 { 6 //表示中の状態にする 7 isWriting = true; 8 for (int i = 0; i < s.Length; i++) 9 { 10 //テキストに1番目の文字を付け足して表示する 11 to.text += s.Substring(i, 1); 12 yield return new WaitForSeconds(0.2f); 13 } 14 //書いてる途中の状態を解除する 15 isWriting = false; 16 } 17 // テキストを書くメソッド 18 public void Write(string s, Text to) 19 { 20 StartCoroutine(IEWrite(s, to)); 21 } 22}

下記が条件によってメッセージを送り、表示させる為のクラスになります。
btnオブジェクト等にMessageControllerをアタッチし使いたいメソッドを指定、表示させたいTextオブジェクトを指定し、クリックしたら指定メソッド内のMessageWriterを実行したいと考えています。

C#

1public class MessageController : MonoBehaviour 2{ 3 public Text textObj; 4 public MessageWriter mw = new MessageWriter(); 5 6 public void test() 7 { 8 mw.Write("表示させたいメッセージ", textObj); 9 } 10} 11

#最後に
UnityとC#にあまり詳しくありません。この問題を解決できないのであればこのドキュメントを読むのがオススメと言うのがあれば教えていただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラー文は全部出したほうがいいです(どのスクリプトか、行数などが出ているかと思います)
NullReferenceExceptionは参照先が見つからないエラーです。

原因はここだと思います

MessageController.cs

cs

1 public MessageWriter mw = new MessageWriter();

試しに呼び出し側でこうしてみてください。たぶんNullってなると思います。

cs

1public class MessageController : MonoBehaviour 2{ 3 public Text textObj; 4 public MessageWriter mw = new MessageWriter(); 5 6 public void test() 7 { 8 Debug.Log(mw); // <--- Add 9 mw.Write("表示させたいメッセージ", textObj); 10 } 11}

解決方法としては、MessageWriterをnewするのではなく
アタッチしたオブジェクトを参照するようにしてください。

MessageWriterコンポーネントがついているオブジェクトをインスペクターからアタッチするだけで動くと思います

投稿2021/06/08 06:59

hogefugapiyo

総合スコア3302

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

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

masahase

2021/06/08 09:25

回答ありがとうございます。指定のコメントを入れる事でmwがnullである事がわかりました。 自分は親のMessageControllerから子のMessageWriterに全てのデータ、オブジェクトを渡したいと考えていたので、オブジェクトからスクリプトコンポーネントを取得すると言う発想が有りませんでした。newをやめ、下記を追加したら正常にMessageWriterが実行される様になりました! ``` public MessageWriter mw; private void Start() { mw = GameObject.Find("TextObj").GetComponent<MessageWriter>(); } ```
hogefugapiyo

2021/06/08 09:31

解決したようでなによりです。 オブジェクトの検索方法は色々あるので使いやすいものを見つけてみてください。 https://unity-guide.moon-bear.com/gameobject-find/ 自分でアタッチできるScene構成なら、検索せずインスペクターからアタッチしてしまうのも手です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問