🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Unity

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

Q&A

解決済

1回答

1620閲覧

【Unity】複数の型を返す関数の型について

anzchan

総合スコア10

C#

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

Unity

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

0グッド

0クリップ

投稿2020/12/29 01:24

編集2020/12/29 03:26

unityにおいてgameObjectA,B,Cがある場合に、名前を指定しいずれかのScriptを取得するような関数を作ろうとしていました。
下記は擬似コードになります。(動作しません)

public class GameStateHolder : MonoBehaviour { public GameObject objectA; public GameObject objectB; public GameObject objectC;   //この関数の型名について   getObjectScript(string name){ switch(name){ case "A" : return objectA.GetComponent<ObjectA>(); case "B" : return objectB.GetComponent<ObjectB>(); case "C" : return objectC.GetComponent<ObjectC>(); } } }

例えばgetObjectScript("A")とするとObjectAのScriptを取得できるといった挙動を想定しています。
しかしながらこの関数は複数の型を返すため、どのような型で返せばよいのかわからず困っています。

もしくはScriptに参照する方法を別のアプローチで検討したほうがベターなのでしょうか。

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

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

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

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

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

sakura_hana

2020/12/29 02:35

「unity 継承」で調べてみてください。 あと質問文を見る限り「getObjectScript("B")」とした場合はobjectBに付いたObjectBが欲しい形でしょうか?(擬似コードに誤字がある気がします)
anzchan

2020/12/29 03:28 編集

解決しました。ありがとうございます。 継承を一度試してエラーが出たため、MonoBehaviour以外の継承が禁止されているものと思い込んでいましたが、エラー文をよく読むと別の原因に起因していた事が判明しました。 質問文はtypoでした。失礼しました
guest

回答1

0

ベストアンサー

まず、用語ですが「Script」というより「Component」ですかね(個人的な意見なので、あまり気にしなくていいです)。

取得したコンポーネントを使って何がしたいかによってアプローチは変わってくると思われます。

たとえば、取得したコンポーネントに共通するインターフェースがあって、そのインターフェースに属するメソッドがあるとするなら、Interfaceを返すということが考えられます。

例:

csharp

1public Interface SomeInterface { 2 void RunAction(); 3} 4 5public class ObjectA : MonoBehaviour, SomeInterface { 6 public void RunAction(){ 7 // 何かの処理 8 } 9} 10 11public class ObjectB : MonoBehaviour, SomeInterface { 12 public void RunAction(){ 13 // 何かの処理 14 } 15} 16 17public class ObjectC : MonoBehaviour, SomeInterface { 18 public void RunAction(){ 19 // 何かの処理 20 } 21}

というふうに同じインターフェースを実装していれば、

csharp

1public class GameStateHolder : MonoBehaviour { 2 public GameObject objectA; 3 public GameObject objectB; 4 public GameObject objectC; 5 6  //この関数の型名について 7  SomeInterface getObjectScript(string name){ 8 switch(name){ 9 case "A" : return objectA.GetComponent<ObjectA>(); 10 case "B" : return objectA.GetComponent<ObjectB>(); 11 case "C" : return objectA.GetComponent<ObjectC>(); 12 } 13 } 14}

のようにインターフェースを返せます。

getObjectScriptを呼び出した側では、

csharp

1SomeInterface someInterface = gameStateHolder.getObjectScript("A"); 2A.RunAction()

のようにインターフェースを通して処理を実行するようになります。

いずれにせよ、「getObjectScriptを呼び出した側で、受け取った値をどう使いたいか」をきちんと考えて、そこからどのように実装するかを考えるべきだと思います。
というか、「getObjectScriptを呼び出した側で、受け取った値をどう使いたいか」を考えれば、おのずと実装方法は見えてくるはずです。

投稿2020/12/29 02:38

JunSuzukiJapan

総合スコア314

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問