Unity3D实现扑克滑动选牌

文章介绍了如何在Unity中创建Canvas并为其添加Cards节点,使用Cards脚本来管理手牌选择过程,包括鼠标点击事件处理、卡片位置和选择状态的控制。通过实例化MyCard2D预制体和Image组件,实现了手牌的显示与选择效果。
摘要由CSDN通过智能技术生成

先上效果图:

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

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
      本套C#语言教程,全部采用案例化教学模式。结合C#知识点在实际游戏中具体的应用场景,让初级学员快速、深入的学好C#语言,为进一步全面、高效的学习Unity游戏引擎,制作精良的游戏产品,打下坚实的语言基础!       真正学好Unity,其先决条件是一定要有稳固、扎实的编程基础!因此目前绝大多数(线下)Unity培训机构(一般4-5个月)都会先给学员讲解C# for Unity 的编程加强课程。(一般高校的编程课程内容少、不深入...)        本套《C# for Unity》课程共分为“入门篇”、“基础篇”、“中级篇”、“进阶篇”,分别对应于完全“零”编程基础、较少编程基础、需要强化C#编程、需要深入学习C#脚本,等各类型学员群体。      说明:  本课程使用Virtual Studio2012,以及Unity5.2 进行开发与讲解。(学员使用更高版本,对学习影响不大) 一、热更新系列(技术含量:中高级):A:《lua热更新技术中级篇》https://edu.csdn.net/course/detail/27087B:《热更新框架设计之Xlua基础视频课程》https://edu.csdn.net/course/detail/27110C:《热更新框架设计之热更流程与热补丁技术》https://edu.csdn.net/course/detail/27118D:《热更新框架设计之客户端热更框架(上)》https://edu.csdn.net/course/detail/27132E:《热更新框架设计之客户端热更框架(中)》https://edu.csdn.net/course/detail/27135F:《热更新框架设计之客户端热更框架(下)》https://edu.csdn.net/course/detail/27136二:框架设计系列(技术含量:中级): A:《游戏UI界面框架设计系列视频课程》https://edu.csdn.net/course/detail/27142B:《Unity客户端框架设计PureMVC篇视频课程(上)》https://edu.csdn.net/course/detail/27172C:《Unity客户端框架设计PureMVC篇视频课程(下)》https://edu.csdn.net/course/detail/27173D:《AssetBundle框架设计_框架篇视频课程》https://edu.csdn.net/course/detail/27169三、Unity脚本从入门到精通(技术含量:初级)A:《C# For Unity系列之入门篇》https://edu.csdn.net/course/detail/4560B:《C# For Unity系列之基础篇》https://edu.csdn.net/course/detail/4595C: 《C# For Unity系列之中级篇》https://edu.csdn.net/course/detail/24422D:《C# For Unity系列之进阶篇》https://edu.csdn.net/course/detail/24465四、虚拟现实(VR)与增强现实(AR):(技术含量:初级)A:《虚拟现实之汽车仿真模拟系统 》https://edu.csdn.net/course/detail/26618五、Unity基础课程系列(技术含量:初级) A:《台球游戏与FlappyBirds—Unity快速入门系列视频课程(第1部)》 https://edu.csdn.net/course/detail/24643B:《太空射击与移动端发布技术-Unity快速入门系列视频课程(第2部)》https://edu.csdn.net/course/detail/24645 C:《Unity ECS(二) 小试牛刀》https://edu.csdn.net/course/detail/27096六、Unity ARPG课程(技术含量:初中级):A:《MMOARPG地下守护神_单机版实战视频课程(上部)》https://edu.csdn.net/course/detail/24965B:《MMOARPG地下守护神_单机版实战视频课程(中部)》https://edu.csdn.net/course/detail/24968C:《MMOARPG地下守护神_单机版实战视频课程(下部)》https://edu.csdn.net/course/detail/24979

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zxy644492473

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值