前提・実現したいこと
下記のURLからダウンロードできるサンプルプロジェクトを参考にuGUIでのドラッグアンドドロップシステムを作成しているのですが
特定のセルにのみ特定のタイルをドロップできるようにするにはどうしたらいいでしょうか?
【追記】
サンプルプロジェクトを見ないとわからない点が多いと思うので、そちらを一度見ていただけると助かります…申し訳ありません…。
Tile.cs
using UnityEngine; using System.Collections; using System.Collections.Generic; public class Tile : MonoBehaviour { private Vector2 startingPosition; private List<Transform> touchingTiles; private Transform myParent; private AudioSource audSource; private void Awake() { startingPosition = transform.position; touchingTiles = new List<Transform>(); myParent = transform.parent; audSource = gameObject.GetComponent<AudioSource>(); } public void PickUp() { transform.localScale = new Vector3(1.1f,1.1f,1.1f); gameObject.GetComponent<SpriteRenderer>().sortingOrder = 1; } public void Drop() { transform.localScale = new Vector3(1, 1, 1); gameObject.GetComponent<SpriteRenderer>().sortingOrder = 0; Vector2 newPosition; if (touchingTiles.Count == 0) { transform.position = startingPosition; transform.parent = myParent; return; } var currentCell = touchingTiles[0]; if (touchingTiles.Count == 1) { newPosition = currentCell.position; } else { var distance = Vector2.Distance(transform.position, touchingTiles[0].position); foreach (Transform cell in touchingTiles) { if (Vector2.Distance(transform.position, cell.position) < distance) { currentCell = cell; distance = Vector2.Distance(transform.position, cell.position); } } newPosition = currentCell.position; } if (currentCell.childCount != 0) { transform.position = startingPosition; transform.parent = myParent; return; } else { transform.parent = currentCell; StartCoroutine(SlotIntoPlace(transform.position, newPosition)); } } void OnTriggerEnter2D(Collider2D other) { if (other.tag != "Cell") return; if (!touchingTiles.Contains(other.transform)) { touchingTiles.Add(other.transform); } } void OnTriggerExit2D(Collider2D other) { if (other.tag != "Cell") return; if (touchingTiles.Contains(other.transform)) { touchingTiles.Remove(other.transform); } } IEnumerator SlotIntoPlace(Vector2 startingPos, Vector2 endingPos) { float duration = 0.1f; float elapsedTime = 0; audSource.Play(); while (elapsedTime < duration) { transform.position = Vector2.Lerp(startingPos, endingPos, elapsedTime / duration); elapsedTime += Time.deltaTime; yield return new WaitForEndOfFrame(); } transform.position = endingPos; } }
InputManager.cs
using UnityEngine; using System.Collections; public class InputManager : MonoBehaviour { private bool draggingItem = false; private GameObject draggedObject; private Vector2 touchOffset; void Update() { if (HasInput) { DragOrPickUp(); } else { if (draggingItem) DropItem(); } } Vector2 CurrentTouchPosition { get { return Camera.main.ScreenToWorldPoint(Input.mousePosition); } } private void DragOrPickUp() { var inputPosition = CurrentTouchPosition; if (draggingItem) { draggedObject.transform.position = inputPosition + touchOffset; } else { var layerMask = 1 << 0; RaycastHit2D[] touches = Physics2D.RaycastAll(inputPosition, inputPosition, 0.5f, layerMask); if (touches.Length > 0) { var hit = touches[0]; if (hit.transform != null && hit.transform.tag == "Tile") { draggingItem = true; draggedObject = hit.transform.gameObject; touchOffset = (Vector2)hit.transform.position - inputPosition; hit.transform.GetComponent<Tile>().PickUp(); } } } } private bool HasInput { get { // returns true if either the mouse button is down or at least one touch is felt on the screen return Input.GetMouseButton(0); } } void DropItem() { draggingItem = false; draggedObject.transform.localScale = new Vector3(1, 1, 1); draggedObject.GetComponent<Tile>().Drop(); } }
サンプルプロジェクト
サンプルのとおりには動かせて理解できたが、改変しても期待どおり動かない、ということでしょうか。貼り付けられているコードは改変したものですか?改変したものであれば、その箇所をコード内にコメントで示す等すると回答が得られやすいのではないでしょうか。不要な箇所まで解読するのは苦労しますので。
サンプルプロジェクトでは全てのセルに全てのタイルが入れることが出来てしまうため、例えばセルAにタイルBだけしか入らないようにしたいのです。どこをどう改変していいのか分からないので、載せているコードはサンプルプロジェクトに入っているものから特に手を加えていません。恐らくSlotIntoPlaceの箇所にセルとタイルの種類を区別する記述をすればいいとは思うのですが、どう書けばいいのか分からないので…。
回答1件
あなたの回答
tips
プレビュー