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

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

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

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Unity

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

Q&A

解決済

1回答

1282閲覧

unity 他のスクリプトの関数を使用するとエラーが出る c#

erefant9

総合スコア8

C#

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Unity

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

1グッド

0クリップ

投稿2019/08/21 15:52

unity にて AとBのオブジェクトがありAにonCollisionEnter関数を用意し、CCに空のgameObjectを用意します。
CCにはスクリプト関数 Cscを用意します。

AがBのオブジェクトにぶつかった際CCの関数Cscを使用すると

NullReferenceException: Object reference not set to an instance of an object
A.OnCollisionEnter
のようなエラーが出ます。

以下のように記述しております。
大変お手数ですがどなたかご教授お願いいたします。

Asc void Start () { } void Update () { } void OnCollisionEnter(Collision col) { CC c= GetComponent<CC>(); c.Csc(); }

CC
void Start () {

} void Update () { } public void Csc () { Debug.Log("ab"); }
コードAsc void Start () { } void Update () { } void OnCollisionEnter(Collision col) { CC c= GetComponent<CC>(); c.Csc(); }
コード CC void Start () { } void Update () { } public void Csc () { Debug.Log("ab"); }
myta👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

C#

1void OnCollisionEnter(Collision col) 2 { 3 CC c= col.collider.GetComponent<CC>(); 4 c.Csc(); 5 }

とする必要があります。単にGetComponent<CC>()だとcolはガン無視して自分自身からCCを取得することになり、当然CCは自分にはついてないのでnullが返って来てそれがcに代入され、c.Cscを参照した時点でcがnullなのでNullReferenceExceptionが出ます。

追記

上のは衝突した相手からCCコンポーネントを取得したい場合の例です。
衝突した相手に関係なく常に特定のオブジェクトのCCコンポーネントを呼び出したい場合は、

C#

1[SerializeField] 2CC c; 3void OnCollisionEnter(Collision col) 4 { 5 c.Csc(); 6 }

とクラスのフィールドとしてCCを定義し、インスペクターから事前に対象のオブジェクトを指定しておけば良いです。

投稿2019/08/21 16:50

編集2019/08/22 16:08
Ram.Type-0

総合スコア424

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

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

erefant9

2019/08/22 12:04

回答ありがとうございます。 早速 CC c= col.GetComponent<CC>(); を試してみたのですが 「'Collision' に 'GetComponent' の定義が含まれておらず、型 'Collision' の最初の引数を受け付ける拡張メソッド 'GetComponent' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください。」 と出てしまいます。 そこでcolを消すとエラーが消えたので質問のコードにした経緯です。 https://squmarigames.com/2018/11/25/unity-beginner-collision-break/ のようにcolのnameを出力したりすることまでは出来るのですがcolそのもののgameObjectが取得できないです。 https://docs.unity3d.com/ja/current/ScriptReference/Collision-gameObject.html を参考にしたりして途中までは良いのですが関数をやろうとするエラーが出てしまいます。 他には public GameObject aite; と宣言して aite = col.gameObject; Debug.Log("aite"); としたら相手のオブジェクト名は出ました。 しかし、未だ関数は使用できません。
fiveHundred

2019/08/22 12:55

横から失礼しますが、Collisionはコンポーネントではないため、そのままGetComponentを使うことはできません。 「CC c = col.gameObject.GetComponent<CC>();」のように、GameObjectなどを介す必要があります。 > Debug.Log("aite"); これだと、単に「aiteという文字列」を出力することになるので、aiteというオブジェクトとは全く関係がありません。 正しくは、「Debug.Log(aite);」になります。
erefant9

2019/08/22 13:56

ご相談いただきありがとうございます。 ゲーム内には2つのオブジェクト1つゲームのスクリプトとしてからのオブジェクトを作りそこに2つのオブジェクトが衝突した後の処理をと、思ってCCに関数の処理を入れました。 しかしonCollisionの処理では第三のCCのスクリプトの関数は使用できないのでしょうか? 色々文献をあさっているのですがコンガラガッてきてしまって質問しました。 「Debug.Log(aite);」 の部分は””を外していました。すみません、そこの部分ではcolオブジェクトは取得できました。 ゲームメインの関数の処理を別のオブジェクトのCCに入れて衝突後の関数処理をと思っております。
erefant9

2019/08/22 14:44

色々試した結果他のオブジェクト関数を利用することが出来ました。 GameObject c = GameObject.Find("CC"); でCCのオブジェクトを取得し、GetComponent<CCのスクリプト?class> →CCのスクリプト.関数; で出来ました。 このGameObject.Findは重いと色々なサイトが出てきたのでstartの時点でCCを取得し変数をあてておいて、OnCollision関数内でCCの関数を変数を使用して処理しようとしたらNullになってしまいました。 OnCollision内ではほかの関数を処理する場合再度GameObject.Findを使用しないというのは難しいのでしょうか?
fiveHundred

2019/08/23 01:49

そもそも、CCがどこに存在するかで話が変わってきます。 てっきり私は接触した相手のゲームオブジェクトにアタッチしているものだと思い込んでましたし、たぶんRam.Type-0さんもそうでしょう。 例えば、CCは接触した相手の(Colliderが付いている)ゲームオブジェクトの子オブジェクトなのであれば、col.gameObject.GetComponentInChildren<CC>()を使うことになります。 > このGameObject.Findは重いと色々なサイトが出てきたのでstartの時点でCCを取得し変数をあてておいて、OnCollision関数内でCCの関数を変数を使用して処理しようとしたらNullになってしまいました。 状況が分からないので何とも言えないですが、取得したCCが何らかの原因で削除されたのだと思います。 また、CCが複数存在する場合、「GameObject.Find("CC");」で取得できるオブジェクトがどれになるのか分からないので、対応している(と勝手に思い込んでいる)ものが取得できるとは限りませんので、このような場合は使ってはいけません。 とりあえず現状では、ゲームオブジェクトの構成やどこに何のスクリプトがアタッチされているのかが分からないので、質問を編集してスクリーンショットなどを追加してくれると分かるかもしれません。
hogefugapiyo

2019/08/23 02:11

一旦、現状の疑問点、ソース、SSなどを添えて質問を書き換えたほうがよいかと思います。
erefant9

2019/08/23 14:08

皆さまご指摘ありがとうございます。 なんだか色々と不具合がありそうです・・・ 皆さま申し訳ありませんです。 Ram.Type-0、fiveHundred、hogefugapiyo様もご指摘いただいた通りまずは自分のできる限りの部分をもう少し精査しオブジェクト、スクリプトを余計なものを省いて単純に確認してみます。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問