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

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

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

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

Unity

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

Q&A

解決済

3回答

2418閲覧

複数の別クラスの同名の関数にアクセスしたい

nama_uni

総合スコア8

C#

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

Unity

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

0グッド

2クリップ

投稿2020/01/22 14:02

編集2020/01/23 01:28

複数のスクリプトファイル(scriptA.cs、scriptB.cs)に同名の関数(kyoutu)があり、
それぞれが別のオブジェクトにアタッチされているものとします。
・gameObject A に scriptA.cs をアタッチ
・gameObject B に scriptB.cs をアタッチ

上記のオブジェクトにはそれぞれ別の子オブジェクトが存在しており、
それらには同一のスクリプトファイル(scriptC.cs)がアタッチされています。
・gameObject A の子オブジェクト gameObject AC に scriptC.cs をアタッチ
・gameObject B の子オブジェクト gameObject BC に scriptC.cs をアタッチ

子オブジェクトそれぞれが自身の親オブジェクトの同名の関数にアクセスする場合、
同一スクリプトファイルではGetComponentを行うことはわかるのですが

public class scriptC: MonoBehaviour { 親オブジェクトのクラス名 _kyoutuScript; void Start() { _kyoutuScript = transform.parent.gameObject.GetComponent<親オブジェクトのクラス名>(); //呼び出したい関数 _kyoutuScript.kyoutu(); }

上記の「親オブジェクトのクラス名」にあたる部分がわかりません。

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

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

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

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

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

guest

回答3

0

ベストアンサー

scriptA、scriptBに共通処理を実装するよってインターフェースを作って

C#

1public interface IKyoutu 2{ 3 void kyoutu(); //共通処理 4}

scriptA

C#

1public class scriptA : MonoBehaviour, IKyoutu 2{ 3 public void kyoutu() 4 { 5 //処理 6 } 7}

scriptB

C#

1public class scriptB : MonoBehaviour, IKyoutu 2{ 3 public void kyoutu() 4 { 5 //処理 6 } 7}

scriptCからはこんな感じで呼び出せないですか?

C#

1public class scriptC: MonoBehaviour 2{ 3 IKyoutu _kyoutuScript; 4 5 void Start() 6 { 7 _kyoutuScript = transform.parent.gameObject.GetComponent<IKyoutu>(); 8 //呼び出したい関数 9 _kyoutuScript.kyoutu(); 10 } 11}

投稿2020/01/23 02:09

YAmaGNZ

総合スコア10222

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

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

nama_uni

2020/01/23 04:48

ありがとうございます。まさに求めていたものでした。 インターフェイスという手法があったのですね。 これは様々な部分で活用できそうですね。
guest

0

複数のスクリプトに同名クラス持てたっけ?(うろ覚え)という根本的な疑問はありますが
そのままkyoutuクラス指定でできませんか?
(「親オブジェクトの変数名」ではなく「取得したいクラス(型)」という言い方が正しいです)

kyoutu _kyoutuScript;
_kyoutuScript = transform.parent.gameObject.GetComponent<kyoutu>();

GetComponentは前に何も付けなければ「自分のGameObjectに付いたクラス取得」ですが、
この表記なら「自分の親のGameObjectに付いたクラス取得」という意味になります。

投稿2020/01/23 01:08

sakura_hana

総合スコア11425

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

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

nama_uni

2020/01/23 01:38

折角すばやく回答をいただいたのですが、こちらの質問内容に不備がありました。申し訳ありません。 関数とクラスを勘違いしておりました… Ascript及びBscriptがそれぞれスクリプト名兼クラス名となり、それぞれにkyoutuという関数が いることになります。 その上で各子オブジェクトにアタッチされている同一クラスscriptCで、 それぞれの親オブジェクトのクラス関数kyoutuにアクセスしたい。というのがやりたかったことです。
guest

0

Unityはよく分かりませんが言ってることは共通のinterfaceの定義かdynamicだなーと思い前者は既に回答が出ているのでdynamicが使えるのか調べたところ以下の記事を見つけました。
【Unity】【C#】dynamicキーワードを使って変数やメソッドを動的に操作する
ただ、interfaceで不都合がないのであれば、そちら方が良いと思います

投稿2020/01/23 03:02

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問