有没有办法让面具的某些矩形区域透明?

时间:2015-07-23 01:20:21

标签: unity3d

我正在使用UGUI制作新手指南,引导人们玩我的游戏。

并且需要整个UI成为掩模,但需要点亮一些矩形区域。

怎么办?

2 个答案:

答案 0 :(得分:0)

创建一个新的游戏对象并向其添加图像组件。创建一个图像,其中包含您希望ui可见的透明区域。将该图像分配给图像组件。然后添加一个遮罩组件

将你的其他gui元素放在这个游戏对象中,这样就可以重叠并隐藏除透明区域之外的所有内容。这是演示设置的图片。 enter image description here

答案 1 :(得分:0)

恕我直言,你想要实现的目标在Unity中并不容易完成。这是我的个人解决方案:

  1. 我在每个其他GUI下面放置一个黑色面板,这样就会使整个屏幕变暗。
  2. 我在面板下方放置了一个名为BrightRoot的空游戏对象,因此BrightRoot下的所有内容都会浮动并“变亮”。
  3. 在我的教程脚本中,我添加了一个函数来按名称查找UI游戏对象,并将其父级更改为BrightRoot。例如:
  4.   

    //使物体变亮
      GameObject按钮= GameObject.Find(“PlayButton”);
      Tansform oldParent = button.transform.parent;
      button.transform.SetParent(BrightRoot,true);

         

    //再次使它变暗
      button.transform.SetParent(oldParent,true);

    完美的解决方案是编写一个UI着色器,使某些矩形外的任何像素变暗并使内部变亮。然后将该着色器设置为所有UI对象。

    <强> Editted:

    这只是另一种简单方法,使用UI顶点效果。只需要实现IsPointInsideClipRect,将此组件放入UI对象,并设置矩形列表:

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine.UI;
    
    [AddComponentMenu("UI/Effects/Clip")]
    public class Clip : BaseVertexEffect
    
    {
        // We need list of rectangles here - can be an array of RectTransform
        public RectTransform[] ClipRects;
    
        public override void ModifyVertices(List<UIVertex> vertexList)
        {
            if (!IsActive())
            {
                return;
            }
    
            bool isClipped = true;
    
            for (int i = 0; i < count; i++)
            {
                UIVertex uiVertex = vertexList[i];
    
                foreach (RectTransform rect in ClipRects)
                {
                    if (IsPointInsideClipRect(rect, uiVertex.position)) 
                    {
                        isClipped = false;
                        break;
                    }
                }           
            }
    
            Color32 color = isClipped ? new Color32(0.5f, 0.5f, 0.5f, 0.5f) : new Color(1.0f, 1.0f, 1.0f, 1.0f);
            for (int i = 0; i < count; i++)
            {
                UIVertex uiVertex = vertexList[i];
                uiVertex.color = color;
            }
        }
    
        private static bool IsPointInsideClipRect(RectTransform rect, Vector3 position)
        {
            // ...
        }
    }