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

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

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

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

Unity

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

Q&A

解決済

1回答

3093閲覧

[Unity]配列にアタッチされたオブジェクト内のコンポーネントを取得する方法について

FujiBayashi

総合スコア19

C#

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

Unity

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

0グッド

0クリップ

投稿2021/09/01 06:30

編集2021/09/01 09:50

実現したいこと

UNITYで「配列にアタッチされたオブジェクトのコンポーネント」を取得したいのですがエラーとなってしまい、
なにかが違う…とは解っているのですが解決方法がどうしてもわからず、質問させていただきました。

前提条件

シーンには**オブジェクト「Shikaku」オブジェクト「Maru」**だけがある状態です。

イメージ説明

オブジェクト「Shikaku」にはShikakuScript.csがアタッチされており、
オブジェクト「Maru」にはMaruScript.csがアタッチされています。

※MaruScriptは何も書かれていないスクリプトです。

具体的に実現したいことは
ShikakuScript内で、同スクリプト内に作った配列経由で「MaruScript」を取得する』という処理です。

ShikakuScriptの内容

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class ShikakuScript : MonoBehaviour 6{ 7 8 public GameObject[] _ObjectList; 9 public MaruScript[] _ScriptList; 10 11 12 void Update() 13 { 14 int i = _ObjectList.Length; 15 int e = 0; 16 17 if (i != 1) 18 { 19 while (_ObjectList[e] == null) 20 { 21 _ScriptList = _ObjectList[e].MaruScript; 22 } 23 } 24 } 25 26}

#エラーの内容

Assets\Test\ShikakuScript.cs(21,46): error CS1061: 'GameObject' does not contain a definition for 'MaruScript' and no accessible extension method 'MaruScript' accepting a first argument of type 'GameObject' could be found (are you missing a using directive or an assembly reference?)

「GameObject」に「MaruScript」の定義が含まれていないよ』と言われていることはわかるのですが、どう書けばいいのかわかりません。

#補足情報

「配列をやめればいい」のは当然なのですが、最終的に実現したい処理が
同じスクリプトがアタッチされた不特定多数のオブジェクトを動的に取得してアクセスする」という処理である都合上、
配列という形式は外せず、途方に暮れています…。

基本的な事で申し訳ありませんが、よろしくお願いいたします!

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

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

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

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

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

fiveHundred

2021/09/01 07:18

ループ文とGetComponentで1つずつ取得していくのではダメなのでしょうか? また、リストと申しておりますが、正しくは「配列」です。 C#ではListクラスがあるので、そちらを指すことがほとんどです。
FujiBayashi

2021/09/01 09:53

>ループ文とGetComponent 基本的な書き方の問題かと思い質問してみたのですが、 やはり根本的な構造から見直すべきかもしれませんね…。 >リスト おっしゃるとおりです…。脳内で誤用していた言葉が表に出てきてしまいました…。 修正しました!
fiveHundred

2021/09/01 09:59

「構造」とかどこにも書いてません。 単にループとGetComponentで出来ると書いただけです。
FujiBayashi

2021/09/01 10:08

大変失礼しました。二重三重にアホなことを言ってました。お恥ずかしい限りです。 おっしゃるとおり、GetComponentを使うだけで全て解決しました。 もしよろしければ回答として再度投稿いただければベストアンサーとしてクローズさせていただきます。 ありがとうございました!!
guest

回答1

0

ベストアンサー

ループ文とGetComponentで1つずつ取得していけば出来ます。

基本的な方法は以上ですが、一行で済ます方法があったので記載しておきます。

C#

1using System.Linq; // 追加 2 3 void Update() 4 { 5 _ScriptList = _ObjectList.SelectMany(x => x.GetComponents<MaruScript>()).ToArray(); 6 }

(ちなみにGetComponentsとしているのは、同じゲームオブジェクトに複数のMaruScriptをアタッチしている場合に1つしか取れないことを防ぐためです。今回は無いと思いますが念のため)

投稿2021/09/01 10:24

fiveHundred

総合スコア10275

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

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

FujiBayashi

2021/09/01 10:30

おっしゃるとおり、 _ScriptList[0] = _ObjectList[0].GetComponent<MaruScript>(); と書くだけで解決しました。 よく見ると質問内に示したコードも微妙に訳のわからない感じになっていて大変失礼しました…。 (質問用にコードを書き直したつもりが、うまく書き直せていなかったようです) 訳のわからない質問に的確にご回答いただき大変お恥ずかしい限りです。 また、不測の事態が起きたときのための対策案まで示してくださり大変勉強になりました。 ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問