【问题标题】:How to ensure user selects the top card in a deck of cards in Unity3D?如何确保用户在 Unity3D 中选择一副牌中的顶牌?
【发布时间】:2019-06-20 20:06:09
【问题描述】:

我有一副牌,我将它们作为精灵放置在我的 Unity 游戏中(每张牌都作为单独的精灵)。它们被放置成一堆乱七八糟的东西......我怎样才能确保首先拿起牌堆中的最上面的牌?即我不希望用户选择向下的第 5 张卡片,即使它部分可见...

【问题讨论】:

  • 最上面的卡片是否有更高的 z 索引?
  • 在您的游戏控制器(或在您的架构中更有意义的其他地方)中有一个字段,用于跟踪顶部的卡片。然后当您检测到对任何卡片的点击时,请参考该字段。
  • 谢谢你们两位的cmets。 @RyanWilson 不幸的是,如果我更改 z 索引并不重要,因为它们没有完全相互重叠。我已经做到了,这样你就可以看到其他卡片从下面的牌堆中伸出来。目前,用户可以选择下方卡片的边缘。
  • @Ruzihm 你有我如何实现的代码示例吗?尽管我熟悉 C#,但我才刚刚开始使用 Unity,因此不确定一切是如何联系在一起的! ://
  • 创建一个脚本,命名为“GameManager”。给它一个public GameObject topCard 字段。把它放在一个名为“游戏管理器”的空游戏对象上。将场景中的顶部卡片游戏对象拖到检查器中可见的游戏管理器的“顶部卡片”字段中。在点击发生时调用的方法中,获取对游戏管理器组件的引用(缓存GameObject.Find("Game Manager").GetComponent<GameManager>() 的结果或使GameManager 成为singleton )然后您可以使用gameMan.topCard 获取顶级卡片游戏对象。

标签: c# unity3d sprite


【解决方案1】:

由于它是游戏,我将假设有类似游戏管理器或甲板管理器类的东西,它以数组(或列表)的形式跟踪桌子上的牌。卡片的顺序应该与数组中卡片引用的顺序相匹配,只要所有卡片操作(洗牌等)都在数组上完成。

一旦到位,您可以简单地在该类中添加一个事件侦听器函数,该函数在用户尝试拿起任何卡片时调用。如果该卡是阵列中的最后一张卡,则让它被选中,否则不被选中。

【讨论】:

    【解决方案2】:

    我将用来解决这个问题的方法是将你所有的牌组作为父游戏对象,它会捕获点击事件(统一事件系统首先对叶子进行射线投射,如果它在叶子上找不到处理程序,它将在父级中查找处理程序,然后在父级的父级中查找...您明白了)。

    如果在父级上捕获点击事件的单一行为知道哪些卡片位于顶部,则它可以触发您想要在该卡片上执行的任何功能。

    编辑:

    //something along these lines:
    using UnityEngine;
    using System.Collections.Generic;
    public class CardDeckManager : Monobehaviour, IPointerClickHandler
    {
        [serializeField]
        private List<GameObject> _cards; // If I were you I'd have a Monobehaviour class "Card" or so, which each card has, then you can replace BoxCollider2D with that and access functionality for cards in the deck from here
    
        public void OnPointerClick(PointerClickEventData data)
        {
            var topmostCard = _cards[0];
            _cards.RemoveAt(0); // remove the topmost card from the deck
            DoSomethingWith(topmostCard); // and have it played
            // For example move it to the center of the table... and have it affect the game logic
        }
    
        // assign _cards these in editor, or generate them programmatically
    }
    

    重要提示:确保您有一个 EventSystem,并且相机上有一个光线投射器

    【讨论】:

    • 感谢@Daveloper 的帮助。你说的这听起来是个好主意......你有一个代码示例来说明我如何实现它吗?我是 Unity 新手,所以还不完全确定代码和接口对象如何交互:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 2012-05-26
    • 2012-10-31
    • 2014-02-20
    • 1970-01-01
    相关资源
    最近更新 更多