Unity遮挡透明渐变

遮挡透明若没有渐变实现方法:

  1、透明中物体存在list中

  2、每过一段时间(可以每帧,但是流畅性会降低)摄像机发送一条射线向玩家,out hitInfo

  3、list与hitInfo比对,将在list中但是没有在hitInfo中的物体转变成不透明,list.remove;将在hitInfo中但是没有在list中转变成透明,list.add

若有渐变,实现比较麻烦一点,物体有两个状态:转变成透明过程中、转变成不透明过程中,添加两个list(InTransparent,outTransparent)对应两种状态,那么维护两个list即可:

  1、未遮挡->遮挡,查看outTransparent,如果有该物体,从outTransparent移入InTransparent,outTransparent  remove;如果没有添加新的加入InTransparent

  2、遮挡->未遮挡,查看InTransparent,如果有该物体,从InTransparent移入outTransparent,InTransparent remove;如果没有添加新的加入outTransparent

摄像机CameraFollow.cs:

 1 public class CameraFollow : MonoBehaviour
 2 {
 3
 4     public static CameraFollow instance;
 5     public Transform Player;
 6
 7     public List<CameraMaskInfo> Mask;
 8     public List<CameraMaskInfo> InTransparentList;
 9     public List<CameraMaskInfo> OutTransparentList;
10
11     RaycastHit[] hitInfo;
12
13     void Awake()
14     {
15         instance = this;
16     }
17     void Start()
18     {
19         StartCoroutine(IEMask());
20     }
21     public void ClearMask()
22     {
23         Mask.Clear();
24         InTransparentList.Clear();
25         OutTransparentList.Clear();
26     }
27
28     IEnumerator IEMask()
29     {
30         while (true)
31         {
32             hitInfo = Physics.CapsuleCastAll(FollowTarget.position + Vector3.up * 0.2f, FollowTarget.position - Vector3.up * 0.1f, 0.2f, (transform.position - FollowTarget.position).normalized, 100f, layerMask);
33             bool flag;
34             for (int i = Mask.Count - 1; i >= 0; i--)
35             {
36                 flag = false;
37                 for (int j = 0; j < hitInfo.Length; j++)
38                 {
39                     if (Mask[i].GetObj() == hitInfo[j].collider.gameObject)
40                     {
41                         flag = true;
42                         break;
43                     }
44                 }
45                 if (!flag)
46                 {
47                     Mask[i].PutOutTransparent();
48                     Mask.RemoveAt(i);
49                 }
50             }
51
52             for (int i = 0; i < hitInfo.Length; i++)
53             {
54                 flag = false;
55                 for (int j = 0; j < Mask.Count; j++)
56                 {
57                     if (hitInfo[i].collider.gameObject == Mask[j].GetObj())
58                     {
59                         flag = true;
60                         break;
61                     }
62                 }
63                 if (!flag)
64                 {
65                     CameraMaskInfo maskInfo = new CameraMaskInfo(hitInfo[i].collider.gameObject);
66                     maskInfo.PutInTransparent();
67                     Mask.Add(maskInfo);
68                 }
69             }
70         }
71         yield return new WaitForSeconds(0.2f);
72     }
73
74     void Update()
75     {
76         for (int i = InTransparentList.Count - 1; i >= 0; i--)
77         {
78             InTransparentList[i].Sub();
79         }
80
81         for (int i = OutTransparentList.Count - 1; i >= 0; i--)
82         {
83             OutTransparentList[i].Add();
84         }
85     }
86 }

遮挡物体CameraMaskInfo.cs:

using UnityEngine;
using System.Collections;

public class CameraMaskInfo
{

    private GameObject obj;
    private Shader[] preMaterialShader;
    public bool isDestroy;
    #region get
    public GameObject GetObj()
    {
        return obj;
    }

    public Shader[] GetpreMaterialShader()
    {
        return preMaterialShader;
    }
    #endregion

    public CameraMaskInfo(GameObject obj)
    {
        this.obj = obj;
    }

