我正在 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) 不受遮罩影响。
谢谢大家!