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

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

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

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

Unity

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

Q&A

解決済

1回答

4840閲覧

【Unity】コルーチンを使って他の値を取得できない?

Cat_san

総合スコア19

C#

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

Unity

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

0グッド

0クリップ

投稿2015/09/22 04:48

コルーチンを使って以下のような投げのコルーチンを作りたいのですが、以下の様なエラー文が出てしまいます...

そもそもコルーチンを使って他の値を参照できないのでしょうか...
詳しい方おられましたらお教えください。

NullReferenceException: Object reference not set to an instance of an object
PlayerBodyCollider+<Bind_Damage>c__Iterator0.MoveNext () (at Assets/Scripts/Player/PlayerBodyCollider.cs:56)

以下、コードの抜粋です。

public IEnumerator Bind_Damage () { //while文を10回ループ int count = 5; while (count > 0){ //透明にする playerCtrl.transform.Translate( transform.right * 1.1f ); //0.05秒待つ yield return new WaitForSeconds(0.4f); //元に戻す playerCtrl.transform.Translate( transform.right * -1.1f ); //0.05秒待つ yield return new WaitForSeconds(0.4f); count--; } count = 0; playerCtrl.binded = false; playerCtrl.SetRelease(); //enemyCtrl.Release(); }

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

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

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

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

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

guest

回答1

0

ベストアンサー

コルーチンからメンバ変数へのアクセスをすることは可能ですし、エラー文も未定義の変数へのアクセスをしたという内容ではないので、原因はコルーチンを使用していることではないと思います。
エラーが発生しているPlayerBodyCollider.csの56行目で一体どんな処理を行っているか教えていただけますか?

投稿2015/09/22 06:32

hy3

総合スコア594

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

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

Cat_san

2015/09/22 09:01

>hy3様 PlayerBodyCollider.csの56行目ですが、上のコードの以下の部分になります。 【 //enemyCtrl.Release(); 】 enemyCtrlはスクリプトのはじめに以下で読み込んでいます。 【 EnemyController enemyCtrl; 】 投げの動き制御→投げ状態の解除のようなものを作りたくて、 試行錯誤していたのですが、そもそも上記のような書き方に問題があるのでしょうか...。 スクリプトの構成は以下の通りです。 ■プレイヤー関係 ・BaseCharacterController:プレイヤーと敵の基本パラメータなどの基底クラス ・PlayerController:プレイヤーに特化したパラメータや動作 ・PlayerBodyCollider:敵キャラの当たり判定の処理を行う ■敵関連 ・EnemyController:敵キャラに特化したパラメータや動作 ・EnemyBodyCollider:プレイヤーの攻撃の当たり判定を行う ご質問の答えになっているかわかりませんが... 何か他にも必要な情報がなどがありましたらお教えください。
hy3

2015/09/22 11:06

「enemyCtrlを読み込んでいる」とのことですが、その内容だと変数の宣言はしたものの値をセットしていないように見えます。 もしそうなのであれば、以下の記事を参考にEnemyControllerが付けられたGameObjectをPlayerBodyCollider.csから取得し、GetComponentメソッドを用いてenemyCtrlへ値をセットしてみてください。 http://albatrus.com/main/unity/6276
Cat_san

2015/09/22 16:37 編集

>hy3様 色々試してみたのですが、同じエラーが出てしまい上手くいきませんでした...。 同じエラー文ということは、値を取得できていない...ということなのでしょうか...? 原因が究明できるかわかりませんが、PlayerBodyCollider.csのソースを一度確認していただけないでしょうか...。 以下、ソースになります。 //---------------PlayerBodyCollider.cs---------------- using UnityEngine; using System.Collections; public class PlayerBodyCollider : MonoBehaviour { //== キャッシュ == PlayerController playerCtrl; private EnemyController enemy; void Awake () { playerCtrl = transform.parent.GetComponent<PlayerController> (); enemy = GetComponent<EnemyController>(); } void OnTriggerEnter2D(Collider2D other) { // トリガーチェック if (other.tag == "EnemyArm") { EnemyController enemyCtrl = other.GetComponentInParent<EnemyController>(); //Debug.Log(string.Format("EnemyArm Hit {0}",ec.attackEnable)); if (enemyCtrl.attackEnabled) { enemyCtrl.attackEnabled = false; playerCtrl.dir = (playerCtrl.transform.position.x < enemyCtrl.transform.position.x) ? +1 : -1; playerCtrl.AddForceAnimatorVx(-enemyCtrl.attackNockBackVector.x); playerCtrl.AddForceAnimatorVy( enemyCtrl.attackNockBackVector.y); playerCtrl.ActionDamage (enemyCtrl.attackDamage); } if (enemyCtrl.binded) { playerCtrl.dir = (playerCtrl.transform.position.x < enemyCtrl.transform.position.x) ? +1 : -1; playerCtrl.SetBind (); enemyCtrl.Bind (); StartCoroutine ("Bind_Damage"); } } } public IEnumerator Bind_Damage () { //while文を5回ループ int count = 5; while (count > 0){ // 位置を変更 playerCtrl.transform.Translate( transform.right * 1.1f ); //0.05秒待つ yield return new WaitForSeconds(0.4f); //位置を変更 playerCtrl.transform.Translate( transform.right * -1.1f ); //0.05秒待つ yield return new WaitForSeconds(0.4f); count--; } count = 0; playerCtrl.binded = false; playerCtrl.SetRelease(); enemy.Release (); } } また、Releaseの記述に関しては「BaseCharacterController,cs」に以下を記述しています。 public virtual void Release(){ //投げ状態を解除する bind = false; //投げの終わりのアニメーションを実行する animator.SetTrigger ("Release"); } 的はずれな受け答えをしていましたら、ご指摘ください。 よろしくお願いいたします。
hy3

2015/09/23 06:06 編集

PlayerBodyColliderのAwakeメソッド内で、PlayerBodyColliderが付けられたGameObjectからEnemyControllerを取得しようとしていますが、この仕様は正しいですか? PlayerBodyColliderはプレイヤーキャラクタ関連のオブジェクト、EnemyControllerは敵キャラクター関連のオブジェクトに付けられるオブジェクトなのだと思いますが、それらが同じGameObjectに付けられているというのは想像し難いです。 おそらく、EnemyControllerが付いていないためAwakeメソッド内でGetComponent<EnemyController>()がnullを返しており、結果的にBind_Damageでenemy変数(=null)のメンバメソッドを参照することになり、エラーが発生しているのではないでしょうか。 あくまで予想ですが、OnTriggerEnter2D内で使用しているenemyCtrl変数こそが本来Bind_Damage内でReleaseしたいEnemyControllerだと思いますので、これをBind_Damageの引数として渡し、Releaseしてやればよいのではないでしょうか。 void OnTriggerEnter2D(Collider2D other) { if (other.tag == "EnemyArm") { EnemyController enemyCtrl = other.GetComponentInParent<EnemyController>(); if (enemyCtrl.attackEnabled) { // 省略 } if (enemyCtrl.binded) { // 省略 StartCoroutine (Bind_Damage(enemyCtrl)); } } } public IEnumerator Bind_Damage (EnemyController enemyCtrl) { // 省略 enemyCtrl.Release (); }
Cat_san

2015/09/23 06:29 編集

>hy3様 ご教授いただきましたソースで無事動かすことが出来ました! 丁寧な解説をありがとうございました! 引数の引き渡し方など曖昧でしたので これを機に少し勉強してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問