個人ゲームアプリ制作 -
unityによるゲーム制作

リリースアプリ一覧

unity2D


[Unity] カードゲームの手札をドラッグで場に出す方法

Unity Tutorial – Drag & Drop Tutorial を参考に少し手を加えています。


手札エリア(ハンド)にはHorizontal Layout Groupコンポーネントをadd。 Child Alignmentは基本Middle Centerに、paddingやspacingはお好みで。 HandScriptという名前のcsスクリプトを作成し、手札エリア(ハンド)のオブジェクトにアタッチする。

using UnityEngine;
using UnityEngine.EventSystems;
using System.Collections;

public class HandScript : MonoBehaviour, IDropHandler, IPointerEnterHandler, IPointerExitHandler {

	public void OnPointerEnter(PointerEventData eventData){

	}

	public void OnPointerExit(PointerEventData eventData){
		
	}

	public void OnDrop(PointerEventData eventData){
		MouseDrag d = eventData.pointerDrag.GetComponent<MouseDrag>();
		if(d != null){
			d.parentToReturnTo = this.transform;
		}
	}
}

次に、ドラッグするエリアのオブジェクトを作成し、DragZoneという名前のcsファイルを作成しアタッチ。 DragZoneオブジェクトの上に別のオブジェクトが重なっているとドラッグできないので注意。

public class DragZone : MonoBehaviour, IDropHandler, IPointerEnterHandler, IPointerExitHandler {

	public Transform DragArea;

	void Awake(){
		DragArea = GameObject.Find("DragArea").GetComponent<Transform>();
	}

	public void OnPointerEnter(PointerEventData eventData){
		
	}

	public void OnPointerExit(PointerEventData eventData){

	}

	public void OnDrop(PointerEventData eventData){		
		MouseDrag d = eventData.pointerDrag.GetComponent<MouseDrag>();
		d.parentToReturnTo = DragArea;
		d.transform.SetParent(DragArea, false);
		d.GetComponent<RectTransform>().sizeDelta = new Vector2 (70.0f, 70.0f);
	}
}



手札オブジェクトにCanvas GroupコンポーネントをAdd。いじる必要はなし。
さらにLayout ElementコンポーネントをAddし、MinWidthとMinHeightを好きな値に設定。
最後に手札(カード)オブジェクトにを作成し、MouseDragという名前のcsファイルを作成しアタッチ。


using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.SceneManagement;

public class MouseDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler{

	public Canvas canvas;
	public Transform parentToReturnTo;

	void Awake(){
		canvas = GameObject.Find("Canvas").GetComponent<Canvas>();
	}

	GameObject placeholder = null;

	public void OnBeginDrag(PointerEventData eventData){
		placeholder = new GameObject();
		placeholder.transform.SetParent(this.transform.parent);
		LayoutElement le = placeholder.AddComponent<LayoutElement>();
		le.preferredWidth = this.GetComponent<LayoutElement>().preferredWidth;
		le.preferredHeight = this.GetComponent<LayoutElement>().preferredHeight;
		le.flexibleWidth = 0;
		le.flexibleHeight = 0;

		placeholder.transform.SetSiblingIndex(this.transform.GetSiblingIndex());
		parentToReturnTo = this.transform.parent;
		this.transform.SetParent(canvas.transform, false);

		GetComponent<CanvasGroup>().blocksRaycasts = false;
	}

	public void OnDrag(PointerEventData eventData){
		this.transform.position = new Vector2(eventData.position.x, eventData.position.y + 100);

	}

	public void OnEndDrag(PointerEventData eventData){
		this.transform.SetParent(parentToReturnTo);
		this.transform.SetSiblingIndex(placeholder.transform.GetSiblingIndex());
		GetComponent<CanvasGroup>().blocksRaycasts = true;

		Destroy(placeholder);
	}
}


これで手札エリアから場へカードをドラッグする事で、カードを出すアクションができるようになる。
2017 / 04 / 22
unity2D
C#

スポンサーリンク

© 2018 Takahiro Ueda