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

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

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

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

Unity

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

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

467閲覧

UnityでlinQを用いて2つのGameobjectの配列からtransform.positionの差集合を求めたい

Sotone_x_Nakane

総合スコア26

C#

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

Unity

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

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2017/10/22 01:53

タイトル通りです。

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System.Linq; 5 6public class linQ : MonoBehaviour { 7 8 private float time; 9 10 public GameObject[] tile; 11 public GameObject[] mario; 12 13 void Update () { 14 time -= Time.deltaTime; 15//updateだとうまく動作しないのでArrangeにワープさせています 16 if(time <= 0){ 17 time = 2f; 18 Arrange (); 19 } 20 }

c#

1 private void Arrange (){ 2 3 tile = GameObject.FindGameObjectsWithTag("Finish"); 4 Debug.Log(tile.Length); //400 5 6 mario = GameObject.FindGameObjectsWithTag ("Respawn"); 7 Debug.Log(mario.Length); //150 8 9 IEnumerable<GameObject> aa = mario.Except(tile);//150 10 foreach (GameObject go in aa) { 11 12 Debug.Log (go.transform.position); //marioのtransform.positionが150個出力される 13 } 14 } 15}

おそらく、Arrange内のIEnumable<GameObject>のところでtransform.positionの差集合ではなく、GameObjectの差集合が作られているのでforeachでmarioしか出力されていないのだと思うのですが、どうすればtransform.positionの差集合が求められるでしょうか。

ちなみにmarioの150個のオブジェクトは全てtileの上にあるので、transform.positionの差集合は250になるはずです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Exceptのオーバーロードに、IEqualityComparerを指定して独自の比較を行えるバージョンがあるようですので、それを試してみるのはいかがでしょうかね?

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System.Linq; 5 6public class linQ : MonoBehaviour { 7 8 private float time; 9 10 public GameObject[] tile; 11 public GameObject[] mario; 12 13 void Update () { 14 time -= Time.deltaTime; 15 //updateだとうまく動作しないのでArrangeにワープさせています 16 if(time <= 0){ 17 time = 2f; 18 Arrange (); 19 } 20 } 21 22 private void Arrange (){ 23 24 Debug.Log(tile.Length); //400 25 26 Debug.Log(mario.Length); //150 27 28 IEnumerable<GameObject> aa = mario.Except(tile, new GameObjectEqualityComparer()); // 変更...Exceptの第2引数に独自の比較オブジェクトを与える 29 foreach (GameObject go in aa) { 30 31 Debug.Log (go.transform.position); //marioのtransform.positionが150個出力される 32 } 33 } 34 35 // 追加...transform.positionによるゲームオブジェクト比較のためのEqualityComparerを用意する 36 private class GameObjectEqualityComparer : IEqualityComparer<GameObject> 37 { 38 public bool Equals (GameObject o1, GameObject o2) 39 { 40 if (o1 == o2) 41 { 42 return true; 43 } 44 45 if (o1 == null || o2 == null) 46 { 47 return false; 48 } 49 50 return o1.transform.position == o2.transform.position; // transform.positionの等価比較結果をゲームオブジェクトの比較結果として採用する 51 } 52 53 public int GetHashCode (GameObject o) 54 { 55 return o.transform.position.GetHashCode(); // transform.positionのハッシュコードをゲームオブジェクトのハッシュコードとして採用する 56 } 57 } 58}

動作(特に速度)確認を十分行っていないので、多数のオブジェクトでやると、遅さが気になるといったことがあるかもしれません(2秒ごとに数百個のオブジェクトの処理ならば、さほど気にならないはず...とは思うのですが...)。

※marioはすべてtileに乗っていて、もしmarioの乗っていないtileが欲しい...ということでしたら(差が250になるはず、というのはこういうことでしょうかね)、ご提示のコードと逆にtile集合からmario集合を引かないとならないのではないでしょうか?

投稿2017/10/22 03:29

編集2017/10/22 03:41
Bongo

総合スコア10807

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

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

Sotone_x_Nakane

2017/10/22 03:54

ありがとうございました。 無事に動作しました。 プログラミング初心者でまる1日かけてもわからなかったので尊敬します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問