2

我想用 Unity (2D) 实现一个图片库。我在Canvas逻辑上划分为 100x100 单位的正方形。然后:

  • 每个“正方形”都由从 Internet 动态下载的图像填充(使用 www 类);
  • 图像不一定是正方形:在这种情况下,我想“缩放和裁剪图像”:保留纵横比并且图像填充整个正方形;
  • 当用户点击一个正方形时,图像会在屏幕中间展开到其自然大小。再次单击图像将返回正方形大小/位置;
  • 每隔一段时间,随机取一个正方形并将其图像替换为新图像。

我是 Unity 新手,我已经尝试了很多不同的方法。我真正的问题是规模和作物。的确:

  • 需要Gui.DrawTexture()一个参数scaleMode.ScaleAndCrop,这正是我所需要的。但这是旧 UI 系统的一部分......
  • 新的 UI 提供ImageRawImageGui 组件,但开箱即用,我们可以保持纵横比或填充正方形,而不是两者兼而有之。
  • 我试图通过将正方形像素复制到新纹理中来创建“纹理缩略图”。它可以工作,但缩略图和全尺寸图像之间的动画不再可能......

我确信有一种方法可以使用新的 UI 功能获得缩放和裁剪效果,但我不知道如何。有人可以给我一个建议吗?

4

2 回答 2

1

您将需要使用 Image 组件缩放 GameObject,并使用 Mask 组件。

我会这样做:

使用 GridLayoutGroup 创建画布,它将根据需要组织缩略图图像(3 行 3 列等)。

每个图像都有一个带有掩码的父游戏对象,该掩码将使用 GridLayoutGroup 进行设置。面具的孩子将是一个图像,您将在其中显示下载的内容。

在您选择的控制器中引用每个 Image 组件。

image1 是对第一个缩略图的引用;

下载图像时,将其制作的 Sprite 分配给 image1.sprite。

调用 image1.SetNativeSize();

检查 fimage1.GetComponent<RectTransform>().sizeDelta(这是宽度和高度)并根据图像大小缩放 image1,同时考虑到使其适合蒙版边框。您基本上需要一些数学小算法。

image1 还具有带有附加 OnClick 事件的 Button 组件,该事件将触发让我们说“ShowImagePressed (Image img)”。参数是image1的图像。

触发此处理程序时,通过 image1.transform.parent.GetComponent<Mask>().enabled = false 禁用遮罩,并缩放 image1,将其移动到中心。

于 2015-12-22T17:21:07.433 回答
0

存档自动缩放和裁剪行为的最简单方法是将AspectRatioFitter添加到包含图像的 GameObject 中。将AspectMode设置为Envelope Parent。这样 Unity 将填充,如果需要重叠父级,请参阅Unity 文档

Envelope Parent:宽度、高度、位置和锚点会自动调整,以使矩形覆盖父级的整个区域,同时保持纵横比。这个矩形可能比父矩形延伸得更远。

然后,您可以向父对象添加蒙版以隐藏不需要的叠加层(不要忘记还添加一个空图像,否则蒙版将不起作用)。您可能需要在脚本中处理的唯一事情是找到正确的图像纵横比。

于 2017-05-18T16:42:07.687 回答