搭建UI
运行后
可以随意地进行拖拽,变化物品的位置
具体实现:
商店(左图)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class Shop : MonoBehaviour
{
public GameObject btnPrefab;//商城物体预设体
public Transform packageTF;//背包父物体
//public Transform shopTF;//商城物品父物体
public GameObject itemPrefab;//背包物品的预设体
public static Shop Instance;
private void Awake()
{
Instance = this;
}
void Start()
{
Singleton s = Singleton.Instance;
Singleton s1 = Singleton.Instance;
for (int i = 0; i < 26; i++)
{
Sprite sp = Resources.Load<Sprite>(i.ToString());//加载资源
//创建商城物品
GameObject btn = Instantiate<GameObject>(btnPrefab);
btn.transform.SetParent(transform, false);
btn.GetComponent<Image>().sprite = sp;
int temp = i;
btn.GetComponent<Button>().onClick.AddListener(() => {
btnClick(sp);
//btnClick1(temp);
});
}
}
void btnClick1(int index){
Debug.Log(index);
// SceneManager.LoadScene(index);
}
void btnClick(Sprite sp){
//遍历背包上面所有的子物体 -- cell
for (int i = 0; i < packageTF.childCount; i++)
{
//拿到每个cell
Transform cell = packageTF.GetChild(i);
//判断cell上是否有子物体
if (cell.childCount > 0)
{
//说明现在cell上有子物体
//判断该cell上的物品跟所选物品是否重复
if (cell.GetChild(0).GetComponent<Image>().sprite.name == sp.name)
{
//说明所选物品重复
Text numberText = cell.GetChild(0).GetComponentInChildren<Text>();
if (numberText.text == string.Empty)
{
numberText.text = "1";
}
int count = int.Parse(numberText.text);
count++;
numberText.text = count.ToString();
return;
}
}
}
//如果代码能达到此地 说明--所选物品没有购买过
//在空格子处生成新物品
for (int i = 0; i < packageTF.childCount; i++)
{
//拿到每个cell
Transform cell = packageTF.GetChild(i);
if (cell.childCount == 0)
{
//创建游戏道具 到当前的cell上
GameObject item = Instantiate<GameObject>(itemPrefab);
item.transform.SetParent(cell.transform, false);
item.transform.localPosition = Vector2.zero;
item.GetComponent<Image>().sprite = sp;
//把text打开
item.transform.GetChild(0).gameObject.SetActive(true);
return;
}
}
}
}
预设体:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class Package : MonoBehaviour,IBeginDragHandler,IDragHandler,IEndDragHandler
{
//拖拽物品时的物体
Transform dragParent;
//开始拖拽前的父物体
Transform originalParent;
private void Start()
{
dragParent = transform.root;
}
public void OnBeginDrag(PointerEventData eventData)
{
originalParent = transform.parent;//记录开始前父物体
transform.SetParent(dragParent,true);//设置拖拽中的父物体
transform.GetComponent<CanvasGroup>().blocksRaycasts = false;
}
public void OnDrag(PointerEventData eventData)
{
//鼠标拖拽时 鼠标的位置=item的位置
transform.position = eventData.position;
}
public void OnEndDrag(PointerEventData eventData)
{
if (eventData.pointerEnter == null || eventData.pointerEnter.name == "Panel" || eventData.pointerEnter.name == "package")
{
//拖拽结束 回到原位置
transform.SetParent(originalParent);
transform.localPosition = Vector2.zero;
transform.GetComponent<CanvasGroup>().blocksRaycasts = true;
return;
}
switch (eventData.pointerEnter.tag)
{
case "Cell":
transform.SetParent(eventData.pointerEnter.transform);
transform.localPosition = Vector2.zero;
break;
case "Item":
Transform currentItemParent = eventData.pointerEnter.transform.parent;
eventData.pointerEnter.transform.SetParent(originalParent);
transform.SetParent(currentItemParent);
transform.localPosition = Vector2.zero;
eventData.pointerEnter.transform.localPosition = Vector2.zero;
break;
default:
break;
}
transform.GetComponent<CanvasGroup>().blocksRaycasts = true;
}
}