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

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

新規登録して質問してみよう
ただいま回答率
85.48%
オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Unity

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

Q&A

解決済

1回答

9725閲覧

Unityでオブジェクトの生成位置がおかしい

ligo

総合スコア7

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Unity

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

0グッド

0クリップ

投稿2020/07/24 06:25

編集2020/07/24 07:24

1前提
UnityでCubeを生成しようとしています。
Unityのバージョンは2019.3.13fです。
オンライン対戦できるゲームを作りたいと思いPhotonを使おうとして、その導入として、オブジェクトの生成をしようとしています。

2問題
Instantiateを使って生成しようとしていて、座標は(0,0,0)に指定しているのですが、実際に生成された座標を見てみると毎回異なり、(800,19000)あたりになっています。

実行時、一時停止した時の画像です。

生成位置がずれています。また、Cubeが2個生成されているのは、Object.InstantiateとPhotonNetwork.Instantiateの二種類を試しているからです。この二つのCubeはどちらも同じ座標でした。

"Cube"を生成しているスクリプトです。

using

1using Photon.Realtime; 2using UnityEngine; 3 4// MonoBehaviourではなくMonoBehaviourPunCallbacksを継承して、Photonのコールバックを受け取れるようにする 5public class PhotonManager : MonoBehaviourPunCallbacks 6{ 7 [SerializeField] 8 GameObject cube; 9 private void Start() 10 { 11 // PhotonServerSettingsに設定した内容を使ってマスターサーバーへ接続する 12 PhotonNetwork.ConnectUsingSettings(); 13 } 14 15 // マスターサーバーへの接続が成功した時に呼ばれるコールバック 16 public override void OnConnectedToMaster() 17 { 18 // "room"という名前のルームに参加する(ルームが無ければ作成してから参加する) 19 PhotonNetwork.JoinOrCreateRoom("room", new RoomOptions(), TypedLobby.Default); 20 } 21 22 // マッチングが成功した時に呼ばれるコールバック 23 public override void OnJoinedRoom() 24 { 25 Instantiate(cube, new Vector3(0, 0, 0), Quaternion.identity); 26 // マッチング後、ランダムな位置に自分自身のネットワークオブジェクトを生成する 27 var v = new Vector3(Random.Range(-3f, 3f), Random.Range(-3f, 3f)); 28 GameObject vObj = PhotonNetwork.Instantiate("Cube", new Vector3(0,0,0), Quaternion.identity); 29 30 } 31} 32コード

Photonを使用して、マッチング時に呼ばれるコールバックで生成しようとしています。
Instantiateが二つあり、一つはPhotonNetwork.Instantiate、もう一つは普通のInstantiateで生成しているのですが、どちらも同じ(0,0,0)からズレたところに生成されます。

3試した方法
初めはPhotonNetwork.Instantiateでやっていることに問題があると思い、普通のinstantiate でやってみたのですが、やはり、生成される座標位置は同じでした。
また、PhotonNetworkではなく、別のからのオブジェクトを用意して、startメソッドからInstantiateしようとしたのですが、結果は変わりませんでした。

4最後に
追加で必要な情報などがありましたら、おっしゃってください。
今までInstantiateは何回も使ってきたのですが、今回のように指定した位置とずれた場所に生成されてしまうのは初めてで、対応策がわかりません。何かご存知の方がいらっしゃりましたら、ご指導いただけるとありがたいです。

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

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

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

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

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

bboydaisuke

2020/07/24 07:14 編集

質問に書いてあることが正しければ、Start() の PhotonNetwork.ConnectUsingSettings(); をコメントアウトして、Start() に Instantiate(cube, new Vector3(0, 0, 0), Quaternion.identity); を書いても、生成されたオブジェクトは原点からはるか遠いところに生成されるということですよね。その場合はコードがおかしいのではないと思います。「(800,19000)あたりになっています。」という記述が気になりますが、Rect Transform を使ってたりしますか? なお、「どちらも同じ(0,0,0)からズレたところに生成されます。」という記述は、Object.Instantiate でも PhotonNetwork.Instantiate でも、どちらも原点ではない同じ座標に生成される、と解釈しています。
ligo

2020/07/24 07:20

生成は先ほどあげさせていただいたスクリプトでやっていますので、rectTransformを使ってないと思うのですが、ちゃんと分かってないので、どこを見れば判断できるか教えていただけると、ありがたいです。 最後の質問に関しては、おっしゃる通りです。生成はされているので、コールバックはされていると思うのですが、Object.InstantiateでもPhotonnetwork.Instantiateでもずれてしまいます。
guest

回答1

0

ベストアンサー

このスクリプトを適当な GameObject にアタッチして実行してみてください。

csharp

1using UnityEngine; 2 3public class ObjectCreateTest : MonoBehaviour 4{ 5 [SerializeField] GameObject m_prefab; 6 7 void Start() 8 { 9 if (!m_prefab) 10 { 11 m_prefab = GameObject.CreatePrimitive(PrimitiveType.Sphere); 12 } 13 14 GameObject go = Instantiate(m_prefab, Vector3.zero, Quaternion.identity); 15 Debug.LogFormat("{0} is spawned at {1}", go.name, go.transform.position.ToString()); 16 } 17}

原点に Sphere を生成して直後にそのことをログします。そうしたら次は Prefab にその Cube というプレハブをアサインして実行してみてください。そのプレハブを原点に生成し、そのことをログします。

これが期待通りに実行できる場合は、このスクリプトとご自身のスクリプトを比べて、少しずつ書き変えてどこが違うと問題が起きるのか「調べて」みてください。

投稿2020/07/24 07:34

bboydaisuke

総合スコア5275

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

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

ligo

2020/07/24 07:46

ありがとうございます。 あげていただいた、スクリプトを参考にさせていただいたところ、うまく、生成することができました。 そして、改めて、Cubeを入れてみたところ、再びおかしくなってしまったので、Cubeに問題があると思われます。 もしかすると、Cubeにカーソルに追従させるというスクリプトをつけていて、その、座標がおかしくなっているのかもしれません。 ご丁寧なご指導、ありがとうございました。
bboydaisuke

2020/07/24 07:47

> 再びおかしくなってしまった ログには原点に生成した、と出力されていますよね。もしそうならば、原点に生成された後に移動した、ということです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問