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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

2回答

5654閲覧

TextMeshProを管理するためのコードでnullReferenceの原因がわからない

murakame

総合スコア2

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2021/08/26 15:27

前提・実現したいこと

unityでtimelineを利用してTextMeshProを管理する方法がネットにあったので試そうとしたのですが、
TextMeshProの中身を参照しようとする際になぜかnullReferenceになってしまいます。
どのようにすれば解決できるか教えていただけないでしょうか?

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

NullReferenceException: Object reference not set to an instance of an object TextPlayableBehaviour.OnGraphStart (UnityEngine.Playables.Playable playable) (at Assets/Scripts/TextPlayableBehaviour.cs:16) NullReferenceException: Object reference not set to an instance of an object TextPlayableBehaviour.ProcessFrame (UnityEngine.Playables.Playable playable, UnityEngine.Playables.FrameData info, System.Object playerData) (at Assets/Scripts/TextPlayableBehaviour.cs:45)

該当のソースコード

c#

1using System.Collections; 2using System.Collections.Generic; 3using TMPro; 4using UnityEngine; 5using UnityEngine.Playables; 6 7// A behaviour that is attached to a playable 8public class TextPlayableBehaviour : PlayableBehaviour 9{ 10 public GameObject charaObject; 11 private string text; 12 13 // Called when the owning graph starts playing 14 public override void OnGraphStart(Playable playable) 15 { 16 this.text = this.charaObject.GetComponent<TextMeshPro>().text; 17 this.charaObject.GetComponent<TextMeshPro>().text = ""; 18 } 19 20 // Called when the owning graph stops playing 21 public override void OnGraphStop(Playable playable) 22 { 23 this.charaObject.GetComponent<TextMeshPro>().text = this.text; 24 } 25 26 // Called when the state of the playable is set to Play 27 public override void OnBehaviourPlay(Playable playable, FrameData info) 28 { 29 30 } 31 32 // Called when the state of the playable is set to Paused 33 public override void OnBehaviourPause(Playable playable, FrameData info) 34 { 35 36 } 37 38 // Called each frame while the state is set to Play 39 public override void ProcessFrame(Playable playable, FrameData info, object playerData) 40 { 41 // PlayableTrackのClip上でシークバーが移動するたびに呼ばれ続ける(PrepareFrameの後) 42 if (charaObject == null) { return; } 43 var percent = (float)playable.GetTime() / (float)playable.GetDuration(); 44 45 this.charaObject.GetComponent<TextMeshPro>().text = 46 this.text.Substring(0, (int)Mathf.Round(this.text.Length * percent)); 47 } 48} 49

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.Playables; 5 6[System.Serializable] 7public class TextPlayableAsset : PlayableAsset 8{ 9 public ExposedReference<GameObject> charaObj; 10 // public string text; 11 12 // Factory method that generates a playable based on this asset 13 public override Playable CreatePlayable(PlayableGraph graph, GameObject go) 14 { 15 var behaviour = new TextPlayableBehaviour(); 16 behaviour.charaObject = charaObj.Resolve(graph.GetResolver()); 17 // behaviour.text = text; 18 return ScriptPlayable<TextPlayableBehaviour>.Create(graph, behaviour); 19 } 20}

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

以下、TImeLineとTextMeshProの状態のスクリーンショットです。
TimeLineの状態
TextMeshProの状態

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

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

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

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

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

guest

回答2

0

ベストアンサー

スクリーンショットを拝見しますと、TextMeshProオブジェクトがCanvasオブジェクトの子階層に配置されていますね。
ということは、あれは「GameObject」→「UI」→「Text - TextMeshPro」で作成したUI用のテキストでしょうか?

現状ではTextPlayableBehaviour内で取得しようとしているコンポーネントの型がTextMeshProになっていますが、こちらは非UI用のコンポーネントですので、代わりにUI用のTextMeshProUGUIに変更してみてはいかがでしょうか。
あるいは、これらの共通の基底であるTMP_Textでもいいかと思います。

投稿2021/08/26 18:58

Bongo

総合スコア10811

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

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

murakame

2021/08/27 02:14

TextMeshProにUI用と非UI用があったのですね。 そのことを知りませんでした。 ご回答ありがとうございました。
guest

0

NullReferenceExceptionってのはnullの変数に対して操作をしようとしてるところに出る例外です

せっかくエラーメッセージで異常のある場所が示されてるんですから、そこに出てくる変数や関数などの結果の値を片っ端から見てみればどうなんでしょうか

投稿2021/08/26 15:36

編集2021/08/26 15:37
y_waiwai

総合スコア88024

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

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

murakame

2021/08/26 16:05

ご返答ありがとうございます。 おっしゃる通り、メッセージで場所が分かるので、TMPの中身の文字列をうまく参照できていないところまではわかりました。 ただ、参照元にはきちんと文字列が入れてあり、画面にも表示されているはずなのになぜnullになるのか、ということが調べてもよくわからなかったため質問させていただきました。
bboydaisuke

2021/08/26 16:13

調べたらなら、どの行のどの変数が null だったのか質問に書いておくといいでしょう。なぜならそれは動く環境を持っているなら簡単に調べられますが、そうでない人には面倒臭いからです。
y_waiwai

2021/08/26 22:50

> ただ、参照元にはきちんと文字列が入れてあり、画面にも表示されているはずなのになぜnullになるのか、ということが調べてもよくわからなかったため質問させていただきました。 ならそれを聞こうよ。 ひとに物事を聞くなら、あなたができることは全てやってから、あなたがやったことをすべて提示して聞いてください。
murakame

2021/08/27 02:33

おっしゃる通りで最初の段階で説明不足でしたね。 お手数おかけしてしまい申し訳ありませんでした。 次からは気を付けます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問