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

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

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

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

Unity

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

Q&A

2回答

1002閲覧

Unity 2Dでドラッグアンドドロップができなくなる

mldo

総合スコア5

C#

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

Unity

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

0グッド

0クリップ

投稿2022/07/19 08:54

前提

https://sunagitsune.com/unitydragobjecttobox/
こちらのスクリプトを参考にして、ゲーム内でドラッグアンドドロップを導入しています。
枠の中に納まった後に、もう一度動かしなおすことができなくなることがあります。
**

実現したいこと

常に動かしたいオブジェクトの当たり判定が枠の当たり判定より上にくるようにしたい。

該当のソースコード

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Draggg : MonoBehaviour 6{ 7 8 public static bool boxFlag; 9 public int count; 10 private float constantZ; 11 public bool beforestart; 12 public bool colsize; 13 public BoxCollider2D boxcol; 14 public bool Collision; 15 public bool notCollision; 16 private Vector2 prePosition; 17 void Start() 18 { 19 beforestart = true; 20 constantZ = transform.position.z; 21 boxcol = GetComponent<BoxCollider2D>(); 22 prePosition = transform.position; 23 Collision = false; 24 notCollision = true; 25 count = 0; 26 } 27 void Update() 28 { 29 if (colsize) 30 { 31 boxcol.size = new Vector2(0.030f, 1.0f); 32 } 33 } 34 // Start is called before the first frame update 35 void OnMouseDrag() 36 37 { 38 39 40 if (beforestart) 41 { 42 boxFlag = true; 43 Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition); 44 mousePos.z = constantZ; 45 transform.position = mousePos; 46 transform.SetSiblingIndex(99); 47 } 48 } 49 50 // Update is called once per frame 51 void OnMouseUp() 52 { 53 if (beforestart) 54 { 55 if (Collision) 56 { 57 boxFlag = false; 58 this.transform.SetSiblingIndex(0); 59 } 60 if (notCollision) 61 { 62 transform.position = prePosition; 63 } 64 } 65 } 66 67 68}

試したこと

収める枠のBoxCollider2Dの範囲を小さくしてみると、
範囲の中をドラッグしてもオブジェクトを動かせない、枠の範囲外かつオブジェクトのBoxCollider2Dの範囲をドラッグすると動かすことができたのでBoxCollider2Dの当たり判定が、動かしたいオブジェクトより枠の当たり判定が上に来てしまっていることが原因のようです。

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

unity 2021.3.5f1

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

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

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

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

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

guest

回答2

0

参考にしているサイトのボックスの方の処理の、OnTriggerStay2Dの中に

      //吸い込む(位置を合わせる) other.transform.position = this.transform.position;

ってのがあるので、これでother(ここではDragggになる筈)のワールドポジションがボックスと同じになります。
だからZ座標も同じになるので、Colliderがどっちが手前に来るかが不定になる気がします。
(対策としてSetSiblingIndexしてるんだと思うのですが、なんか効いてる気がしないです)
実験ちゃんと出来てないんでいい加減なこと書いてる可能性もありますが、一度ボックス側の処理でZ座標は省いて吸い込ませる、ってやってみては?

投稿2022/07/29 06:57

drednote

総合スコア336

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

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

mldo

2022/07/30 09:03

Vector3 pos = this.transform.position; //吸い込む(位置を合わせる) pos.z = 100; other.transform.position = pos; Boxの方のスクリプトをこのように変えてみたのですが、うまくいきません。問題点があればご指摘いただけると幸いです。
drednote

2022/07/31 12:14 編集

見間違いました。前のコメント削除 100というのはBox側より手前にある、と確定しているZ座標ですか? Draggg側でconstantZに値入れてるんだし、Box側にこの値渡してこの値使って貰うわけにはいかないんでしょうか?
guest

0

重なりの問題であれば、納める枠と納める対象を別キャンバスに分け、納める対象のキャンバスのソートオーダーの数値を納める枠のキャンバスよりも大きくして常に手前に来るようにしてみてはいかがでしょうか。
参考記事
https://gametukurikata.com/ui/changethedisplayorder

投稿2022/07/21 01:56

Y0241-N

総合スコア1066

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

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

mldo

2022/07/22 05:29

枠も対象もUIではなくSpriteなんですよね。 spriteのorder in layerは変えているんですが解決せず、、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問