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; } }
排查与解决建议
补全卡牌显示逻辑
你只设置了卡牌名称和faceUp属性,但没有将卡牌名称映射到对应的视觉资源上。控制台打印正确但视觉没更新,核心问题大概率是没给新卡牌赋值对应的Sprite。检查Selectable脚本中faceUp是否触发了Sprite切换,或者手动根据卡牌名称加载Sprite并赋值给卡牌的Image或SpriteRenderer组件。解决卡牌重叠问题
每次实例化的卡牌都在同一个位置(固定xOffset),且作为deckButton的子物体,新卡牌会和旧卡牌完全重叠,视觉上显示的是最底层的旧卡牌。可以:- 给每张新卡牌增加递增的偏移量(比如
xOffset * discardPile.Count),让卡牌依次排列; - 每次生成新卡牌时,销毁弃牌堆中之前的所有卡牌;
- 调整新卡牌的渲染层级(修改
Sorting Order),让新卡牌显示在最上层。
- 给每张新卡牌增加递增的偏移量(比如
修正牌堆索引逻辑
当重置deckLocation = 0时,没有清空弃牌堆和销毁旧卡牌,会导致后续生成的卡牌和大量旧卡牌重叠,加剧视觉混乱。重置索引时,遍历弃牌堆销毁所有旧卡牌,并清空discardPile列表。检查碰撞体干扰
新生成的卡牌碰撞体可能会遮挡牌堆按钮,导致后续点击实际触发的是卡牌而非牌堆按钮。可以给卡牌碰撞体设置Is Trigger,或者将卡牌和牌堆按钮设置在不同的物理层级,避免干扰点击检测。
内容的提问来源于stack exchange,提问作者shannon
相关产品推荐
相关产品推荐

