Unity 2D:在图像中动态创建孔

cam*_*777 5 2d unity-game-engine

我正在使用Unity 2D,并且试图达到这种简单的效果。我正在制作《 Candy Crush Saga》-类似的游戏。

我有一个所有项目的网格。在每个级别中,网格字段都可以具有在运行时创建的不同形状(背景中间为深灰色区域)。背景是静止图像(蓝天和绿色山丘)。当碎片(例如蓝色五边形)从顶部掉落时,必须将其隐藏,直到它们进入网格区域(深灰色)为止;因此在实践中,背景图像(天空和丘陵)不再是背景,而是具有灰色区域代表的带有孔的前景。灰场也由精灵表中的图块组成。

我已经准备好一张照片,但是很遗憾,我无法在这里加载它。

我不知道如何在Unity中实现这种效果。你有什么主意吗?

最简单的解决方案是创建已经带有孔的所有静态关卡图形,但是我不想创建它们,因为这既浪费时间又浪费内存,我希望能够在运行。

我正在考虑使用精灵表为孔形状创建动态位​​图蒙版。然后使用该位图蒙版作为材质,例如将其应用于前景中的图像并打孔。

我希望它足够清楚。

谢谢!卡米略

Jin*_*nov 4

在统一编辑器中单击您的纹理

将“纹理类型”从“纹理”更改为“高级”

选中“读/写启用”复选框

将“格式”从“自动压缩”更改为“RGBA 32 位”

我将此组件附加到原始图像(您可以将其附加到其他东西,只需更改“RawImage image”部分)

这将在图像的位置 10,10 处创建一个尺寸为 100x100 的孔,因此请确保纹理至少为 110x110 大。

using UnityEngine;
using UnityEngine.UI;

public class HoleInImage : MonoBehaviour
{
   public RawImage image;

   void Start()
   {
      // this will change the original:
      Texture2D texture = image.texture as Texture2D;

      // use this to change a copy (and not the original)
      //Texture2D texture = Instantiate(image.mainTexture) as Texture2D;
      //image.mainTexture = texture;

      Color[] colors = new Color[100*100];

      for( int i = 0; i < 100*100; ++i )
         colors[i] = Color.clear;

      texture.SetPixels( 10, 10, 100, 100, colors );

      texture.Apply(false);
   }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

由一个或多个精灵定义的洞:

对这些精灵执行相同的操作:(高级、读/写启用、RGBA 32 位)

例如:如果精灵是白色的并且洞是用黑色定义的:

      for( int i = 0; i < 100*100; ++i )
         colors[i] = Color.clear;
Run Code Online (Sandbox Code Playgroud)

改成:

      Texture2D holeTex; // set this in editor, it must have same dimensions (100x100 in my example)
      Color[] hole = holeTex.GetPixels();
      for( int i = 0; i < 100*100; ++i )
      {
         if( hole[i] == Color.black ) // where sprite is black, there will be a hole
             colors[i] = Color.clear;
      }
Run Code Online (Sandbox Code Playgroud)