実現したいこと
画面下半分にbuttonを大量に並べて、そのbuttonからドラッグを始めて、画面上部のimageの上で指を離すことで、buttonに設定されてあるスクリプトの変数をimageに設定されてあるスクリプトに渡したいです。imageに直接でなく、ゲームマネージャーを仲介する方法だとありがたいです。
bottunの位置をドラッグで移動させる必要はありません。
発生している問題・分からないこと
いろいろと調べたのですが、なかなか適した方法が分からず困っています。
独学でプログラミングを学び始めたばかりで分からないことが多く申し訳ないのですが、どなたか解決に向けてお力を貸していただけないでしょうか。
ボタンはスクロールビューに配置していて、スクロールビューには縦にスワイプした時、横にスクロールしないようにプログラムしてあります。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; public class FoodListController : ScrollRect { private bool moveChack = false; // Scroll Viewでマウスボタン押下時 public override void OnInitializePotentialDrag(PointerEventData eventData) { base.OnInitializePotentialDrag(eventData); } // マウスボタン押下中に初めてマウスを動かしたとき public override void OnBeginDrag(PointerEventData eventData) { base.OnBeginDrag(eventData); if(Mathf.Abs(eventData.delta.x)<Mathf.Abs(eventData.delta.y)) { moveChack = false; return; } moveChack = true; } // マウスボタン押下中にマウスを動かしている間 public override void OnDrag(PointerEventData eventData) { if (moveChack) { base.OnDrag(eventData); } } // マウスボタンを離したとき public override void OnEndDrag(PointerEventData eventData) { base.OnEndDrag(eventData); } }
buttonについているItemSourceDataクラスのitemSourceDataと、画面上半分に設置したimageについているRoomCharaDataクラスのroomCharaDataをゲームコントローラーのFoodJudge_メソッドに渡したいです。
button↓
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; public class ItemButton : MonoBehaviour ,IBeginDragHandler,IDragHandler IEndDragHandler { public ItemSourceData itemSourceData; public void Awake() { this.gameObject.GetComponent<Image>().sprite = itemSourceData.sprite; } public void OnClick() { Debug.Log("ボタンが押された"); } public void OnBeginDrag(PointerEventData eventData) { GetComponent<Image>().raycastTarget = false; Debug.Log("ドラッグ開始"); } public void OnEndDrag(PointerEventData eventData) { GetComponent<Image>().raycastTarget = true; Debug.Log("ドラッグ終わり"); } }
image↓
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; public class FoodDrop : MonoBehaviour,IDropHandler { public GameObject gameController; public void OnDrop(PointerEventData eventData) { if (eventData.pointerDrag != null) { ItemSourceData itemSourceData= eventData.pointerDrag.gameObject.GetComponent<ItemButton>().itemSourceData; RoomCharaData roomCharaData = gameController.GetComponent<FoodJudge>().roomCharaData; gameController.GetComponent<FoodJudge>().FoodJudge_(roomCharaData, itemSourceData); } } }
ゲームコントローラー↓
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using TMPro; using DG.Tweening; public class FoodJudge : MonoBehaviour { public Image PlayerIllust; public RoomCharaData roomCharaData; private void Awake() { CharaChange(roomCharaData.WELCOME_SPRITE); } public void CharaChange(Sprite welcome) { PlayerIllust.GetComponent<Image>().sprite = welcome; } public void FoodJudge_(RoomCharaData roomCharaData, ItemSourceData itemSourceData) { Debug.Log(roomCharaData + " " + itemSourceData); }
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
buttonにIDragHandlerが継承されていないのでOnBeginDrag呼び出されないのだと思いますが、継承するとスクロールビューが全く動かなくなってしまいました。Rayを使う方法が1番適していると思うのですが、いまいち仕組みが理解できません。
補足
特になし
回答2件
あなたの回答
tips
プレビュー