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

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

詳細はこちら
C#

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

Unity

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

Q&A

解決済

1回答

2488閲覧

Unityでドラッグ位置が反転してしまう

kanata_02

総合スコア25

C#

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

Unity

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

0グッド

0クリップ

投稿2019/11/07 13:22

現在Unityでマルチディスプレイを想定した対戦カードゲームを製作しています。
カードはSpriteを用いてPrefab化することで実装しています。

Player1の視点
Player2の視点

1枚目がPlayer1の視点、2枚目がPlayer2の視点で、Player2の画面では自機を手前に表示させたいためカメラの上下を反転させています。
ただこのカメラを反転しているせいか、カードをマウスのドラッグで移動させる際にDisPlay1では正常に動くのですが、Display2ではクリック位置が反転して、反転した位置にあるカードをクリックしてしまいます。これはどのようにしたら改善できますでしょうか?
OnWillRenderObjectを利用して特定のカメラに写っている時はPointerEventDataのpositionを反転させたり、カードがどちらの手札にあるか判定して移動処理を分けたりと試みましたが上手くいきませんでした…。
以下にコードを記載させていただきます。何かアドバイスいただけますと幸いです。

↓ドラッグ移動部分のみのコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.EventSystems; 5 6public class CardMovement : MonoBehaviour, IDragHandler 7{ 8 public void OnDrag(PointerEventData data) 9 { 10 Vector3 TargetPos = Camera.main.ScreenToWorldPoint(data.position); 11 TargetPos.z = 0; 12 transform.position = TargetPos; 13 } 14} 15

↓OnWillRenderObjectなどを使用してみたコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.EventSystems; 5 6public class CardMovement : MonoBehaviour, IDragHandler 7{ 8 private GameObject cameraObj; 9 private GameObject cameraObj2; 10 private Camera camera; 11 private Camera camera2; 12 13 private bool _isPlayerCard; 14 15 //メインカメラに付いているタグ名 16 private const string MAIN_CAMERA_TAG_NAME = "MainCamera"; 17 18 //カメラに表示されているか 19 private bool _isRendered = false; 20 21 22 23 void Start() 24 { 25 cameraObj = GameObject.Find("MainCamera"); 26 cameraObj2 = GameObject.Find("MainCamera2"); 27 gameManager = GameManagerObj.GetComponent<GameManager>(); 28 camera = cameraObj.GetComponent<Camera>(); 29 camera2 = cameraObj2.GetComponent<Camera>(); 30 } 31 32 void Update() 33 { 34 35 _isRendered = false; 36 } 37 38 public void OnDrag(PointerEventData data) 39 { 40 Vector3 TargetPos; 41 42 43 if (_isRendered) 44 { 45 TargetPos = camera.ScreenToWorldPoint(data.position); 46 } 47 else 48 { 49 TargetPos = camera.ScreenToWorldPoint(data.position); 50 } 51 Debug.Log(data.position); 52 Debug.Log(TargetPos); 53 TargetPos.z = 0; 54 transform.position = TargetPos; 55 } 56 57 private void OnWillRenderObject() 58 { 59 //メインカメラに映った時だけ_isRenderedを有効に 60 if (Camera.current.tag == MAIN_CAMERA_TAG_NAME) 61 { 62 _isRendered = true; 63 } 64 } 65} 66

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

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

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

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

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

sakura_hana

2019/11/08 01:35

ドラッグ移動部分のみのコードに「Player2の場合は」という条件分岐加えて、 「TargetPos.x *= -1;」(zもかも?)してから「transform.position = TargetPos;」とかで直ったりしませんか? (クリック取得時は反転した位置を取り、その後座標を計算してから反映する作戦です)
kanata_02

2019/11/08 03:27

返信ありがとうございます。 すみません、その「Player2の場合は」という判定の取り方がわからなくて… OnWillRenderObjectで「Player2のカメラに写っていたら」という風に取ろうとしたのですが、両方の画面を開いている時に判定が取れませんでした…
kanata_02

2019/11/08 04:05

記述し忘れていたのですが、Player1とPlayer2は同時にカードを動かせる仕様になっています。
sakura_hana

2019/11/08 04:50

Player2だとカメラの上下を反転させているそうですが、それはどうやっているのですか?
kanata_02

2019/11/08 05:15

player1、player2でそれぞれ別のカメラを作って、player2のカメラのrotationを180度回転させています。
sakura_hana

2019/11/08 07:30

「Main Camera」がタグが付いているオブジェクト(カメラ)がシーン上に2つ存在してませんか? Player1用のカメラに「Main Camera」タグ付与、Player2用のカメラにはこのタグを付与しない、 とすればCamera.mainはPlayer1の方のカメラを指すので、コードはそのままで正常動作するかもです。
kanata_02

2019/11/08 07:57

試してみたところ、タグを外しても両方のカメラを取得してしまうようでした。 また、 cameraObj = GameObject.Find("MainCamera"); camera = cameraObj.GetComponent<Camera>(); Vector3 TargetPos = camera.ScreenToWorldPoint(data.position); とも書いてみましたが、結果は同じでした。 片方のカメラだけ取得することは不可能なのでしょうか…
kanata_02

2019/11/08 08:25

すみません、Rayを外したところ上記した動作不良は治りました。 Player1のカメラだけで座標を取得しようとしたところ、Player1の画面では正常に動作し、Player2の画面では動作しなくなってしまいました。
guest

回答1

0

自己解決

PUNを導入することによって解決いたしました。
アドバイスをくださったsakura_hana様、ありがとうございました。

投稿2019/11/10 06:04

kanata_02

総合スコア25

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問