Unity 2D:在图像中动态创建一个洞

Posted

技术标签:

【中文标题】Unity 2D:在图像中动态创建一个洞【英文标题】:Unity 2D: dynamically create a hole in a image 【发布时间】:2015-06-19 10:56:14 【问题描述】:

我正在使用 Unity 2D,我正在尝试实现这个简单的效果。 我正在制作 Candy Crush Saga 类游戏。

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

我准备了一张图片,但是很遗憾我还不能在这里加载。

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

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

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

我希望它足够清楚。

谢谢! 卡米洛

【问题讨论】:

你可以使用原始图像docs.unity3d.com/Manual/script-RawImage.html然后使用texure2d设置像素docs.unity3d.com/ScriptReference/Texture2D.SetPixels.html 您好,谢谢!您能否也给我一些关于下一部分的提示,使用这个新纹理和位图来制作洞以查看掉在后面的物品? 【参考方案1】:

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

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

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

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

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

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

【讨论】:

嗨,很好的回答,谢谢,如果我的洞不是矩形而是自定义形状,例如由 1 个或多个精灵的组合定义的形状怎么办?

以上是关于Unity 2D:在图像中动态创建一个洞的主要内容,如果未能解决你的问题,请参考以下文章

unity2D如何动态改变物体的layer

如何用unity3d创建安卓动态壁纸?

在 Unity 的运行时从文件动态加载带有 Texture2D 的纹理列表

动态壁纸水波纹效果

为 Unity-2D 创建精灵表

Unity Shader2D动态云彩