ドラッグ移動がうまくいかない

実現したいこと

ここに実現したいことを箇条書きで書いてください。

前提

プログラミング初心者です。
Unityで、マウスポインタの座標を元にドラッグで四角形を作成し、
その作成した四角形をドラッグすれば動かせるというようなプログラムを作っています。

生成した四角形にBoxCollider2DとObjectClicked(オブジェクトをドラッグ移動させることができるスクリプト。別サイトからコピペしてきました。)をアタッチし、panelには四角形を描画できるスクリプト(DrawingManager)をアタッチしてます。

特にエラーは起きてないのですが、四角形を生成した時点でシーンビューに謎の薄い黒い丸がpanelの座標(0, 0)地点に固定で現れ、ゲームビューの方でその四角形をドラッグしてみると、黒い丸がマウスポインタに勝手に移動し、ポインタと四角形がずれた状態でドラッグ移動するようになっています(シーンビューの黒い丸と四角形の位置は連動して動くようになってます)。

sprites等他のgameObjectではドラッグ中にオブジェクトとポインタの位置がずれるなんてことは起きないのでなぜこんなことが起きてしまうのかが分かりません。調べても解決法もわからないので教えていただければと思います。

該当のソースコード(DrawingManager)

C#

1ソースコード 2using System.Collections.Generic;3using UnityEngine;4using UnityEngine.EventSystems;5 6public class DrawingManager : MonoBehaviour, IDragHandler, IBeginDragHandler, IPointerUpHandler, IPointerClickHandler 7{8 public static bool isDrawing = false;9 public static bool isDragging = false;10 11 private Vector3 startPoint;12 private Vector3 endPoint;13 private LineRenderer lineRenderer;14 private List<GameObject> rectangles = new List<GameObject>();15 public RectTransform canvasRectTransform; // CanvasのRectTransformをInspectorから設定16 public Camera mainCamera; // メインカメラをInspectorから設定17 18 private GameObject currentRectangle;19 20 21 void Update()22 {23 if (lineRenderer != null && isDrawing)24 {25 Vector3 mouse = Input.mousePosition;26 Vector3 mousePos = ScreenToWorldPoint(mouse);27 Vector3[] positions = new Vector3[]28 {29 new Vector3(startPoint.x, startPoint.y, 0),30 new Vector3(mousePos.x, startPoint.y, 0),31 new Vector3(mousePos.x, mousePos.y, 0),32 new Vector3(startPoint.x, mousePos.y, 0),33 new Vector3(startPoint.x, startPoint.y, 0)34 };35 36 lineRenderer.SetPositions(positions);37 }38 }39 40 public void OnPointerClick(PointerEventData eventData)41 {42 isDragging = false;43 isDrawing = false;44 }45 46 public void OnPointerUp(PointerEventData eventData)47 {48 if (isDrawing && isDragging)49 {50 isDrawing = false;51 isDragging = false;52 RectangleData();53 UpdateCollider(lineRenderer.gameObject);54 }55 else56 {57 isDrawing = false;58 }59 currentRectangle = null;60 }61 62 public void OnBeginDrag(PointerEventData eventData)63 {64 if (Input.GetMouseButton(0) && !isDrawing)65 {66 startPoint = ScreenToWorldPoint(eventData.position);67 if (currentRectangle == null)68 {69 isDrawing = true;70 isDragging = false;71 InitializedLineRenderer();72 }73 else74 {75 isDragging = true;76 }77 }78 }79 80 public void OnDrag(PointerEventData eventData)81 {82 if (isDrawing)83 {84 isDragging = true;85 endPoint = ScreenToWorldPoint(eventData.position);86 87 Vector3[] rectPositions = new Vector3[]88 {89 new Vector3(startPoint.x, startPoint.y, 0),90 new Vector3(endPoint.x, startPoint.y, 0),91 new Vector3(endPoint.x, endPoint.y, 0),92 new Vector3(startPoint.x, endPoint.y, 0),93 new Vector3(startPoint.x, startPoint.y, 0)94 };95 lineRenderer.SetPositions(rectPositions);96 }97 }98 99 private Vector3 ScreenToWorldPoint(Vector3 screenPoint)100 {101 Vector3 worldPoint;102 RectTransformUtility.ScreenPointToWorldPointInRectangle(canvasRectTransform, screenPoint, mainCamera, out worldPoint);103 return worldPoint;104 }105 106 private void RectangleData()107 {108 GameObject rectObj = lineRenderer.gameObject;109 rectangles.Add(rectObj);110 }111 112 private void InitializedLineRenderer()113 {114 GameObject rectangleObject = new GameObject("Rectangle");115 lineRenderer = rectangleObject.AddComponent<LineRenderer>();116 lineRenderer.positionCount = 5;117 lineRenderer.useWorldSpace = false;118 119 lineRenderer.material = new Material(Shader.Find("Sprites/Default"));120 lineRenderer.startWidth = 0.05f;121 lineRenderer.endWidth = 0.05f;122 lineRenderer.startColor = Color.black;123 lineRenderer.endColor = Color.black;124 QualitySettings.antiAliasing = 8;125 126 rectangleObject.transform.SetParent(canvasRectTransform.transform); // Canvas内に配置127 rectangleObject.AddComponent<BoxCollider2D>(); // BoxCollider2Dを追加128 129 rectangleObject.AddComponent<ObjectClicked>();130 131 currentRectangle = rectangleObject;132 }133 134 private void UpdateCollider(GameObject rectangleObject)135 {136 float width = Mathf.Abs(endPoint.x - startPoint.x);137 float height = Mathf.Abs(endPoint.y - startPoint.y);138 139 BoxCollider2D boxCollider = rectangleObject.GetComponent<BoxCollider2D>();140 if (boxCollider != null)141 {142 // コライダーのサイズを矩形のサイズに設定143 boxCollider.size = new Vector2(width, height);144 // コライダーの位置を矩形の中心に設定145 Vector2 center = new Vector2((startPoint.x + endPoint.x) / 2, (startPoint.y + endPoint.y) / 2);146 boxCollider.offset = center - (Vector2)rectangleObject.transform.position;147 148 boxCollider.isTrigger = true; // トリガーとして設定149 }150 }151}

該当のソースコード(ObjectClicked)

C#

1ソースコード 2using Unity.VisualScripting;3using UnityEngine;4using UnityEngine.EventSystems;5 6public class ObjectClicked : MonoBehaviour, IPointerClickHandler, IDragHandler 7{8 public void OnPointerClick(PointerEventData eventData)9 {10 Debug.Log($"{name}オブジェクトがクリックされました");11 DrawingManager.isDragging = false;12 DrawingManager.isDrawing = false;13 }14 15 public void OnDrag(PointerEventData eventData)16 {17 DrawingManager.isDragging = false;18 DrawingManager.isDrawing = false;19 20 // マウスカーソルのスクリーン座標を取得21 Vector3 objectScreenPoint = Input.mousePosition;22 // スクリーン座標をワールド座標に変換23 Vector3 objectWorldPoint = Camera.main.ScreenToWorldPoint(objectScreenPoint);24 objectWorldPoint.z = 0f; // Z座標を0に固定25 26 // オブジェクトの座標を更新27 this.transform.position = objectWorldPoint;28 }29}30

試したこと

・四角形以外のオブジェクトにBoxCollider2DとObjectClilckedのスクリプトをアタッチしてみると問題なく動作(ドラッグしたときにオブジェクトとマウスポインタのずれが無い)した。

・Colliderを消したりDrawingManagerのスクリプトの一部をコメントアウトしてみたり色々検証してみた。

初心者なので拙い質問で申し訳ないのですが、良ければお力添えよろしくお願いします。

コメントを投稿

0 コメント