Unity2017でGameObjectAとGameObjectBをImageで作成してAをBにドラッグ&ドロップしてアクションを発生させるアプリを作成しています。仕様の関係上Canvasの「Render Mode」をScreen Space-Cameraに設定しています。Screen Space-Cameraに設定してあるのでスクリーン座標からワールド座標に変換する必要があり、そのコードも記述しました。質問は2つあります。
1つめ)
OnDrag内の記述で座標変換のコードを入れたところ実際にドラッグするとすんなり動かずカクカクした動きになります。こちらを直す方法はありませんか?
2つめ)
OnDrop内の記述にも座標変換のコードを入れたのですがどうも記述に問題があるのかDropの反応をしません。CanvasをScreen Space-Overlayに設定してテストしたところ問題なく正しい挙動(ドラッグ&ドロップ)になるので座標変換の記述に問題があることは確かです。(=座標があわないためドロップしない)コードのおかしい部分分かる方ご指摘お願いします。
環境)
Unity2017
言語:C#
using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; // Imageコンポーネントを必要とする [RequireComponent ( typeof ( Image ) )] // ドラッグとドロップに関するインターフェースを実装する public class DragAndDrop : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler, IDropHandler { private RectTransform rectTransform; private void Awake(){ rectTransform = GetComponent<RectTransform>(); } // ドラッグ前の位置 private Vector2 prevPos; public void OnBeginDrag ( PointerEventData eventData ) { // ドラッグ前の位置を記憶しておく prevPos = transform.position; Debug.Log("OnBeginDrag"); } public void OnDrag ( PointerEventData eventData ) { // ドラッグ中は位置を更新する Vector2 localPosition = GetLocalPosition(eventData.position); rectTransform.localPosition = localPosition; Debug.Log("OnDrag"); } public void OnEndDrag ( PointerEventData eventData ) { // ドラッグ前の位置に戻す transform.position = prevPos; Debug.Log("OnEndDrag"); } public void OnDrop ( PointerEventData eventData ) { Debug.Log("OnDrop"); var raycastResults = new List<RaycastResult>(); EventSystem.current.RaycastAll ( eventData, raycastResults ); foreach ( var hit in raycastResults ) { // もし DroppableField の上なら、その位置に固定する if ( hit.gameObject.CompareTag ( "DroppableField" ) ){ Vector2 localPosition = GetLocalPosition(eventData.position); rectTransform.localPosition = localPosition; this.enabled = false; } } } //スクリーン座標をワールド座標に変換するメソッド private Vector2 GetLocalPosition(Vector2 screenPosition){ Vector2 result = Vector2.zero; RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, screenPosition, Camera.main, out result); return result; } }

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/08 21:07