最近有一个拖拽ui到另外的目标ui上,给模型换颜色的需求,网上找了些方法,不是完全适用,自己加了些改动;直接上代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class DragOnPic : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler
{
public static DragOnPic _instance;
//创建一个Gameobject作为拖拽时被拖拽对象的代替品
private GameObject drag_icon;
//该物体是否可以进行拖拽
public bool isCanDrug ;
//匹配信息
public string matching;
public GameObject _cube;
public string _name;
private void Awake()
{
_instance = this;
}
private void Start()
{
_cube = GameObject.Find("Cube");
}
/// <summary>
/// 拖拽图片初始
/// </summary>
/// <param name="eventData"></param>
///
public void OnBeginDrag(PointerEventData eventData)
{
if (!isCanDrug) return;
//代替品实例化
drag_icon = new GameObject(_name);
Drop._instance._dragName = drag_icon.name;
print("_dragName000:" + Drop._instance._dragName);
// drag_icon = this.gameObject;
drag_icon.transform.SetParent(GameObject.Find("Canvas").transform, false);
drag_icon.AddComponent<RectTransform>();
var img = drag_icon.AddComponent<Image>();
img.sprite = this.GetComponent<Image>().sprite;
//防止拖拽结束时,代替品挡住了准备覆盖的对象而使得 OnDrop() 无效
CanvasGroup group = drag_icon.AddComponent<CanvasGroup>();
group.blocksRaycasts = false;
}
/// <summary>
/// 拖拽时为新生成的拖拽图片进行位置更新
/// </summary>
/// <param name="eventData"></param>
public void OnDrag(PointerEventData eventData)
{
if (!isCanDrug) return;
//并将拖拽时的坐标给予被拖拽对象的代替品
Vector3 pos;
if (RectTransformUtility.ScreenPointToWorldPointInRectangle(drag_icon.GetComponent<RectTransform>(), eventData.position, eventData.pressEventCamera, out pos))
{
drag_icon.transform.position = pos;
}
}
/// <summary>
/// 拖拽结束
/// </summary>
/// <param name="eventData"></param>
public void OnEndDrag(PointerEventData eventData)
{
//拖拽结束,销毁代替
if (drag_icon)
{
Destroy(drag_icon);
}
}
}
这个放在要拖动的ui 上,相当于生成一个相同的UI
下面这段代码放在要拖向的目标ui,里面有一个字符串配对,只有配对上才可以触发事件,
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class Drop : MonoBehaviour,IDropHandler
{
public static Drop _instance;
public string matching;
public string _dragName;
// Start is called before the first frame update
void Start()
{
_instance = this;
}
/// <summary>
/// 拖拽到当前图片上ss
/// </summary>
/// <param name="eventData"></param>
public void OnDrop(PointerEventData eventData)
{
//根据代替品的信息,改变当前对象的Sprite。
var obj = eventData.pointerDrag;
DragOnPic drag = obj.GetComponent<DragOnPic>();
//检测拖拽物品是否是可拖拽的
if (drag != null)
{
if (!drag.isCanDrug)
{
return;
}
}
//信息匹配
if (IsSameMessage(drag))
{
Debug.Log("信息匹配成功");
print("drag_icon.name:" + _dragName);
if (_dragName == "icon")
{
DragOnPic._instance._cube.GetComponent<MeshRenderer>().material.color = Color.black;
}
else if (_dragName == "icon1")
{
DragOnPic._instance._cube.GetComponent<MeshRenderer>().material.color = Color.blue;
}
else
{
DragOnPic._instance._cube.GetComponent<MeshRenderer>().material.color = Color.red;
}
}
else
{
Debug.Log("信息匹配失败");
return;
}
// this.GetComponent<Image>().sprite = obj.GetComponent<Image>().sprite;
}
/// <summary>
/// 信息匹配
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
bool IsSameMessage(DragOnPic message)
{
if (message.matching == matching)
return true;
else
return false;
}
}