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

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

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

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

Unity

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

Q&A

1回答

8853閲覧

生成したPrefabの位置情報を取得したい

naa

総合スコア9

C#

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

Unity

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

0グッド

2クリップ

投稿2018/05/08 08:06

編集2018/05/08 09:09

■やりたい事

Instantiateでランダムに生成され、移動しているprefab1

Buttonを押すことでその瞬間のprefab1の位置情報を取得し、得点として計算をした後に
Destroyさせるプログラムを書きたいのですが位置情報の取得ができず困っています…。

■実行したこと

Boardという空のゲームオブジェクトを作成し、

そこにBoardMoveScoreCreateのスクリプトをアタッチしprefab1の生成と移動をさせました。


  • BoardMove

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class BoardMove : MonoBehaviour { 6 7 // Use this for initialization 8 void Start () { 9 10 } 11 12 // Update is called once per frame 13 void Update () { 14 15 transform.localPosition = new Vector3 (-TimeManager.time * 100, 0, 0); 16 17 } 18}

  • ScoreCreate

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class ScoreCreator : MonoBehaviour { 6 7 public GameObject ScorePrefab; 8 public float timer; 9 10 private static float[] ScorePositionXList = new float[] { 11 -130, -20, 90, 200, 310 12 }; 13 14 // Use this for initialization 15 void Start () { 16 17 //タイマー初期化 18 timer = TimeManager.time + 1f; 19 20 //ランダム初期化 21 Random.seed = 100; 22 23 } 24 25 // Update is called once per frame 26 void Update () { 27 28 //xの位置決定 29 int rand = Random.Range(0,ScoreCreator.ScorePositionXList.Length); 30 float x = ScoreCreator.ScorePositionXList [rand]; 31 32 if (timer < TimeManager.time) { 33 34 //譜面作成 35 GameObject obj1 = Instantiate(ScorePrefab) as GameObject; 36 obj1.name = "prefab1"; 37 38 //ヒエラルキー 39 obj1.transform.parent = transform; 40 41 //位置 42 obj1.transform.localPosition = new Vector3(TimeManager.time * 100,x,0); 43 44 //表示順の移動 45 obj1.transform.SetAsFirstSibling(); 46 47 //サイズ// 48 obj1.transform.localScale = new Vector3(1,1,1); 49 50 //タイマー更新 51 timer = TimeManager.time + 1f; 52 53 } 54 55 } 56}

PrefabをそのままDestroy(gameObject);とすると生成されたPrefab(Clone)ではなく

大元のPrefabそのものがDestroyされてしまうため、GameObject.Find("")を使うことで
生成されたprefab1を指定しました。
ただ、この状態だとDebug.Log(name);で返ってくるのが大元のPrefabの状態になってしまい
位置情報が固定されてしまっています。

  • ScoreDelete

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class ScoreDelete : MonoBehaviour { 6 7 // Use this for initialization 8 void Start () { 9 10 } 11 12 // Update is called once per frame 13 void Update () { 14 } 15 16 public void OnScoreClick(){ 17 18 Debug.Log (name); 19 Debug.Log (transform.localPosition); 20 21 Destroy (GameObject.Find("prefab1")); 22 23 } 24 25}

GetComponetにて取得を試みてみたもののやり方がおかしいのか

そもそも間違えているのか上手くいかず…。
生成された個々のprefabの位置情報の取得方法があれば教えて頂きたいです!

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

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

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

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

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

guest

回答1

0

Instantiateした際の戻り値が生成されたGameobject実体なので、(今回だとobj1変数ですね)
その変数をどこかに保持してやれば良いです。
複数生成される想定ならListとかに入れていくと良いでしょう

投稿2018/05/08 09:12

MMashiro

総合スコア2378

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

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

naa

2018/05/09 07:03

回答頂きましてありがとうございます…! 勉強不足でListの使い方がいまいち分からず調べてみたのですが 例えば今回の場合だと位置を知りたいオブジェクトが「prefab1」なので public static List<GameObject> List1 = new List<GameObject>(); でリスト化しておき、位置を知りたい場合は GameObject prefab1 = List1[0]; で呼び出して使えば位置情報が得られるのでしょうか…? 間違っていたら申し訳ないです…。
MMashiro

2018/05/09 08:02 編集

Prefabはあくまで生成する際のベースオブジェクト(画面に出てくるものではありません)でして、 そのPrefabに対してInstantiateするとそのPrefabをコピーして実体(GameObject)を作成しています なので最初に生成したものをListに格納しておき位置情報を取得したい場合は var obj1 = Instantiate(ScorePrefab) as GameObject; //オブジェクト生成 List1.Add(obj1); //格納 --- List1[0].transform.position; //List[0] ≒ 最初に生成したオブジェクトの位置情報を取得 という感じになります Addした後でないと取得はできないので注意してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問