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

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

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

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

Unity

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

Q&A

解決済

2回答

4847閲覧

Unity5 衝突したオブジェクトのスクリプトの変数を参照して値をかえたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity

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

0グッド

0クリップ

投稿2017/06/14 14:37

編集2017/06/15 12:14

###前提・実現したいこと
衝突したオブジェクトのスクリプトの変数を参照して、値を変えたい。

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

NULLだよというエラーがでてしまう。

NullReferenceException: Object reference not set to an instance of an object particle.OnParticleCollision (UnityEngine.GameObject other) (at Assets/Script/particle.cs:24)

###該当のソースコード

以下が参照したいスクリプトです。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class enemyController : MonoBehaviour { 6 7 public GameObject character; 8 public GameObject p; 9 Vector3 target; 10 Animator animator; 11 float speed; 12 float dist; 13 public float life=3.0f; //参照したい変数 14 15 // Use this for initialization 16 void Start () { 17 animator = GetComponent<Animator> (); 18 } 19 20 // Update is called once per frame 21 void Update () { 22 23 transform.position = new Vector3 (transform.localPosition.x, transform.localPosition.y*20.0f*Time.deltaTime, transform.localPosition.z); 24 25 target.x = character.transform.localPosition.x; 26 target.y = character.transform.localPosition.y; 27 target.z = character.transform.localPosition.z; 28 transform.LookAt (new Vector3 (target.x, target.y, target.z)); 29 dist = Vector3.Distance (transform.position, character.transform.position); 30 31 if (dist > 1.0f && dist <= 5.0f) { 32 speed = 1.5f; 33 animator.SetBool ("Attack", false); 34 35 animator.SetBool ("Walk", true); 36 transform.position += transform.forward * speed * Time.deltaTime; 37 } else if (dist <= 1.0f) { 38 39 animator.SetBool ("Walk", false); 40 animator.SetBool ("Attack", true); 41 speed = 0.0f; 42 } else if (dist >= 5.0f) { 43 animator.SetBool ("Attack", false); 44 animator.SetBool ("Walk", false); 45 } 46 47 48 49 } 50 51 52 53 54 55 } 56 57

以下が参照させるスクリプトです。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class particle : MonoBehaviour { 6 7 public GameObject[] target; 8 float dist; 9 10 // Use this for initialization 11 void Start () { 12 13 } 14 15 // Update is called once per frame 16 void Update () { 17 dist = Vector3.Distance (transform.localPosition, target[0].transform.localPosition); 18 } 19 20 void OnParticleCollision(GameObject other){ 21 22 if (dist <= 5.0f) { 23 24 other.GetComponent<enemyController> ().life -= 1; //参照して値を変える。 25 Debug.Log ("In"); 26 } 27 28 } 29} 30

どうしたら参照して値をかえることができるのかおしえてください。
宜しくお願い致します。

###補足情報(言語/FW/ツール等のバージョンなど)
Unity5.6.1

Bongoさんへ
dist = Vector3.Distance (transform.localPosition, target[0].transform.localPosition);

このtarget[0]には衝突させるオブジェクトが入っており、

if (dist <= 5.0f) のdistにはそのオブジェクトとの距離が入っているので、ほかのオブジェクトに衝突しても無視されるようになっています。
試してみても問題なく動作するため、ほかのオブジェクトとは関わっていません。

また、衝突させるオブジェクトにはenemyController.csがアタッチされているのでみつからない原因がわからないのです・・・。

ちなみに、反対にゲームオブジェクトにパーティクルシステムが衝突したのか判定する方法はありますか?
泥沼にはまっています・・・。

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

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

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

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

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

Bongo

2017/06/14 22:23

パーティクルがぶつかりうるのは確実に敵キャラクターのみでしょうか?もし敵キャラクター以外に衝突した場合、enemyControllerが見つからずエラーとなりそうな気がしますが...
退会済みユーザー

退会済みユーザー

2017/06/15 12:15

情報を追加致しましたのでお願い致します
guest

回答2

0

ベストアンサー

リファレンスによると、

**Shuriken particle system: **
このメッセージはパーティクルシステムにアタッチされたスクリプトとヒットした Collider に対して送信されます。

とのことで、パーティクルに衝突される側のオブジェクトのスクリプトにOnParticleCollisionを実装すれば、そちらで衝突を検出することも可能のはずです。一応試してみたところ、ちゃんとメソッドが呼ばれるようでした(このとき、otherにはParticle Systemが入っていました)。

本題に話を戻しますが、パーティクルシステムのスクリプトの衝突検出部分を

C#

1void OnParticleCollision(GameObject other){ 2 3 if (dist <= 5.0f) { 4 5 enemyController controller = other.GetComponent<enemyController> (); 6 7 if (controller == null) { 8 Debug.Log (other.name); 9 } else { 10 controller.life -= 1; //参照して値を変える。 11 Debug.Log ("In"); 12 } 13 } 14 15}

などとしてみて、enemyControllerが見つからなかった時に何と衝突しているかチェックしてみてはいかがでしょう。

また、補足いただいたdist = Vector3.Distance (transform.localPosition, target[0].transform.localPosition);についてですが、これはパーティクルと衝突対象(対象は敵オブジェクトですよね?そしてtarget[0]も敵オブジェクトの一つ、ということでいいでしょうか?)の距離を求める意図でしょうか。
こちらでちょっと見てみたところ、一つ目のtransform.localPositionが指すのは個々の粒子の位置ではなくParticle Systemの位置だったのですが(つまりパーティクルを撃っている銃口と敵の距離を求めている)、もしこの動作が質問者さんの意図と異なっているとしたら、if (dist <= 5.0f)による分岐も意図と異なった動作になっているかもしれません。

投稿2017/06/15 13:32

Bongo

総合スコア10807

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

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

退会済みユーザー

退会済みユーザー

2017/06/15 14:46

ありがとうございます! そのプログラムで動作しました!! そういう分岐もできるのですね・・・ また、distいりませんでした。 消してみたら思うようにうごきました。 色々と勘違いしていたようで、最初に指摘して頂いたことが原因でした。 またお世話になるとおもいますが、そのときもどうぞ宜しくお願い致します。
guest

0

上記ではUnity上の情報がわからないため推測ですが、
敵GameObjectにenemyControllerがアタッチされていないのだと思います。
確認してみてください。

プログラムとしては、全く問題ないです。頑張ってください。

投稿2017/06/15 01:31

ChapaCactus

総合スコア8

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

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

退会済みユーザー

退会済みユーザー

2017/06/15 12:16

敵オブジェクトにはenemyContoroler.csはアタッチされています。 ほかに推測できることはありますでしょうか・・・?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問