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

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

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

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity

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

Q&A

1回答

646閲覧

ランダム配置、オブジェクトの近くに生成しない

GsLK2

総合スコア6

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity

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

0グッド

0クリップ

投稿2018/02/12 19:54

前提・実現したいこと

今敵のスポーン座標を決める作業をしていまして元の座標の近くにツリーがあったらその近くに敵を生成、なければランダムに設定した座標に生成するということをCanvasの中で実装しようとしましたが上手く行かず困っています。

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

エラーメッセージ

該当のソースコード

public class Enemyspown : MonoBehaviour { public static Vector2 spownPos2; private Vector2 enemyPos; GameObject[] trees; RectTransform m_RectTransform; float dis = 0.0f; float l_dis; Vector2 randomPos; Vector2 lefttop = new Vector2(178.0f, 132.0f); Vector2 rightbottom = new Vector2(259.0f,-146.0f); // Use this for initialization void Start () { //この座標をゲームプレイの初期スポーンにする //spownPos2 = gameObject.transform.position; m_RectTransform = GetComponent<RectTransform>(); //ランダムの変数 float ramX = Random.Range(lefttop.x, rightbottom.x); float ramY = Random.Range(lefttop.y, rightbottom.y); //ランダムの座標 randomPos = new Vector2(ramX, ramY); } // Update is called once per frame void Update () { //******************敵と一番近い木を探す処理***************** //オブジェクトの座標 enemyPos = gameObject.transform.position; //ツリータグを探す trees = GameObject.FindGameObjectsWithTag("SpownSelectTree"); //エネミーに一番近いツリーのタグを探す for (int i = 0; i < trees.Length; i++) { l_dis = Vector2.Distance(enemyPos, trees[i].transform.position); if (dis == 0.0f || dis > l_dis) { dis = l_dis; } } //*********************************************************** //*********敵の元の座標の近くに木があったらその近くにポジションを設定、 //なければランダム(G、Hエリア内)にポジションを設定********* //移動(トランスフォームだとシーンビューとゲームビューで移動量が変わる可能性があるため) float x = m_RectTransform.anchoredPosition.x; float y = m_RectTransform.anchoredPosition.y; //木のとなりの座標 x = l_dis + 30.0f; y = l_dis + 30.0f; //m_RectTransform.anchoredPosition = new Vector2(x, y); //m_RectTransform.anchoredPosition = randomPos; //ツリーと敵の距離がdis以下だったらその近くに座標を移動 if (dis <= 30.0f) { gameObject.transform.position = new Vector2(x, y); //enemyPos = new Vector2(x, y); enemyPos = gameObject.transform.position; } //でなければランダムに設定した数値に座標がいく else { gameObject.transform.position = randomPos; enemyPos = gameObject.transform.position; } //************************************************************ //********スポーンセレクトシーンで決めた座標をゲームプレイシーンの敵の座標に反映する********** //移動した座標を現在の座標に変換 m_RectTransform.anchoredPosition = new Vector2(x, y); //現在の座標 spownPos2 = new Vector2(x, y); //******************************************************** } }

試したこと

ランダムの数値を変えたりしたのですが座標がおかしくなってしまいます。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

何をやっているのか、何がうまくいかないのかイマイチよく分かりませんが、
距離による条件分岐でenemyPosを決めているのに、
m_RectTransform.anchoredPosition = new Vector2(x, y);になっているのでenemyPosが反映されていません。

また、new Vector2(x, y);のxとyについてもfloat x = m_RectTransform.anchoredPosition.x;の直後にx = l_dis + 30.0f;としていたりと意図が分かりません。
更にl_disはtransform.positionから求められているので、anchoredPositionにそのまま反映させるとおかしな値となる可能性が高いです。

ついでにrandomPosはStart()でしか設定されていないので、最初に決まったランダム位置が以後ずっと使われますが、これは想定通りでしょうか?

全体的に見直してみてください。

投稿2018/02/13 01:26

sakura_hana

総合スコア11427

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

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

GsLK2

2018/02/13 10:15

回答ありがとうございます。少し落ち着いてコードを見てみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問