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

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

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

Q&A

解決済

1回答

533閲覧

unityのドラッグアンドドロップについて

nyanryou

総合スコア20

0グッド

0クリップ

投稿2020/01/15 14:51

Unityでドラッグアンドドロップをサイトを参考にして実行しようとおもっています。ピクトさんをドラッグして、白の枠にドロップすると白の枠の中にピクトさんが設置される動作を行いたいと思ってます。しかし、ドラッグの動作はできるのですが、ドロップの動作になるとドロップすることができません。白の枠でドロップしても、最初の位置に戻るだけになります。ソースコードはどの関数がどのような動作を行っているのか、この文の意味は何なのかなど調べたのでプログラムの動作はわかったつもりではいますが完全には理解できていないと思います。

ソースコードはそのまま使用させていただいているので、ミスはないと思うのでヒエラルキーやインスペクターの部分で追加できていなかったり、ゲームオブジェクトが違うのかなと試行錯誤したのですが、やはりできませんでした。

unityについて知識不足のため、ご教授お願いします。

参考サイト:https://qiita.com/ayumegu/items/c07594f408363f73008c

Dragというオブジェクトに参考サイトや以下のDragObject.csをアタッチしてます。
DropというオブジェクトにDropObject.csをアタッチしてます。

イメージ説明

DragObject

1using UnityEngine; 2using UnityEngine.UI; 3using UnityEngine.EventSystems; 4 5[RequireComponent(typeof(Image))] 6public class DragObject : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler 7{ 8 private Transform canvasTran; 9 private GameObject draggingObject; 10 11 void Awake() 12 { 13 canvasTran = transform.parent.parent; 14 } 15 16 public void OnBeginDrag(PointerEventData pointerEventData) 17 { 18 CreateDragObject(); 19 draggingObject.transform.position = pointerEventData.position; 20 } 21 22 public void OnDrag(PointerEventData pointerEventData) 23 { 24 draggingObject.transform.position = pointerEventData.position; 25 } 26 27 public void OnEndDrag(PointerEventData pointerEventData) 28 { 29 gameObject.GetComponent<Image>().color = Vector4.one; 30 Destroy(draggingObject); 31 } 32 33 // ドラッグオブジェクト作成 34 private void CreateDragObject() 35 { 36 draggingObject = new GameObject("Dragging Object"); 37 draggingObject.transform.SetParent(canvasTran); 38 draggingObject.transform.SetAsLastSibling(); 39 draggingObject.transform.localScale = Vector3.one; 40 41 // レイキャストがブロックされないように 42 CanvasGroup canvasGroup = draggingObject.AddComponent<CanvasGroup>(); 43 canvasGroup.blocksRaycasts = false; 44 45 Image draggingImage = draggingObject.AddComponent<Image>(); 46 Image sourceImage = GetComponent<Image>(); 47 48 draggingImage.sprite = sourceImage.sprite; 49 draggingImage.rectTransform.sizeDelta = sourceImage.rectTransform.sizeDelta; 50 draggingImage.color = sourceImage.color; 51 draggingImage.material = sourceImage.material; 52 53 gameObject.GetComponent<Image>().color = Vector4.one * 0.6f; 54 } 55}

DropObject

1using UnityEngine; 2using UnityEngine.UI; 3using UnityEngine.EventSystems; 4 5public class DropObject : MonoBehaviour, IDropHandler, IPointerEnterHandler, IPointerExitHandler 6{ 7 public Image iconImage; 8 private Sprite nowSprite; 9 10 void Start() 11 { 12 nowSprite = null; 13 } 14 15 public void OnPointerEnter(PointerEventData pointerEventData) 16 { 17 if(pointerEventData.pointerDrag == null) return; 18 Image droppedImage = pointerEventData.pointerDrag.GetComponent<Image>(); 19 iconImage.sprite = droppedImage.sprite; 20 iconImage.color = Vector4.one * 0.6f; 21 } 22 23 public void OnPointerExit(PointerEventData pointerEventData) 24 { 25 if(pointerEventData.pointerDrag == null) return; 26 iconImage.sprite = nowSprite; 27 if(nowSprite == null) 28 iconImage.color = Vector4.zero; 29 else 30 iconImage.color = Vector4.one; 31 } 32 public void OnDrop(PointerEventData pointerEventData) 33 { 34 Image droppedImage = pointerEventData.pointerDrag.GetComponent<Image>(); 35 iconImage.sprite = droppedImage.sprite; 36 nowSprite = droppedImage.sprite; 37 iconImage.color = Vector4.one; 38 } 39}

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

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

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

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

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

guest

回答1

0

ベストアンサー

DropObjecticonImageにはインスペクター上で何かImageをセットしていますかね(ヒエラルキーを見るかぎり該当するものがなさそうに見えるのですが...)?

「コンソール」ビューを表示した状態で実行すると何かメッセージが表示されないでしょうか。もしここが「None (Image)」のままなら、ピクトさんを枠内に入れようとしても画像セット先のImageが存在しないのでNullReferenceException: Object reference not set to an instance of an objectなどと言われるんじゃないかと思います。

その場合、たとえばDropオブジェクトの子としてもう一つImageを作りDropオブジェクトの中心に配置し、色は完全透明とでもして、サイズはピクトさんと同サイズにして、これをDropの「Icon Image」にセットしてみてはいかがでしょうか。

投稿2020/01/15 22:58

Bongo

総合スコア10807

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

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

nyanryou

2020/01/17 00:57

iconImageの部分にアタッチし、実行してみるとドラッグアンドドロップできました!ソースコードを確認してみると結構こんな感じだろうという思い込みで理解してたところがありました。 結構悩んでいたので助かりました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問