Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d Unity 5:如何将对象从网格布局缩放并平移到屏幕中心_Unity3d_Grid Layout_Translate Animation - Fatal编程技术网

Unity3d Unity 5:如何将对象从网格布局缩放并平移到屏幕中心

Unity3d Unity 5:如何将对象从网格布局缩放并平移到屏幕中心,unity3d,grid-layout,translate-animation,Unity3d,Grid Layout,Translate Animation,我正在尝试创建一个滚动网格视图,其中每个单元格对象都是可点击的。 当点击一个单元格对象时,我想将其缩放并平移到屏幕的中心,然后将其渲染到其他单元格的上方。 我能够使它可录制并在其位置进行缩放。现在,我想将单元对象移动到屏幕的中心,并将其渲染到其他单元的上方。 我试过很多解决办法,但都不管用 这是我的层次结构: 这是处于正常状态的网格: 这是点击单元格时的网格: 我正在从C#脚本动态填充网格 void Populate() { GameObject cardContainerInst

我正在尝试创建一个滚动网格视图,其中每个单元格对象都是可点击的。 当点击一个单元格对象时,我想将其缩放并平移到屏幕的中心,然后将其渲染到其他单元格的上方。 我能够使它可录制并在其位置进行缩放。现在,我想将单元对象移动到屏幕的中心,并将其渲染到其他单元的上方。 我试过很多解决办法,但都不管用

这是我的层次结构:

这是处于正常状态的网格:

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

我正在从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;
}
void填充()
{
游戏对象cardContainerInstance、cardInstance;
foreach(cardsCollection.GetAll()中的变量c)
{
如果(c.拥有)
{
cardContainerInstance=实例化(cardContainer,transform);
cardInstance=cardcainerinstance.transform.Find(“Card”).gameObject;
var cardManager=cardInstance.GetComponent();
cardManager.card=c;
cardManager.AddListener(这个);
}
其他的
{
实例化(cardSlot、transform);
}
}
}
一次点击公共作废(游戏对象卡片对象,卡片)
{
Log(“OnCardClick”+card.name);
if(openedCard!=null){
if(openedCard.Number==卡片编号)
{
CloseCard(openedCardObject);
}
其他的
{
CloseCard(openedCardObject);
OpenCard(cardObject,card);
}
}
其他的
{
OpenCard(cardObject,card);
}
}
作废OpenCard(游戏对象cardObject,卡片卡)
{
//cardObject.GetComponent().sortingOrder=1;
var animator=cardObject.GetComponent

其中:

  • CardContainer是一个空对象,添加到卡片子对象上使用animator
  • 卡片是具有脚本、画布渲染器和动画师的对象本身
  • StatsImage是卡被轻触时滑出的对象
  • 图像是带有图像脚本、阴影脚本和画布渲染器的calssic UIImage
  • 其他部分是简单的文本
编辑:正在进行修复

尝试应用建议时,我能够管理渲染顺序(如下图所示),但似乎无法在游戏对象上检测到触摸事件。 我还添加了一个GraphicsRaycaster,现在底部水平滚动视图再次滚动,但仅当我单击并拖动一张卡时。 此外,使用GraphicsRaycaster,主网格卡仍然不可单击,只有当它位于底部面板后面时,才可以打开该卡(如果我单击面板后面的卡下方图像中的红色点,则可以打开该卡)

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


您没有明确说明您使用的是sprite渲染器还是其他方法,但这里给出了每个方法的答案

精灵渲染器:

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

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


我希望这会有帮助!

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

cardObject.GetComponent<Canvas>().sortingOrder = 1;
cardObject.GetComponent().sortingOrder=1;
把它放在前面和后面

cardObject.GetComponent<Canvas>().sortingOrder = 0;
cardObject.GetComponent().sortingOrder=0;
把它放在后面

您还需要在每个cardObjects上安装GraphicsRaycaster


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

我不使用SpriteRenderer,我已经用更多细节更新了我的问题。我尝试将SpriteRenderer添加到卡中的图像组件中,但它没有显示任何内容:((我对Unity非常陌生)好的,使用SpriteRenderer会显示图像(我已经添加了“图像上的精灵”组件,并禁用了默认的图像脚本),但它非常小,我不知道为什么。精灵导入时非常紧凑,精灵渲染器配置为“简单绘制模式”。画布处于渲染模式屏幕空间-摄影机,渲染摄影机是主摄影机(orthgraphic)。我如何修复此问题?我也尝试使用两个摄影机进行解释并从脚本更改卡片层,但当我将该层设置为卡片时,它似乎停留在与主摄影机关联的卡片下层。在顶部摄影机中,我仅选择了卡片上层。这是由于在画布上渲染摄影机造成的吗?哦,你正在使用uitha中的图像ts应该非常简单。Spirterender本质上是游戏中的图像,但你现在不需要处理它们。谢谢你的回答:)将画布组件添加到CardContainer似乎是解决方案,但它似乎可以防止在游戏对象上检测到触摸事件:(我也尝试将EventSystem添加到同一个游戏对象中,但没有任何变化。还有下方的水平滚动视图(网格下)不再滚动…我如何解决这个问题?哦,我认为向每个对象添加一个图形光线投射器应该可以解决这个问题。我在主要答案中添加了这一点。此外,事件系统仅需要作为场景中某个位置的对象。它是在添加画布时默认创建的。我正试图按照您的建议添加一个图形光线投射器,但它没有“t完全有效。我已经用一些细节更新了主要问题。非常接近解决方案:)
cardObject.layer = "cardLower"
cardObject.GetComponent<Canvas>().sortingOrder = 1;
cardObject.GetComponent<Canvas>().sortingOrder = 0;