    public void PutInTransparent()
    {
        int id = -1;
        for (int i = 0; i < CameraFollow.instance.OutTransparentList.Count; i++)
        {
            if (CameraFollow.instance.OutTransparentList[i].GetObj() == obj)
            {
                id = i;
                //如果在out里面有,那么说明该物体的shader已经被改变,只能从之前的获得
                preMaterialShader = CameraFollow.instance.OutTransparentList[i].GetpreMaterialShader();
                CameraFollow.instance.InTransparentList.Add(CameraFollow.instance.OutTransparentList[i]);
                CameraFollow.instance.OutTransparentList.RemoveAt(i);
                break;
            }
        }
        if (id==-1)
        {
            preMaterialShader = new Shader[obj.renderer.materials.Length];
            for (int i = 0; i < obj.renderer.materials.Length; i++)
            {
                preMaterialShader[i] = obj.renderer.materials[i].shader;
                obj.renderer.materials[i].shader = Shader.Find("Transparent/Diffuse");
            }
            CameraFollow.instance.InTransparentList.Add(this);
        }
    }

    public void PutOutTransparent()
    {
        int id = -1;
        for (int i = 0; i < CameraFollow.instance.InTransparentList.Count; i++)
        {
            if (CameraFollow.instance.InTransparentList[i].GetObj() == obj)
            {
                id = i;
                CameraFollow.instance.OutTransparentList.Add(CameraFollow.instance.InTransparentList[i]);
                CameraFollow.instance.InTransparentList.RemoveAt(i);
                break;
            }
        }
        if (id == -1)
        {
            CameraFollow.instance.OutTransparentList.Add(this);
        }
    }

    public void Add()
    {
        for (int i = 0; i < obj.renderer.materials.Length; i++)
        {
            obj.renderer.materials[i].color = new Color(obj.renderer.materials[i].color.r, obj.renderer.materials[i].color.g, obj.renderer.materials[i].color.b, obj.renderer.materials[i].color.a + Time.deltaTime * 2f);
        }
        if (obj.renderer.materials[0].color.a >= 0.95f)
        {
            for (int i = 0; i < obj.renderer.materials.Length; i++)
            {
                obj.renderer.materials[i].color = new Color(obj.renderer.materials[i].color.r, obj.renderer.materials[i].color.g, obj.renderer.materials[i].color.b, 1f);
            }
            SetPreShader();
            CameraFollow.instance.OutTransparentList.Remove(this);
        }
    }

    public void Sub()
    {
        for (int i = 0; i < obj.renderer.materials.Length; i++)
        {
            obj.renderer.materials[i].color = new Color(obj.renderer.materials[i].color.r, obj.renderer.materials[i].color.g, obj.renderer.materials[i].color.b, obj.renderer.materials[i].color.a - Time.deltaTime * 2f);
        }
        if (obj.renderer.materials[0].color.a <= 0.3f)
        {
            CameraFollow.instance.InTransparentList.Remove(this);
        }
    }

    private void SetPreShader()
    {
        for (int i = 0; i < obj.renderer.materials.Length; i++)
        {
            obj.renderer.materials[i].shader = preMaterialShader[i];
        }
    }
}

效果:

时间: 2024-10-12 13:11:54

Unity遮挡透明渐变的相关文章

UnityShader之遮挡透明

好久没写博客了,最近在学shader,不得不说,shader真的非常美妙,我沉迷其中无法自拔= = 之前做过一个遮挡透明的功能,当物体遮挡住主角时,该物体会变成半透明显示出主角.这次同样是遮挡透明的功能,不过,变透明的刚刚相反,是主角变成半透明,更严谨的说是主角被遮挡的那一部分变成半透明. 先放出结果图: 当被遮挡时,遮挡部分透明处理,那么需要涉及渲染深度的知识.引擎是如何判断哪个物体在前面哪个物体在后面呢? 深度:每个像素有自己的深度值,离摄像机近的深度小,远的深度大 深度缓冲区:存储每个像素

css:设置div边框透明+渐变

