2D 游戏中的屏蔽和排序顺序文本

问题描述 投票:0回答:1

我正在 Unity 中创建一个 2d 游戏,其中包含简单的卡片,可以从手中拖动这些卡片在游戏空间的中间玩。这些卡片是由多个精灵游戏对象及其关联的子对象创建的。 除此之外,卡片需要有可以在脚本中修改的文本(每张卡片都可以通过游戏事件进行修改,因此需要与预制件不同。)卡片上的文本不能是静态精灵,所以我正在尝试找到一个有效的解决方案。

第一个想法是使用 TextMeshPro,但我不能在精灵上使用它。 精灵渲染器和网格是互斥的。 这意味着我无法使用 2d Unity Sort Order 来管理其可见性。 文本要么被每个精灵对象遮挡,要么漂浮在精灵对象的顶部。 没有中间内容,这对于纸牌游戏来说毫无用处。 我尝试过创建精灵或画布对象,然后将 TMP 添加为子对象,但我还没有找到一种方法让它充当 2d 对象以进行排序。

第二个想法是在画布上使用 TextMeshPro (UI)。 为了拖动卡片并正确堆叠它们,使用 2d 对象的 Unity 排序顺序效果非常好。 但是,我希望能够将卡片遮盖为特殊效果。 例如,创建沿卡片向上移动的“燃烧”效果,或创建从扩展圆圈中心遮盖卡片的扫描“脉冲”效果。 所有精灵对象都按照您的预期进行遮罩,但由于 TMP 是 UI 对象,因此它会忽略精灵遮罩。

我能找到的所有有关此问题的文档都已经过时了。 我是否使用了错误类型的对象? 有没有办法掩盖我丢失的 TMP(UI)?

当前的实现代码使用TMP(UI)。 在更新中我有以下内容:

        if (beingPlayed && !moving && countdownToBurn > 0)
        {
            countdownToBurn -= Time.deltaTime;
            if (countdownToBurn <= 0){
                burning = true;
                burnMask = GameObject.Instantiate<SpriteMask>(stage.CircleSpriteMask);
                burnMask.sprite = stage.CirclePrefab.GetComponent<SpriteRenderer>().sprite;
                burnMask.transform.position = ZoneConfig.playLocation;
                burnMask.transform.localScale = Vector3.zero;
            }
        }

        if (burning)
        {
            burnMask.transform.localScale = new Vector3(
                burnMask.transform.localScale.x + ZoneConfig.cardBurnScaleAdder,
                burnMask.transform.localScale.y + ZoneConfig.cardBurnScaleAdder,
                burnMask.transform.localScale.z + ZoneConfig.cardBurnScaleAdder);
            if (burnMask.transform.localScale.x >= ZoneConfig.cardBurnScaleAdder * ZoneConfig.cardBurnScaleMult)
            {
                stage.PlayCard(thisCard);
                thisCard.DestroyCard();
                Destroy(burnMask);
            }
        }

一些基础知识,当玩家释放卡片时,它会漂浮到屏幕中央并在那里停留一两秒(countdownToBurn),然后它从预制件(burnMask)创建一个 spriteMask,开始时很小,然后逐渐增大每次更新时的预设金额 (ZoneConfig.cardBurnScaleAdder)。 一旦达到某个阈值(ZoneConfig.cardBurnScaleMult),掩码就比卡大,可以安全地“玩”,然后销毁。

以上所有内容均有效,但卡上的 TMP (UI) 不受遮罩影响。

谢谢大家!

c# unity-game-engine 2d textmeshpro
1个回答
0
投票

如果我理解正确的话,你基本上希望你的文本表现得像一个普通对象,使其成为精灵的一部分,而不是一个 Ui 对象? 我有一个解决方案给你。

  • 首先创建一个新画布。
  • 将渲染模式设置为 World Spaec。
  • 矩形变换(画布):将位置设置为(0,0,0),以便您可以找到它
  • 矩形变换(画布):设置宽度/高度(我尝试了 60*80,看起来不错)
  • 矩形变换(画布):将比例设置为(0.01, 0.01, 0.01)
  • 现在在画布上创建您的文本网格专业版

看起来像当图层中的圆圈顺序较高时,胶囊和文本是胶囊的子项。

enter image description here

如果您标记答案(如果它解决了您的问题),或者如果这不是您的意图,请告诉我,我将不胜感激。

© www.soinside.com 2019 - 2024. All rights reserved.