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

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

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

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

Q&A

解決済

2回答

1011閲覧

Unityで指定した位置からキャラクターをランダムに生成

such22

総合スコア10

Unity

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

0グッド

0クリップ

投稿2021/12/15 00:40

前提・実現したいこと

Unityで指定した位置からキャラクターをランダムに生成したいのですが、
以下の2つのエラーが発生しています。

発生している問題・エラーメッセージ

Assets\Script\List.cs(23,66): error CS1061: 'Vector3' does not contain a definition for 'Count' and no accessible extension method 'Count' accepting a first argument of type 'Vector3' could be found (are you missing a using directive or an assembly reference?)
Assets\Script\List.cs(23,32): error CS0165: Use of unassigned local variable 'position'

該当のソースコード

using System.Collections; using System.Collections.Generic; using UnityEngine; public class List : MonoBehaviour { public GameObject obj; public List<Transform> positions; // 経過時間 private float time; // Update is called once per frame void Update() { // 前フレームからの時間を加算していく time = time + Time.deltaTime; // 約1秒置きにランダムに生成されるようにする。 if (time > 1.0f) { Vector3 position = positions[Random.Range(0, position.Count)].position; Instantiate(obj, position, Quaternion.identity); // 経過時間リセット time = 0f; } }

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

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

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

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

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

1T2R3M4

2021/12/15 00:57 編集

質問は何でしょうか。 また、 調べたこと、試したこと、デバッグした内容を質問に追記していただけませんか。
such22

2021/12/15 00:58

現状、 CS1061「存在しないメソッドを呼び出そうとしたときや、存在しないクラス メンバーにアクセスしようとしたときに発生する」 CS0165「未割り当てのローカル変数の使用」というところまでは調べている段階です。
guest

回答2

0

ベストアンサー

c#

1Vector3 position = positions[Random.Range(0, position.Count)].position;

この部分ですが

c#

1Vector3 position = positions[Random.Range(0, positions.Count - 1)].position;

としてはどうでしょうか?
修正点

  • positionをpositionsに
  • indexの最大値 = 要素数 - 1なので position.Count - 1 にする

追記

c#

1 [SerializeField]private GameObject obj; 2 3 //public List<Transform> positions; 4 [SerializeField]private List<Vector3> positions = new List<Vector3>(){ 5 //初期値を設定 6 new Vector3(0f,0f,0f),new Vector3(1f,0f,0f),new Vector3(0f,1f,0f),new Vector3(0f,0f,1f) 7 }; 8 private float time; 9 10 void Update() 11 { 12 //time = time + Time.deltaTime; 13 time += Time.deltaTime; 14 15 float limitTime = 1.0f; 16 if (time > limitTime) 17 { 18 //Vector3 position = positions[Random.Range(0, positions.Count -1)]; 19 Vector3 position = positions[Random.Range(0, positions.Count)]; 20 GameObject target = Instantiate(obj, position, Quaternion.identity); 21 time = 0f; 22 } 23 }

修正点
もしインスペクター上に入力項目を表示したいだけならpublic修飾子を付けるのではなく[SerialisedField]を使ったほうがいいと思います(スコープはprivateのままでinspector上に表示する)

objの生成場所のみを指定したいのならTransform型を使うのではなくVector3型を使うだけで十分かと思います。(Transform.positionと同じ型)

リストに初期値を一応設定していますがinspector上で値を入力するなら消しても構わないです({}の部分)script上で記入する場合は逆にinspector上で変更されないように[SerializedField]を消してください

timeの部分はこちらのほうが見やすいと思ってこうしました。やってることは同じです。

1.0fと記入するよりlimitTimeという変数を用いたほうが可読性が高くなると思います

[訂正] Random.Rangeのint型を対象としたものは010の範囲を設定したとき実際には09の中の整数を選択するようなのでRandom.Range(0, positions.Count)が正しいです。すみません...

一応Instantiateの部分「GameObject target =」を付け加えました。今後obj(正確にはobjのクローン体)を削除したいときはこいつをうまく使ってください。

投稿2021/12/15 07:30

編集2021/12/19 08:05
sphim13

総合スコア10

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

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

such22

2021/12/19 02:01

回答いただきありがとうございます。 ご教示いただいた通りにすると、エラーは消えたのですが、 キャラクターは生成されないままです。 public List<Transform> positions; の下に何か記述する必要があるのでしょうか?
sphim13

2021/12/19 05:58

回答を修正しました。これでどうでしょうか?
such22

2021/12/19 08:01

回答いただきありがとうございます。 GameObject[] target = Instantiate(obj, position, Quaternion.identity); の部分に以下のようなエラーが現れました。 Assets\Script\Appear.cs(31,35): error CS0029: Cannot implicitly convert type 'UnityEngine.GameObject' to 'UnityEngine.GameObject[]'
sphim13

2021/12/19 08:10

あ、すみません。間違えました。型はGameObjectです。しかし、これだと何回も内容を上書をしてしまいます。もしリストや配列を使って管理したいならList<GameObject>やGameObject[]をつかってください。
such22

2021/12/19 14:10

ありがとうございます! 無事できました!
guest

0

Listっていうクラス名はやめましょう。
ソースコード內で利用している通り、Listクラスは既に存在しているので重複します。

投稿2021/12/15 03:47

hogefugapiyo

総合スコア3302

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問