写作背景: 觅兼职--登陆页面,UI给的原型图很漂亮,其中有一个图要求div外面有一圈透明度为0.37且带有渐变的边框.效果图如下: 在写的时候遇到了一点小小的问题:无法给同一个div设置圆角的透明+渐变边框.但是,又不能不做是不是,费了一番心思查资料,下面是解决方案: 1.分成两个div叠加的形式 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"&g

几句话实现导航栏透明渐变 – iOS

首先我们来看下效果 一开始当我们什么只设置了一张图片作为它的头部视图的时候,它是这样的 首当其冲的,我们先得把导航栏弄透明 那么我们首先得知道,设置navigationBar的BackgroundColor为Clear是没用的,你可以试着设置它的clear,但是没用,原因一会儿我们就知道了 而对于把导航栏设置为透明,网上大多数的方法是 [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarM

【Unity】透明度渐变

效果图如下: 代码; using System.Collections; using System.Collections.Generic; using UnityEngine; public class TransEffect : MonoBehaviour { public List<GoInfo> GoList; public float varifySpeed = 0.5f; public float aTime = 5f;//每个物体保持出现的时间 public float dTim

iOS导航栏背景透明渐变

重点分析: 1.隐藏导航的最下面的线. 2.设置导航背景的不透明度(ios7.0以上不用设置,translucent默认的就是Yes不用修改,但如果别人修改了或出现那种情况,需要设置为Yes). 3.页面消失时导航恢复原样. 4.滚动时调用方法设置alpha来控制导航背景的渐变(也是核心,重点在这里). 核心代码如下: 1.将颜色转换为图片 - (UIImage *)imageWithColor:(UIColor *)color { //创建1像素区域并开始图片绘图 CGRect rect =

Unity 游戏开发技巧集锦之创建透明的材质

Unity 游戏开发技巧集锦之创建透明的材质 Unity创建透明的材质 生活中不乏透明或者半透明的事物.例如,擦的十分干净的玻璃,看起来就是透明的:一些塑料卡片,看起来就是半透明的,如图3-23所示.在Unity中,可以创建模拟了透明效果的材质,这也是本节主要讲解的内容. 图3-23  半透明的卡片 Unity创建并配置材质 在Project视图里,创建一个材质,并命名为TransMaterial,选中它然后在Inspector视图里修改Shader属性为Transparent/Diffuse,

Unity Shader实现描边效果

http://gad.qq.com/article/detail/28346 描边效果是游戏里面非常常用的一种效果,一般是为了凸显游戏中的某个对象,会给对象增加一个描边效果.本篇文章和大家介绍下利用Shader实现描边效果,一起来看看吧. 最近又跑回去玩了玩<剑灵>,虽然出了三年了,感觉在现在的网游里面画面仍然算很好的了,剑灵里面走近或者选中NPC的一瞬间,NPC就会出现描边效果,不过这个描边效果是渐变的,会很快减弱最后消失(抓了好久才抓住一张图....) 还有就是最常见的LOL中的塔,我们把

【Unity】2.7 检视器(Inspector)

分类:Unity.C#.VS2015 创建日期:2016-03-31 一.简介 Unity中的游戏是以包含网格.脚本.声音或灯光 (Lights) 等其他图形元素的多个游戏对象 (GameObjects) 组成.检视器 (Inspector) 显示当前所选游戏对象 (GameObjects) 的详细信息,包括所有附加组件 (Components) 及其属性. Inspector视图用于显示在游戏场景中当前所选择对象的详细信息,以及游戏整体的属性设置,包括对象的名称.标签.位置坐标.旋转角度.缩放

CSS3 线性渐变(linear-gradient) 兼容IE8,IE9

一.线性渐变在 Mozilla 下的应用     语法: 1 -moz-linear-gradient( [<point> || <angle>,]? <stop>, <stop> [, <stop>]* ) 参数:其共有三个参数,第一个参数表示线性渐变的方向,top 是从上到下.left 是从左到右,如果定义成 left top,那就是从左上角到右下角.第二个和第三个参数分别是起点颜色和终点颜色.你还可以在它们之间插入更多的参数,表示多种颜色的