先上效果图:
1.在Unity场景下创建一个Canvas,命名为HandCardCanvas,并在HandCardCanvas创建一个空节点Cards。
设置HandCardCanvas->renderMode属性为RenderMode.ScreenSpaceOverlay。
2.创建Cards脚本,绑定至Cards节点下,代码如下:
public class Cards : MonoBehaviour
{
[SerializeField]
private GameObject cardPrefabs;
private RectTransform rectTransform;
private Vector2 selBeginPosition = Vector2.zero;
private Vector2 selEndPosition = Vector2.zero;
private HandActionState selectHandCardActionState = HandActionState.SELECT_HAND_CARD_START;
List<CardInfo> cardsList = new List<CardInfo>();
public enum HandActionState
{
/// <summary>
/// 选择手牌牌开始
/// </summary>
SELECT_HAND_CARD_START,
/// <summary>
/// 准备好选择的手牌
/// </summary>
SELECT_HAND_CARD_READY_CLICK,
/// <summary>
/// 选择手牌结束
/// </summary>
SELECT_HAND_CARD_END,
}
private void Start()
{
this.rectTransform = this.gameObject.GetComponent<RectTransform>();
for (int i = 0; i < 17; i++)
{
GameObject cardGameObject = Instantiate(cardPrefabs);
cardGameObject.transform.SetParent(this.transform);
float x = i * 60 - (17 * 60) / 2f;
cardGameObject.transform.localPosition = new Vector2(x, -209);
CardInfo cardInfo = new CardInfo();
cardInfo.CardGameObject = cardGameObject;
cardInfo.ReadyState = false;
this.cardsList.Add(cardInfo);
}
}
void Update()
{
switch (selectHandCardActionState)
{
case HandActionState.SELECT_HAND_CARD_START:
{
if (Input.GetMouseButtonDown(0))
{
RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, Input.mousePosition, null, out selBeginPosition);
this.selectHandCardActionState = HandActionState.SELECT_HAND_CARD_READY_CLICK;
}
}
break;
case HandActionState.SELECT_HAND_CARD_READY_CLICK:
{
if (Input.GetMouseButtonUp(0)) //松开鼠标按键时
{
this.selectHandCardActionState = HandActionState.SELECT_HAND_CARD_END;
}
else
{
// 设置触摸结束坐标点
RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, Input.mousePosition, null, out selEndPosition);
float begX = Mathf.Min(selBeginPosition.x, selEndPosition.x);
float endX = Mathf.Max(selBeginPosition.x, selEndPosition.x);
float begY = Mathf.Min(selBeginPosition.y, selEndPosition.y);
float endY = Mathf.Max(selBeginPosition.y, selEndPosition.y);
Rect selCardRect = new Rect(begX, begY, endX - begX, endY - begY);
// 遍历所有主牌, 并选择具体项
int nTopNums = 3, nBotNums = 3;
int nCardSize = this.cardsList.Count - 1;
for (int i = nCardSize; i >= 0; --i)
{
Rect tmpRect, tmpRect2 = Rect.zero;
CardInfo cardInfo = this.cardsList[i];
Transform selCardObj = cardInfo.CardGameObject.transform;
float posX = selCardObj.localPosition.x - 75.5f;
float posY = selCardObj.localPosition.y - 104.5f;
// 计算精灵的矩形区域
if (i == nCardSize)
{
tmpRect = new Rect(posX, posY, 151f, 209f);
}
else
{
tmpRect = new Rect(posX, posY, 60, 209f);
if (cardInfo.ReadyState && nTopNums > 0)
{
tmpRect2 = new Rect(posX, posY + 209f - 103f, 60 * (nTopNums + 1), 103f);
}
else if (!cardInfo.ReadyState && nBotNums > 0)
{
tmpRect2 = new Rect(posX, posY, 60 * (nBotNums + 1), 103f);
}
}
// 检查矩形是否相交
if (selCardRect.Overlaps(tmpRect) || selCardRect.Overlaps(tmpRect2))
{
selCardObj.Find("Select").gameObject.SetActive(true);
}
else
{
selCardObj.Find("Select").gameObject.SetActive(false);
}
// 计算未准备的连牌
if (!cardInfo.ReadyState)
{
nTopNums = Mathf.Min(nTopNums + 1, 3);
nBotNums = 0;
}
else
{
nBotNums = Mathf.Min(nBotNums + 1, 3);
nTopNums = 0;
}
}
}
}
break;
case HandActionState.SELECT_HAND_CARD_END:
{
int nCardSize = this.cardsList.Count - 1;
for (int n = nCardSize; n >= 0; --n)
{
CardInfo cardInfo = this.cardsList[n];
Transform selCardObj = cardInfo.CardGameObject.transform;
GameObject selSprite = selCardObj.Find("Select").gameObject;
if (!selSprite.activeSelf)
{
continue;
}
// 设置准备状态
float fMoveStep = -209;
if (cardInfo.ReadyState)
{
cardInfo.ReadyState = false;
fMoveStep = -209;
}
else
{
cardInfo.ReadyState = true;
fMoveStep = -106;
}
selCardObj.DOLocalMoveY(fMoveStep, 0.1f);
// 隐藏遮罩层控件
selSprite.SetActive(false);
}
this.selBeginPosition = Vector2.zero;
this.selEndPosition = Vector2.zero;
this.selectHandCardActionState = HandActionState.SELECT_HAND_CARD_START;
}
break;
}
}
}
3.创建一个MyCard2D的预制体,每个节点需添加Image组件
4.相关代码资源包链接:https://download.csdn.net/download/qq_31461977/88862720