Unity使用碰撞开发类拖拽拼图逻辑
前言
在进行之前的项目时候,有一个需求就是做一个拖拽Image组件做一个类似于拼图游戏的逻辑。由于我之前开发过一个拼图的游戏,本来想利用判断位置开发这个功能,后来我突发奇想,可不可以通过碰撞实现这个拖拽的功能。花了几天时间,我实现了这个功能,不说了,先直接上效果图:
效果图1:
效果图2:
效果图3:
开发步骤
1.创建RankColliderManager.cs脚本,使用bool值记录碰撞状态,核心代码如下所示:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Function;
public class RankColliderManager : MonoBehaviour
{
#region 参数
/// <summary>
/// 存储拖拽类
/// </summary>
public bool[] isHaveCard;
#endregion
#region 私有方法
/// <summary>
/// 碰撞检测
/// </summary>
/// <param name="other"></param>
void OnTriggerEnter2D(Collider2D other)
{
if (!isHaveCard[0])
{
if (other.gameObject.name == "frameToImage")
{
isHaveCard[0] = true;
}
}
if (!isHaveCard[1])
{
if (other.gameObject.name == "frameToImage0")
{
isHaveCard[1] = true;
}
}
if (!isHaveCard[2])
{
if (other.gameObject.name == "frameToImage1")
{
isHaveCard[2] = true;
}
}
if (!isHaveCard[3])
{
if (other.gameObject.name == "frameToImage2")
{
isHaveCard[3] = true;
}
}
if (!isHaveCard[4])
{
if (other.gameObject.name == "frameToImage3")
{
isHaveCard[4] = true;
}
}
if (!isHaveCard[5])
{
if (other.gameObject.name == "frameToImage4")
{
isHaveCard[5] = true;
}
}
if (!isHaveCard[6])
{
if (other.gameObject.name == "frameToImage5")
{
isHaveCard[6] = true;
}
}
}
/// <summary>
/// 离开检测
/// </summary>
void OnTriggerExit2D(Collider2D other)
{
if (isHaveCard[0])
{
if (other.gameObject.name == "frameToImage")
{
isHaveCard[0] = false;
}
}
if (isHaveCard[1])
{
if (other.gameObject.name == "frameToImage0")
{
isHaveCard[1] = false;
}
}
if (isHaveCard[2])
{
if (other.gameObject.name == "frameToImage1")
{
isHaveCard[2] = false;
}
}
if (isHaveCard[3])
{
if (other.gameObject.name == "frameToImage2")
{
isHaveCard[3] = false;
}
}
if (isHaveCard[4])
{
if (other.gameObject.name == "frameToImage3")
{
isHaveCard[4] = false;
}
}
if (isHaveCard[5])
{
if (other.gameObject.name == "frameToImage4")
{
isHaveCard[5] = false;
}
}
if (isHaveCard[6])
{
if (other.gameObject.name == "frameToImage5")
{
isHaveCard[6] = false;
}
}
}
#endregion
}
2.将此脚本挂载到拖拽区域物体上,添加bool数组值,添加BoxCollider2D组件,设置如图所示:
3.创建UIDragThis.cs脚本,它的功能主要是实现拖拽已经碰撞触发移动到位置效果等,核心代码如下所示:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using Function;
using PlaneManager;
namespace RankManager
{
public class UIDragThis : MonoBehaviour,IBeginDragHandler,IDragHandler,IEndDragHandler
{
#region 参数
[Header("是否精确拖拽")]
internal bool m_isPrecision;
//存储图片中心点与鼠标点的偏移量
private Vector3 m_offset;
//存储当前拖拽图片的RectTransform组件
private RectTransform m_rt;
//是否可以拖动
internal bool canMove = true;