You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity卡牌游戏:牌堆按钮功能正常但视觉显示异常问题排查

问题描述

点击牌堆按钮时,本该每次显示一张新卡牌。控制台能正确打印出对应要显示的卡牌名称,但视觉显示仅偶尔正常,毫无规律。
曾怀疑Z轴层级问题,调整后无改善,现已移除Z轴偏移。同一鼠标点击函数下的其他功能均正常,唯独该功能异常。当前可见卡牌是多次点击前的旧卡牌,有截图显示Unity游戏窗口与控制台的对应状态。

相关代码

鼠标点击检测代码

void GetMouseClick()
{
    if(Input.GetMouseButtonDown(0))
    {
        Vector3 mousePosition = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, -10));
        // 检测点击目标
        Collider2D hit = Physics2D.OverlapPoint(Camera.main.ScreenToWorldPoint(Input.mousePosition) );
        if (hit)
        {
            // 判断点击对象标签
            if(hit.CompareTag("Deck"))
            {
                DeckHit();
            }
            else if(hit.CompareTag("Card"))
            {
                CardHit(hit.gameObject);
            }
            else if (hit.CompareTag("Tableaus"))
            {
                TableauHit(hit.gameObject);                
            }
        }
    }
}

DeckHit函数

void DeckHit()
{
    game.DealFromDeck();
}

DealFromDeck函数

public void DealFromDeck()
{
    float xOffset = 1.5f;
    GameObject newCard = Instantiate(cardPrefab, new Vector3(deckButton.transform.position.x+xOffset, deckButton.transform.position.y, deckButton.transform.position.z), Quaternion.identity, deckButton.transform);
    newCard.name = deck[deckLocation];
    print(newCard.name);
    newCard.GetComponent<Selectable>().faceUp = true;
    if (deckLocation < (deck.Count-1))// 未到牌堆末尾时递增索引
    {
        print(deckLocation);
        deckLocation++;
        discardPile.Add(newCard.name);
    }
    else// 到牌堆末尾时重置索引
    {
        print(deckLocation);
        deckLocation = 0;
    }
}
排查与解决建议
  1. 补全卡牌显示逻辑
    你只设置了卡牌名称和faceUp属性,但没有将卡牌名称映射到对应的视觉资源上。控制台打印正确但视觉没更新,核心问题大概率是没给新卡牌赋值对应的Sprite。检查Selectable脚本中faceUp是否触发了Sprite切换,或者手动根据卡牌名称加载Sprite并赋值给卡牌的Image或SpriteRenderer组件。

  2. 解决卡牌重叠问题
    每次实例化的卡牌都在同一个位置(固定xOffset),且作为deckButton的子物体,新卡牌会和旧卡牌完全重叠,视觉上显示的是最底层的旧卡牌。可以:

    • 给每张新卡牌增加递增的偏移量(比如xOffset * discardPile.Count),让卡牌依次排列;
    • 每次生成新卡牌时,销毁弃牌堆中之前的所有卡牌;
    • 调整新卡牌的渲染层级(修改Sorting Order),让新卡牌显示在最上层。
  3. 修正牌堆索引逻辑
    当重置deckLocation = 0时,没有清空弃牌堆和销毁旧卡牌,会导致后续生成的卡牌和大量旧卡牌重叠,加剧视觉混乱。重置索引时,遍历弃牌堆销毁所有旧卡牌,并清空discardPile列表。

  4. 检查碰撞体干扰
    新生成的卡牌碰撞体可能会遮挡牌堆按钮,导致后续点击实际触发的是卡牌而非牌堆按钮。可以给卡牌碰撞体设置Is Trigger,或者将卡牌和牌堆按钮设置在不同的物理层级,避免干扰点击检测。

内容的提问来源于stack exchange,提问作者shannon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 00:02:12