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