2015-06-19 40 views
3

我使用的是Unity 2D,我试图实现这个简单的效果。 我正在制作一款糖果传奇 - 就像游戏一样。Unity 2D:在图像中动态创建一个洞

我有一个网格与所有的项目。 在每个级别中,网格字段可以具有不同的形状,在运行时创建(背景中间的深灰色区域)。 背景是静止图像(蓝色的天空和绿色的山丘)。 当零件(例如蓝色五角形)从顶部落下时,它们必须隐藏,直到它们进入栅格区域(深灰色);所以实际上背景图像(天空和山丘)不再是背景,而是具有由灰色区域表示的孔的前景。 灰色字段也由精灵表中的图块组成。

我已经准备好了一张照片,但不幸的是我还无法在这里加载它。

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

最简单的解决方案是创建所有的静态图形已经与洞,但我不想创建它们,因为它是浪费时间,也浪费内存,我希望能够在运行时创建这个效果。

我正在考虑使用精灵表为孔形状创建一个动态位图掩膜。 然后使用此位图遮罩作为示例将其应用于前景中的图像并打孔。

我希望它很清楚。

谢谢! 卡米洛

+0

你可以使用原始图像http://docs.unity3d.com/Manual/script-RawImage。html然后用texure2d设置像素http://docs.unity3d.com/ScriptReference/Texture2D.SetPixels.html – JinJi

+0

嗨,谢谢!你还可以在下一部分给我一些提示,使用这种新的纹理和位图使孔看到落在后面的物品? – camillo777

回答

2

点击从“纹理”统一编辑

变“纹理类型”你的纹理为“先进”

检查“读/写启用”复选框

变化“格式“表格”自动压缩“为”RGBA 32位“

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

这将在图像的位置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); 
    } 
} 

编辑:

这些精灵做同样的:由一个或多个子画面定义

孔(先进,读/写使能,RGBA 32位)

例如:如果精灵是白色的并且孔被定义为黑色:

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

更改为:

 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; 
     } 
+0

嗨,很好的答案谢谢,如果我的洞不是一个矩形,而是由一个或多个精灵的组合定义的自定义形状? – camillo777

+0

@ camillo777我编辑了答案 – JinJi