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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Unity

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

Q&A

解決済

2回答

1971閲覧

Ubity Listの中にあるオブジェクトの変数を取得したい 詳しい方お願いします。

Imitubori

総合スコア7

Unity

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

0グッド

0クリップ

投稿2021/08/19 01:15

編集2021/08/19 06:41

List の中にある gameobject についている変数だけを取得したい

unityで、
パズルゲームを作っていて、触ったオブジェクトをListに入れて
listの中にあるオブジェクトの変数どうしをかけて組み合わせて
ある数になったときに イベントを起こすみたいなプログラムにしたいのですが

List の中にある gameobjectだけ についている変数だけを取得したいのです。
詳しい方お願いします。

こっちのやり方の方が早いよとか
もっと取り早い 方法があれば教えてください。

リストにオブジェクトを 追加して 消す処理のスクリプト

Unity

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System; 5 6 7public class TouchManager : MonoBehaviour 8{ 9 // Start is called before the first frame update 10 void Start() 11 { 12 13 14 } 15 16 [SerializeField] 17 List<GameObject> touchBallList; 18 19 20 void Update() 21 { 22 var mousePos = Input.mousePosition; 23 // Debug.Log(mousePos); 24 if(Input.GetMouseButtonDown(0)) 25 { 26 touchBallList = new List<GameObject>(); 27 Ray ray = Camera.main.ScreenPointToRay(mousePos); 28 var h = Physics.RaycastAll(ray, 100.0f); 29 if(h.Length > 0) 30 { 31 //タッチしたボールが選択状態でないとき 32 if(h[0].collider.tag=="Ball"&&!h[0].collider.GetComponent<BallObject>().isTouch) 33 { 34 h[0].collider.GetComponent<BallObject>().isTouch = true; 35 touchBallList.Add(h[0].collider.gameObject); 36 } 37 } 38 } 39 if(Input.GetMouseButton(0)) 40 { 41 //選択しているボールが0個でないとき→タッチした場合 42 if(touchBallList.Count!=0) 43 { 44 Ray ray = Camera.main.ScreenPointToRay(mousePos); 45 var h = Physics.RaycastAll(ray, 100.0f); 46 if(h.Length > 0) 47 { 48 if( 49 h[0].collider.tag=="Ball"&&!h[0].collider.GetComponent<BallObject>().isTouch 50 ) 51 { 52 h[0].collider.GetComponent<BallObject>().isTouch = true; 53 touchBallList.Add(h[0].collider.gameObject); 54 } 55 } 56 } 57 } 58 if(Input.GetMouseButtonUp(0)) 59 { 60 ReleaseObject(); 61 } 62 63 } 64 65 public void ReleaseObject() 66 { 67 var cnt = touchBallList.Count; 68 //離したらマテリアルの色を戻す 69 foreach(GameObject go in touchBallList) 70 { 71     //選択状態を解除 72 go.GetComponent<BallObject>().isTouch = false; 73 //3個以上なら消す 74 if(cnt>=2) 75 { 76 Destroy(go); 77 } 78 } 79 touchBallList.Clear(); 80 } 81 }

取得したい変数

unity

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class O_ball : MonoBehaviour 6{ 7 public int number = 2; 8 9}

unity

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class H_ball : MonoBehaviour 6{ 7public int number = 13; 8} 9

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/08/19 09:46

Listとして扱いたい、このnumberという変数を持つクラスをわざわざ複数のクラスに別々で定義して扱いにくくする理由は何でしょうか?
guest

回答2

0

ベストアンサー

GameObject型でしまってあるなら、foreachで回してそいつがO_ballのComponentを持っているか調べて、持ってたら数値を参照すればどうでしょうか。

cs

1foreach(O_ball _ball in touchBallList){ 2 var tmp = _ball.GetComponent<O_ball>(); 3 if(tmp != null) Debug.Log(tmp.number); 4}

もし、このリストがO_ballついたボールしか取得しないのであればリストの型をO_ballにしてしまうのも良いかと思います。

投稿2021/08/19 01:37

hogefugapiyo

総合スコア3302

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

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

0

こういうことですか?

C#

1using System.Linq; // 追加 2 3 List<int> getNumbers = touchBallList.Select(x => x.GetComponent<O_ball>().number).ToList();

コメントを受けて追記:

であれば、インターフェースを使いましょう。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public interface IBall 6{ 7 int number { 8 get; 9 set; 10 } 11}

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class O_ball : MonoBehaviour, IBall 6{ 7 public int number 8 { 9 get; 10 set; 11 } = 2; 12}

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class H_ball : MonoBehaviour, IBall 6{ 7 public int number 8 { 9 get; 10 set; 11 } = 13; 12}

このようにすれば、List<IBall> touchBallList;とすれば、O_ballもH_ballも格納することができますし、~.GetComponent<IBall>();とすれば、いずれも取得できます。

投稿2021/08/19 01:43

編集2021/08/19 09:47
fiveHundred

総合スコア9917

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

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

Imitubori

2021/08/19 06:20

すみませんやりたいことは 4種類スクリプトがそれぞれのオブジェクトについて マウスで触ったオブジェクトのみをリストに入れて そのリストの中にあるオブジェクト(名前がそれぞれ違う)の変数を取得したかったんです。 難しいですかね…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問