🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

1回答

512閲覧

OnTriggerStayで座標を取得したい

Ayber

総合スコア8

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2019/11/07 21:55

編集2019/11/08 03:42

前提・実現したいこと

2Dと3Dのふたつのステージをボタン一つで行き来するゲームを作っています。
2Dのステージにて特定のエリアにいる時ボタンを押した場合に、もう3Dの該当するブロックの上にプレイヤーを移動させたいです。
(2Dというのは見かけの問題であって、どちらも3Dで制作しています。)

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

1つ目のエリアはうまくいきますが、2つ目のエリアでボタンを押しても、該当するブロックのx座標を取得してくれません。(y座標z座標は問題ありません)。

該当のソースコード

C#

12Dの特定エリアに入った時の、該当する3Dシーンのブロックのx座標を取得するスクリプト 2 3public class Areatrigger : MonoBehaviour 4{ 5 public static float anotherTransformZ; 6 7 public void OnTriggerStay(Collision other) 8 { 9 if (other.gameObject.name == "Area2D_A") 10 { 11 anotherTransformZ = GameObject.Find("3DCubeA").transform.position.x; 12 13 } 14 15 else if (other.gameObject.name == "Area2D_B") 16 { 17 anotherTransformZ = GameObject.Find("3DCubeB").transform.position.x; 18 } 19 else 20 { 21 anotherTransformZ = switchto2da.anotherTransformA; 22 } 23 24

C#

12Dから3Dへシーン遷移するスクリプト 2public class switchto3da : MonoBehaviour 3{ 4 public static float anotherTransformD; 5 public static float anotherTransformE; 6 public static float anotherTransformF; 7 8 // Start is called before the first frame update 9 void Start() 10 { 11 12 } 13 14 // Update is called once per frame 15 void Update() 16 { 17 if (Input.GetKey(KeyCode.M)) 18 { 19 anotherTransformE = GameObject.Find("unitychan_dynamic").transform.position.y; 20 anotherTransformF = GameObject.Find("unitychan_dynamic").transform.position.z; 21 22 SceneManager.LoadScene("3DstageA"); 23 } 24 } 25} 26 27

C#

1遷移直後のスクリプト 2public class changedto3da : MonoBehaviour 3{ 4 // Start is called before the first frame update 5 void Start() 6 { 7 transform.Translate(Areatrigger.anotherTransformZ, switchto3da.anotherTransformE, switchto3da.anotherTransformF); 8 } 9 10 // Update is called once per frame 11 void Update() 12 { 13 14 } 15} 16

C#

13Dから2Dへシーン遷移するスクリプト 2public class switchto2da : MonoBehaviour 3 4 5{ 6 public static float anotherTransformA; 7 public static float anotherTransformB; 8 public static float anotherTransformC; 9 10 // Start is called before the first frame update 11 void Start() 12 { 13 14 } 15 16 // Update is called once per frame 17 void Update() 18 { 19 20 21 if (Input.GetKey(KeyCode.M)) 22 { 23 anotherTransformA = GameObject.Find("unitychan_dynamic").transform.position.x; 24 anotherTransformB = GameObject.Find("unitychan_dynamic").transform.position.y; 25 anotherTransformC = GameObject.Find("unitychan_dynamic").transform.position.z; 26 SceneManager.LoadScene("2DstageA"); 27 } 28 } 29} 30

C#

1遷移直後のスクリプト 2public class changedto2da : MonoBehaviour 3{ 4 5 // Start is called before the first frame update 6 void Start() 7 { 8 9 transform.Translate(0, switchto2da.anotherTransformB, switchto2da.anotherTransformC); 10 } 11 12 // Update is called once per frame 13 void Update() 14 { 15 16 } 17}

試したこと

AreatriggerのOnTriggerStayに問題があると思い、OnTriggerExitで座標情報をリセットさせたりしましたが上手くいきませんでした。ステージの構成上必ずArea2D_Aを通った後Area2D_Bを通るのですが、staticで定義したanotherTransformZが、Area2D_Aを通過後も該当ブロックの座標情報を取得し続けているのでしょうか?

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

Unityバージョン 2019.2.4f1

長文な上にごちゃごちゃしたコードですいません。OntriggerStayを初めて使うような初心者なもので、根本的な仕組みすら分かっていないかもしれませんが、どうかよろしくお願い致します。

*追記*
2Dの時に座標を0にしているのはz座標ではなくx座標です。
これは単純に私がz軸方向にステージを作ってしまったためです。紛らわしくてすいません。

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

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

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

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

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

sakura_hana

2019/11/08 01:41

推測ですがx座標を取得していないのではなく、常に0なのでは? 2Dでは通常(x,y)を用いてzを常時固定(0とか)にするものですが、それをうっかり(y,z)にしていてxが常に0なのではないでしょうか。
Ayber

2019/11/08 03:48

説明不足で申し訳ありません。xを常に0にしているのは、私がz軸方向にステージを作ってしまっているせいです。 3Dから2Dに遷移する際、3Dの時のプレイヤー座標を取得したうえで、2Dに遷移した直後のtransformのx座標に0を代入しています。 スクリプトを加筆しましたので、一度目を通していただければ幸いです。
sakura_hana

2019/11/08 05:09

以下のどれに当てはまるのか、Debug.Logを使うなどして確認してください。 1.AreatriggerのOnTriggerStayに入っていない 2.1には入るが「else if (other.gameObject.name == "Area2D_B")」に入っていない 3.2には入るがエラーが出る 4.2には入りエラーも無いがanotherTransformZが想定する値とは異なる(常に0など) (Area2D_Aでは上手くいくが、Area2D_BだとanotherTransformZがArea2D_Aの時から変わらないのならば、1番の可能性が高いです。当たり判定を見直してみてください)
Ayber

2019/11/08 08:15

試しにAreatriggerの処理にDebug.Logを入れてみたところ、ピクリとも反応がありませんでした...恐らく1.からつまづいているかもしれません。 Area2D_AとArea_Bは空オブジェクトにBox Collider、Is Triggerにチェックが入った状態であり、Rigidbodyは付いていません。 また、ゲーム開始時からプレイヤーとArea2D_Aは重なった状態であり、Area2D_AとArea2D_Bは正のZ軸方向に隣接して置かれています。 プレイヤーにはRigidbodyとCapsule Colliderが付いており、Is triggerは付いていません。 位置を動かしたりして試行錯誤してみます。
Ayber

2019/11/08 08:32

public void OnTriggerStay(Collision other)を public void OnTriggerStay(Collider other)にしたところ、エラー(NullReferenceException; Object reference not set to an instance of an object)を吐きながら反応するようになりました。 anotherTransformZの値も恐らく0です。 3.と4.の間あたりでしょうか...。
Ayber

2019/11/09 02:29

switchto2da側で新しくstatic変数(anotherTransformxA,xB)を作り、毎フレーム3DCubeのx座標を取得させ、2Dシーンで各Areaと重なっている間その変数を呼び出すようにしたところ、上手くいきました! 例のエラーも、シーンを再ロードしたところ吐かなくなりました。 本当にありがとうございました。
guest

回答1

0

自己解決

2dシーンの該当エリアに重なっている間の処理にて、3dシーンの中のブロックのx座標を直接呼び出すのではなく、3dシーン側であらかじめブロックのx座標をstatic変数で定義しておき、それを2dシーンで呼び出すようにしたところ上手くいきました。
ご協力ありがとうございました。

投稿2019/11/09 02:33

Ayber

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問