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

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

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

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

Unity

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

Q&A

解決済

1回答

3337閲覧

if文で要素数がランダムの配列を全て個々の条件としたい(Unity)

MujinSekai

総合スコア18

C#

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

Unity

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

0グッド

0クリップ

投稿2017/08/24 12:36

編集2017/08/24 14:28

###if文で配列のすべての要素を個々の条件に使いたい
enemyController.enemyCoordinate // 敵座標(Vector2型配列)
enemyController.enemyIndividualsNum // 敵数(int型、ランダム)

例えばfor文のx = 2, y = -5の場合、enemyController.enemyCoordinate配列の要素の中で座標が同じ場合、その時は処理を行わない、という事をしたいです。
###該当のソースコード

C#

1 for (int y = -10; y <= 10; y++) // Playerオブジェクトを中心に-10から10の範囲で 2 { 3 for (int x = -10; x <= 10; x++) // xとy座標に 4 { 5 if (!(x == 0 && y == 0) // 中心(0, 0)にあるPlayerオブジェクトの座標を除き 6 || // または 7 //---ここで他オブジェクトのVector2型の要素数がランダムな配列のxとyをfor文のxとyとを比較したい---- 8 !(x == enemyController.enemyCoordinate[enemyController.enemyIndividualsNum].x 9 && y == enemyController.enemyCoordinate[enemyController.enemyIndividualsNum].y)) 10 //-------------------------------------------------------------------------------------- 11 { 12 //----処理(個々に違う処理を行う、敵座標とx,yが同じ場合処理を行わない)---- 13 } 14 } 15 }

###試したこと
enemyIndividualsNumが固定の場合、一つづつ書いていく方法もあると思いますが、ランダムなため変数を使っていて、上記の方法を取る事ができませんでした。
この場合、どのようにしたら意図する事が出来るでしょうか。

###補足情報(言語/FW/ツール等のバージョンなど)
C#
Unity2017.2.0b8

###閲覧ありがとうございます

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

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

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

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

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

guest

回答1

0

ベストアンサー

Linq の All を使うことで、簡単に要素全てが条件を満たす時を取得できます。

enemyCoodinate.All(coord => coord.x == x && coord.y == y)

逆に、一つでも当てはまったら何もしないとも言えるので、

enemyCoodinate.Any(coord => coord.x == x &coord.y == y)

を使う方が効率良さそうですね

====追記1

具体的には以下のような感じでどうでしょうか。
整理しやすいように条件分岐を分解しています。

// Playerオブジェクトを中心に-10から10の範囲で for (int y = -10; y <= 10; y++) { for (int x = -10; x <= 10; x++) { // 中心(0, 0)にあるPlayerオブジェクトの座標を除く if (x == 0 && y == 0) { continue; } // (x,y) に敵がいたら何もしない // enemyCoordinate に (x,y) が含まれているかどうかの確認 if (enemyController.enemyCoordinate.Any(coord => coord.x == x && coord.y == y)) { continue; } //----やりたい処理ここから---- } }

投稿2017/08/24 12:48

編集2017/08/24 14:28
kanitaoru

総合スコア204

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

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

MujinSekai

2017/08/24 14:10

回答ありがとうございます。 誤解を招く聞き方をしてしまいました。 該当のソースコードの---処理---は440種類の描画で、敵座標とfor文のxyが同じ場合、該当する描画を行わない、という事なのでお教え頂いたAnyとAll(使い方がわからなったので放置していました……)だと、全て条件が満たす場合と満たさない場合、一つでも条件に満たす場合と満たさない場合、なので、条件に合う(合わない)場合が個々に必要なので最終的な描画が上手くいきませんでした(敵と描画が重なる)。 今は原始的ですが、if文で長さを取得し !(x ==enemyController.enemyCoordinate[0].x && y == enemyController.enemyCoordinate[0].y) のように書いていこうと思っています。 もし私のAnyやAllの使い方が間違っていたり、他に良い方法がありましたらお教え頂きたいと思っております。
kanitaoru

2017/08/24 14:25

すいません、出先で携帯から見てたので少し端折ってました。 (x,y) に敵がいた場合は、処理(描画)をしないということであってますか? (x, y) に敵がいた場合 というのは enemyCoordinate に(x, y) が含まれていた場合といえるので、Anyが使えるはずです。 これを踏まえて追記しますね。 ※Linqの機能は、 `using Linq` をソースコード冒頭につけておかないと使えません。
MujinSekai

2017/08/24 14:40

continueを使う発想はありませんでした(昔習ったのに完全に失念していました)! 丁寧な回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問