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

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

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

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

Unity

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

Q&A

解決済

1回答

1062閲覧

一度生成した場所には生成させないコードを書きたい

y0shida

総合スコア15

C#

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

Unity

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

0グッド

0クリップ

投稿2021/02/09 18:45

前提・実現したいこと

今現在的あてゲームを作っています。

何個かある板(的の生成位置)に、的を生成するコードを書きました。

既に生成した位置には、その的が消えるまでは生成させたくないのですが

手順をメモ帳に書き出してみましたが、いまいちコードが思いつきません。

一度生成した板には生成した的が消えるまで新しい的は生成しない
というコードが書きたいです。

何かいい方法があれば教えてください。

該当のソースコード

c#

1public class TargetSpawn : MonoBehaviour 2{ 3 //Prefabのリスト 4 [Header("prefabリスト")] 5 public GameObject[] targetPrefabs; 6 7 //的の生成位置のリスト 8 [Header("的の位置リスト")] 9 public GameObject[] targets_L; 10 public GameObject[] targets_M; 11 public GameObject[] targets_S; 12 13 private Vector3[] posList_L; 14 private Vector3[] posList_M; 15 private Vector3[] posList_S; 16 17 ///ランダム生成/// 18 [Header("最小.最大インターバル時間設定")] 19 //時間の最小値 20 [SerializeField] float minTime; 21 //時間の最大値 22 [SerializeField] float maxTime; 23 //経過時間 24 private float time = 0f; 25 //インターバル 26 private float interval; 27 28 private bool a; 29 30 void Start() 31 { 32 33 interval = GetRandomTime();//ランダム生成したインターバルを入れる 34 a = true; 35 36 MakePosList(); 37 } 38 39 void Update() 40 { 41 42 //経過時間を入れて計測する 43 time += Time.deltaTime;//時間計測開始 44 45 //経過時間がインターバルを超えたとき 46 if(time > interval && a) 47 { 48 a = true; 49 //ターゲットのサイズを決める数値をランダムに生成 50 var targetSize = Random.Range(0,3); 51 52 //的Prefabから配置する的の位置を生成 53 var numPos = Random.Range(0, posList_L.Length); 54 55 float posCheck = numPos; 56 57 //Posリストのランダム生成値 58 var pos_L = posList_L[Random.Range(0, posList_L.Length)];//PosリストLサイズ 59 var pos_M = posList_M[Random.Range(0, posList_M.Length)];//PosリストMサイズ 60 var pos_S = posList_S[Random.Range(0, posList_S.Length)];//PosリストSサイズ 61 62 //Prefabリストのランダム生成値 63 var targPref = targetPrefabs[Random.Range(0, targetPrefabs.Length)]; 64 65 switch (targetSize) 66 { 67 case 0: //Large 68 Instantiate(targetPrefabs[Random.Range(0, targetPrefabs.Length)], pos_L, transform.rotation); //的生成 69 break; 70 case 1: //Medium 71 Instantiate(targetPrefabs[Random.Range(2, 5)], pos_M, transform.rotation); //的生成 72 break; 73 case 2: //Small 74 Instantiate(targetPrefabs[Random.Range(4, 5)], pos_S, transform.rotation); //的生成 75 break; 76 } 77 78 time = 0f; 79 interval = GetRandomTime();//ランダム生成したインターバルを入れる 80 } 81 } 82 83 84 //ランダムに時間を生成 85 private float GetRandomTime() 86 { 87 return Random.Range(minTime,maxTime); 88 } 89 90 void MakePosList() 91 { 92 //Vector3作成 93 posList_L = new Vector3[targets_L.Length]; 94 posList_M = new Vector3[targets_M.Length]; 95 posList_S = new Vector3[targets_S.Length]; 96 97 //位置リストの中にターゲットのポジションリスト内のオブジェクト座標を入れる 98 for (int i = 0; i < targets_L.Length; i++) 99 { 100 posList_L[i] = targets_L[i].transform.position; 101 } 102 103 //位置リストの中にターゲットのポジションリスト内のオブジェクト座標を入れる 104 for (int i = 0; i < targets_M.Length; i++) 105 { 106 posList_M[i] = targets_M[i].transform.position; 107 } 108 109 //位置リストの中にターゲットのポジシsョンリスト内のオブジェクト座標を入れる 110 for (int i = 0; i < targets_S.Length; i++) 111 { 112 posList_S[i] = targets_S[i].transform.position; 113 } 114 } 115} 116

他にこのコードはもっと簡単に書ける点等、ありましたらご教示お願いします。

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

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

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

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

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

m.ts10806

2021/02/10 00:19

そのメモ帳に書き出した手順とやらを転記してください。 設計とも言える部分ですし、そもそもその考え方が合っていなかったら実装にも繋がりません
y0shida

2021/02/12 18:26

どの板に生成されたかという情報を保持 保持した情報と比較、すでに生成された板以外の板に生成 生成された的が消されたら、保持した情報も削除 というメモを書きました。
guest

回答1

0

ベストアンサー

単純に生成中の的の位置をListあたりに入れるというルールで
生成成功したらListに追加、的が消えたらListから削除する。

生成しようとする時にFindContainsで探して、見つかったら中断するような感じでいいのではないでしょうか。

【C#入門】Listの要素を検索する方法総まとめ(Find/IndexOf/Contains)
https://www.sejuku.net/blog/45381

投稿2021/02/09 19:00

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

y0shida

2021/02/13 05:10

ありがとうございます、元々Listを使うことを考えていて、mahnyさんのやり方で試してみました。 Listにpos.magnitudeというVector3の情報をAddした後、Containsで前のフレームのpos.magnitudeを判定してみましたが Vecotor3の(x,y,z)という情報ではなく、”pos.magnitude”が入っているかどうか という判定をしているらしく、思った通りの実装にはなりませんでした。
退会済みユーザー

退会済みユーザー

2021/02/13 05:47

pos.magnitudeにどんな値が入っているのかは提示されていないので分かりませんが、ListのFind等の挙動を考えたら、型が違うのですから単純比較できないのは当たり前じゃないでしょうか。 位置情報をどちらからも評価可能な値に変換して格納するのですよ。 一度JSONにするとか。もっと原始的には固定桁数の数字文字列にするとか。 {x:10, y:20, z:30} ⇒ "001000200030" みたいに。 この辺の仕様はそのゲーム開発者であるあなたが好きに決めて良いものです。 頑張ってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問