【问题标题】:Unity 5: how to zoom and translate an object from a grid layout to the center of the screenUnity 5:如何将对象从网格布局缩放和平移到屏幕中心
【发布时间】:2018-10-20 21:53:00
【问题描述】:

我正在尝试创建一个滚动网格视图,其中每个单元格对象都是可点击的。 当一个单元格对象被点击时,我想将其缩放并平移到屏幕的中心并将其渲染到其他单元格之上。 我能够使其可点击并将其缩放到其位置。现在我想将单元格对象移动到屏幕的中心并将其渲染到其他单元格上方。 我尝试了很多解决方案,但没有一个有效。

这是我的层次结构:

这是正常状态的网格:

这是点击单元格时的网格:

我正在从 C# 脚本动态填充网格。

void Populate()
{
    GameObject cardContainerInstance, cardInstance;

    foreach (var c in cardsCollection.GetAll())
    {
        if (c.IsOwned)
        {
            cardContainerInstance = Instantiate(cardContainer, transform);
            cardInstance = cardContainerInstance.transform.Find("Card").gameObject;

            var cardManager = cardInstance.GetComponent<CardManager>();
            cardManager.card = c;
            cardManager.AddListener(this);
        }
        else
        {
            Instantiate(cardSlot, transform);
        }
    }

}

public void OnCardClick(GameObject cardObject, Card card)
{
    Debug.Log("OnCardClick " + card.name);

    if (openedCard != null) {
        if (openedCard.Number == card.Number)
        {
            CloseCard(openedCardObject);
        }
        else
        {
            CloseCard(openedCardObject);
            OpenCard(cardObject, card);
        }
    }
    else
    {
        OpenCard(cardObject, card);
    }
}

void OpenCard(GameObject cardObject, Card card)
{
    //cardObject.GetComponent<Canvas>().sortingOrder = 1;

    var animator = cardObject.GetComponent<Animator>();
    animator.SetTrigger("Open");

    openedCard = card;
    openedCardObject = cardObject;
}

void CloseCard(GameObject cardObject)
{
    var animator = cardObject.GetComponent<Animator>();
    animator.SetTrigger("Close");

    openedCard = null;
    openedCardObject = null;
}

我不知道如何将单元格移动到中心并将其呈现在其他单元格之上。

请注意,所有内容都是使用附加到对象本身的动画器进行动画处理的。

谁能帮帮我?非常感谢!

编辑:更多细节

所有单元格对象都有以下层次结构:

地点:

  • CardContainer 是一个空对象,添加以在 Card 子对象上使用动画器
  • 卡片是具有脚本、画布渲染器和动画师的对象本身
  • StatsImage 是点击卡片时滑出的对象
  • Image 是一个带有 Image 脚本、Shadow 脚本和画布渲染器的 calssic UIImage
  • 其他组件是简单的文本。

编辑:修复中

尝试应用this 建议我能够管理渲染顺序(如下图所示),但似乎阻止了在游戏对象上检测到触摸事件。 我也添加了 GraphicsRaycaster,现在底部水平滚动视图再次滚动,但前提是我单击并拖动卡片。 此外,使用GraphicsRaycaster,主网格卡仍然不可点击,只有在底部面板后面才能打开卡片(如果我点击面板后面的卡片下方图像中的红点会收到che click)

这是运行时的 CardContainer(请注意,我在 CardContainer 上附加了新的 Canvas 和 GraphicsRaycaster,这是“根”元素):

【问题讨论】:

    标签: unity3d grid-layout translate-animation


    【解决方案1】:

    您没有说明您是使用精灵渲染器还是其他方法,但这里是每个方法的答案。

    Sprite 渲染器:

    这是最简单的。在每个精灵渲染器中,脚本中有一个名为“sortingOrder”的变量,而检查器中有一个名为“Order in layer”的变量。首先渲染排序顺序较高的精灵渲染器。您需要做的就是调用:

    cardObject.GetComponent<SpriteRenderer>().sortingOrder = 1;
    

    当你点击卡片时,

    cardObject.GetComponent<SpriteRenderer>().sortingOrder = 0;
    

    当您取消单击它时。我希望这是有道理的!

    其他方法:

    这个有点难,我建议你切换到精灵渲染器,它会更容易和更稳定,但如果你已经写了很多脚本并且不想回去改变他们。 无论如何,您需要做的就是创建两个层:cardLower 和 cardUpper。然后创建一个新相机并将其命名为 topCamera。现在在检查器的顶部相机对象下,更改剔除遮罩(它靠近顶部)并确保选择了 cardUpper。然后将清除标志(第一个)更改为“不清除”,最后将深度更改为 0(如果这不起作用将其更改为 -2)。现在 cardUpper 中的对象将始终呈现在其他所有内容之上。您可以使用

    通过脚本更改图层
    cardObject.layer = "cardUpper"
    

    cardObject.layer = "cardLower"
    

    希望对你有帮助!

    【讨论】:

    • 我不使用 SpriteRenderer,我用更多细节更新了我的问题。我尝试将 SpriteRenderer 添加到卡片内的 Image 组件中,但它没有显示任何内容:((我对 Unity 很陌生)
    • 好的,使用 SpriteRenderer 会显示图像(我已经在 Image 组件上添加了 spriterender,并且我已经停用了默认图像脚本)但是它非常小,我不知道为什么.精灵以 Tight 形式导入,精灵渲染器配置为简单的绘制模式。画布处于渲染模式屏幕空间 - 相机和渲染相机是主相机(正交)。我该如何解决这个问题?
    • 我也尝试过使用两个摄像头来解释并从脚本更改卡片层,但是当我将层设置为卡片时,它似乎停留在与主摄像头关联的 cardLower 层中。在顶部相机中,我只选择了 cardUpper 层。这是因为在 Canvas 上渲染相机吗?
    • OHHHHHH 你在 ui 中使用图像
    • 那应该超级简单。 Spriterenderer 本质上是用于游戏的图像,但您现在不需要处理它们
    【解决方案2】:

    好的,这很简单。因此,您将要向游戏对象添加另一个画布组件,并检查覆盖排序是否为 true。然后使用

    cardObject.GetComponent<Canvas>().sortingOrder = 1;
    

    把它放在前面和

    cardObject.GetComponent<Canvas>().sortingOrder = 0;
    

    把它放在后面。

    您还需要在每个 cardObjects 上放置一个 GraphicsRaycaster

    忽略我关于精灵渲染器的其他回答,这里不需要它们

    【讨论】:

    • 感谢您的回答 :) 将 Canvas 组件添加到 CardContainer 似乎是解决方案,但它似乎可以防止在游戏对象上检测到触摸事件 :( 我也尝试添加 EventSystem相同的游戏对象,但没有任何变化。下部(网格下)的水平滚动视图也不再滚动......我该如何解决?
    • 哦,我认为为每个对象添加一个图形光线投射器应该可以解决问题。我将其添加到主要答案中。此外,事件系统只需要作为场景中某处的对象。添加画布时默认创建
    • 我正在尝试按照您的建议添加一个 GraphicsRaycaster,但它并不能完全有效。我已经用一些细节更新了主要问题。非常接近解决方案:)
    猜你喜欢
    • 2015-11-14
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多