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

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

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

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

Q&A

解決済

1回答

2777閲覧

AnimatorがNullReferenceException:

usamino

総合スコア59

Unity

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

0グッド

0クリップ

投稿2019/05/05 02:16

編集2019/05/06 02:47
Animator anim; public void MakeMove(int action) { this.anim = GetComponent<Animator>(); if (anim) { Debug.Log(anim.name+"   Makamoveに入ったよ"); } else { Debug.Log("MakeMoveには入ってない");   //これが返ってきます。 } if (action == 0) { anim.SetInteger("ani", 0); Debug.Log("Idle"); } if (action == 1) { anim.SetInteger("ani", 1); Debug.Log("Run"); } }

上記のコードなのですが「 this.anim = GetComponent<Animator>(); 」AnimatorがNullと表示されてしまいます。

このスクリプトは動くObjectに付いておりまして 呼び出すのは全く別のObjectについたスクリプトからとなります。
画面表示のアニメーターからControllerとアバターは直接セットされております。
お力添えをよろしくお願いいたします

//呼び出し側クイズオブジェクトのスクリプト //クイズの結果が int a(intには毎回所定の数字が入っておりました。) Debug.Log("前 クイズの結果 int aは  " +   a); QuizAction_SC  quizaction_SC = new QuizAction_SC(); quizaction_SC.MakeMove(a);   //キャラクターが反応して動く Debug.Log("後 クイズの結果 int aは  " +   a);

上記を実行すると動く側がうまく作動してくれませんでした。
ちなみに動く側のUpdate()に

if (Input.GetKeyDown(KeyCode.Z)) { Debug.Log("Z を 手入力 int a  "+ a); MakeMove(a); }``` と作成してテストすると問題なくキャラクターが動いてくれました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

このスクリプトが割り付いているGameObjectに、Animatorコンポーネントが割り付いていないだけなのではないかと思います。
Inspector上で該当GameObjectAnimatorが存在していますか?

画面表示のアニメーターからControllerとアバターは直接セットされております。

がこのスクリプトが割り付いているGameObjectAddComponentで割り付けているのであれば、AddComponentの実行前にMakeMoveが実行されている状態になっているとかはないでしょうか。

投稿2019/05/05 13:19

vo3

総合スコア321

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

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

usamino

2019/05/05 13:34

動く側のオブジェクトにはAnimatorがついており、同様にメソッドを呼び出す側にもAnimatorはついておりました。 別件ですが。 今確認しようとしていて気がついたのですが 動かす側のアニメーターのついている一つ上側に  薄いグレーの字で「アニメーター(Removeed)」と言うコンポーネントの跡(?)のようなものを発見したのですがこれは関係ありますでしょうか?
usamino

2019/05/05 14:42

右上の歯車にカーソルを載せると 「Removeed Component」と出てきます。 それから 「プレハブ「Object」に適応」と「元に戻す」の二つの選択肢が出てきました。
vo3

2019/05/05 17:07

動く(MakeMoveを持っている)側も、動かす(MakeMoveを使う)側も、どちらもPrefabなのですね。 それはどちらもHierarchyに直接配置している(動的ロードではない)ですか? あと、Debug.Logの後ですぐにreturnをするようにして、MakeMoveをフレームをまたいで実行しても同じでしょうか? (例えばMakeMoveをボタンで実行させるようにするとか) とりあえずこのソースほぼそのままを実行してみても同じ状態にならないですね。 # 実験的にGetComponentの前に Animator anim = null; と同名ローカル変数を定義した場合は当然なりましたが... > 薄いグレーの字 お使いのUnityが2018.3以降だと思いますが、動かす側の元々のPrefabに付いていたAnimatorを取り除いて、新たにAnimatorを付け直したからだと思います。 薄い側が元々のPrefabのAnimatorです。
usamino

2019/05/05 22:44

申し訳ありません。 動かす側はダミーのオブジェクトでクイズの問題を入れておりました。 動かす側のオブジェクトはゲームのメインのクイズです。 クイズの結果でキャラクターを反応させたくAnimatorは両方ともにつけておりました。 動かす側、動く側両方ともHierarchyに単体で配置しております。 試しに動かす側のAnimatorをはずしてみましたが反応に変化はありませんでした。はずしておこうかと思います。 ・MakamoveのメソッドにReturnをいれてすぐに返すとアクションはありませんが何もなかったかのようにクイズは続いていきました。 ・if (action == 0) {・・・    の前に Debug.Log(this.gameObject.transform.position.y);をおくとその部分で「NullReferenceException」と返ってきます。 しかし 動かす側のUpdate()の中にMakeMove(0);を置き「this.gameObject.transform.Translate(0, 0.01f, 0);」と置くとアクションはしませんがゆっくり上にあがっていきました。 >薄いグレーのAnimator 試行錯誤している間にどうしようもなく一度はずして再度付けた事がありました。 「プレハブ「Object」に適応」を選択すると表示が消えて 「元に戻す」を押すとまた元のグレーの表示のままになります。「プレハブ「Object」に適応」を選択しても特に作動に変化も無さそうでした。
usamino

2019/05/05 22:51

動かす側のUpdate()の中にMakeMove(0);を置いた時はAnimatorが 「 Makamoveに入ったよ");」の状態になっていました。
vo3

2019/05/06 00:51

> MakamoveのメソッドにReturn 説明不足でした。その時のログは変化ないかが知りたかったのですが、その感じだと何度実行されてもnullの側ということですね... > if (action == 0) {・・・    の前に gameObjectまたはtransformがnullなのでしょうが、そんな状況自体が遭遇しないので... 念の為ですが、これと > 動かす側のUpdate()の中にMakeMove(0); これはどちらも「【動かす側】が【動く側】.MakeMove()を実行している」ですよね。 そしてゆっくり上がっていっているのは【動く側】ですよね。 正直、「こちらで再現しない」および「方法を変えたら問題なく動作する」なので、スクリプト自体は問題ないのが伺えます。 (参照がHierarchyではなくProjectsのPrefabだったらでやってみても同じでしたし) となると、やはり動く側ではなく動かす側に問題があるとみるべきですね。 動かす側がMakeMoveを実行している部分を質問に追記してみてもらえますか。
usamino

2019/05/06 01:55

> MakamoveのメソッドにReturn はい。いろいろ試しましたがなぜか動かす側のスクリプトからはAnimatorが入らず動く側のオブジェクトのtransformがnullになりました。 > 動かす側のUpdate()の中にMakeMove(0); 申し訳ありません。動く側の間違いでした。 同じスクリプトからの呼び出しですとAnimatorも入り,transformも入ります。
vo3

2019/05/06 03:04 編集

追記内容を確認しました。それはnullになると思います。 Consoleウィンドウをみると、NullReferenceExceptionの前に「You are trying ...」といったWarningが出ていると思います。 これは、MonoBehaviourはnewキーワードで作るものではなく、動的に確認する際はnewではなく、AddComponent等でGameObjectに対して割り付ける必要があります。 この場合、例えば動く側の名前が「Ugoku」といった名前がついているとして、動かす側のコードは { if (Input.GetKeyDown(KeyCode.Z)) { GameObject ugoku = GameObject.Find("Ugoku"); if (ugoku) { ugoku.GetComponent<UgokuScript>().MakeMove(a); } } } のように対象のGameObjectからそのオブジェクトに割り付いているコンポーネントの参照を取得してから実行する必要があります。 なお、検索させていますが検索は割と重いもの(厳密にはGetComponentもそこそこ)なので、存在が確実なら起動時(Start時)に一回実行して変数として保持しておくとかを検討してみてください。 とはいえ、頻繁でなく、かつこの程度なら毎回のほうがいいかもしれません。 まぁ、そこは仕様と相談ですね。
usamino

2019/05/06 03:23

動きました!!! 何日も何日も考えてた問題が解決しました。 何とお礼を言ってよいのか言葉も見つかりませんが本当にありがとうございます。 c#はnewを使うものだと思っていたのが落とし穴になってしまいました。それとなぜか「You are trying ...」の警告は出ていなかったと思います。 本当に丁寧なご説明をありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問