【发布时间】:2021-03-19 21:07:34
【问题描述】:
所以基本上我有一手牌。这些卡片是游戏对象预制件,当我将其悬停时,它会放大并略微向上移动。但是当缩放它时,它会覆盖他左边的卡片并留在他右边的卡片后面,我希望这张卡片能越过卡片。
我试图改变 z 索引和层,但手上的所有卡片都由相同的水平布局统治......
我应该只在悬停的卡片的每一侧推动卡片吗?或者有人有办法在其他人面前画一个特定的孩子?
【问题讨论】:
标签: c# unity3d layout gameobject
所以基本上我有一手牌。这些卡片是游戏对象预制件,当我将其悬停时,它会放大并略微向上移动。但是当缩放它时,它会覆盖他左边的卡片并留在他右边的卡片后面,我希望这张卡片能越过卡片。
我试图改变 z 索引和层,但手上的所有卡片都由相同的水平布局统治......
我应该只在悬停的卡片的每一侧推动卡片吗?或者有人有办法在其他人面前画一个特定的孩子?
【问题讨论】:
标签: c# unity3d layout gameobject
您可以做的是动态添加一个新的 Canvas 到您想要在前面的对象,并覆盖排序:
在代码中,你可以这样做:
var newCanvas = yourGameObject.AddComponent<Canvas>();
newCanvas.overrideSorting = true;
newCanvas.sortingOrder = 1; // this has to be higher than order of parent canvas
当然,您应该记住在不再需要此画布时将其移除。
编辑:使用我验证有效的完整代码更新了解决方案。我错过了将光线投射器添加到新画布中。这是完整的代码:
public class YourClass : MonoBehaviour, IPointerExitHandler, IPointerEnterHandler
{
private Canvas tempCanvas;
private GraphicRaycaster tempRaycaster;
public void OnPointerEnter(PointerEventData eventData)
{
// add and configure necessary components
tempCanvas = gameObject.AddComponent<Canvas>();
tempCanvas.overrideSorting = true;
tempCanvas.sortingOrder = 1;
tempRaycaster = gameObject.AddComponent<GraphicRaycaster>();
// your operations on the object
transform.localScale = new Vector2(1.1f, 1.1f);
// ...
}
public void OnPointerExit(PointerEventData eventData)
{
// remove components that are not needed anymore
Destroy(tempRaycaster);
Destroy(tempCanvas);
// your operations on the object
transform.localScale = new Vector2(1f, 1f);
// ...
}
}
【讨论】: