找回密码
 注册帐号

扫一扫,访问微社区

zhang273162308 Unity&Shader案例篇—光锥扫描效果

214
回复
4000
查看
  [ 复制链接 ]
排名
141
昨日变化

121

主题

567

帖子

6910

积分

Rank: 9Rank: 9Rank: 9

UID
3579
好友
108
蛮牛币
5226
威望
0
注册时间
2013-9-10
在线时间
1489 小时
最后登录
2019-5-20

专栏作家活力之星游戏蛮牛QQ群会员蛮牛哥

2019-2-21 16:28:12 显示全部楼层 阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
一、介绍
      在Unity2018.2.14上,一个实现展示敌方视线扇形光锥效果的Shader,其效果图如图所示,当然这种效果还只是实现了一个视线光锥的简单效果
Cone.png
当这个视线光锥开始扫描的时候,为了表达更加真实的效果,在出现扫描到障碍物的时候,会出现光线被遮挡的效果。如图所示:当光锥扫描到前面的障碍物的时候,会出现光线被遮挡的效果。
ConeOfSigh.gif
二、实现
1、简单半透明扫描扇形光锥Shader代码
游客,如果您要查看本帖隐藏内容请回复


这个Shader只是实现了静态的扇形扫描光锥效果,接下来还有实现光锥转动的时候扫描到障碍物时候的效果。
2、动态扫描
先将光锥的角度进行微分处理,每个单位角度的方向指定距离处得到一个点。由物体向该点发射一个射线,进行射线检测。射线碰到有碰撞体的物体就会得到一个碰撞点,然后将点与扫描半径的比值赋给Shader代码里的深度缓存数组  m_aDepthBuffer。如果没有碰撞到障碍物则赋值为-1。在Shader代码里
[AppleScript] 纯文本查看 复制代码
// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'


Shader "ShaderPack/ConeOfSight" {
        Properties{
                _Color("Color",Color) = (1,1,1,1)
                _SightAngle("SightAngle",Float) = 0.5
                _FarHardness("FarHardness",Float) = 0.5
                _RangeHardness("RangeHardness",Range(0,100)) = 5
                _RangeStep("RangeStep",Range(0,1)) = 0.7
                _SourceWhiteness("SourceWhiteness",Range(0,1)) = 1
                //_SourceGlow("SourceGlow",Range(1,10)) = 1
        }

                SubShader{
                        Tags {
                                "Queue" = "Transparent"
                                "RenderType" = "Transparent"
                        }
                        Blend SrcAlpha OneMinusSrcAlpha

                        Pass{
                                ZWrite Off
                                CGPROGRAM

                                #pragma vertex vert
                                #pragma fragment frag

                                #include "UnityCG.cginc"

                                struct v2f {
                                        float4 position : SV_POSITION;
                                        float4 uv : TEXCOORD0;
                                };

                                half4 _Color;
                                half _SightAngle;
                                half _FarHardness;
                                half _RangeHardness;
                                half _RangeStep;
                                half _SourceWhiteness;
                                //half _SourceGlow;

                                //uniform half _CurrentAngle = 0;
                                //int _BufferSize = 64;
                                uniform float _SightDepthBuffer[256];

                                //Vertex
                                v2f vert(appdata_base IN) {
                                        v2f o;
                                        o.position = UnityObjectToClipPos(IN.vertex);
                                        o.uv = IN.texcoord;
                                        return o;
                                }

                                //Fragment
                                fixed4 frag(v2f IN) : SV_Target{
                                        const float PI = 3.14159;

                                        IN.uv.x -= 0.5f;
                                        IN.uv.y -= 0.5f;
                                        half distcenter = 1 - sqrt(IN.uv.x*IN.uv.x + IN.uv.y*IN.uv.y) * 2;

                                        half2 fragmentDir = normalize(IN.uv.xy);
                                        half viewDotPos = clamp(dot(half2(1,0), fragmentDir),0,1);
                                        half sightAngleRads = _SightAngle / 2 * PI / 180;
                                        half sightVal = cos(sightAngleRads);

                                        half4 col = lerp(_Color,half4(1,1,1,1),distcenter*_SourceWhiteness);
                                        col.a *= pow(viewDotPos / sightVal,_RangeHardness) *distcenter * pow(distcenter,_FarHardness);

                                        //col.a *= clamp(distcenter*abs(pow(col.a,-_FarHardness*10)),0,1);
                                        if (viewDotPos < sightVal) 
                                        {
                                                col.a *= _RangeStep;
                                        }
                                        else 
                                        {
                                                // --- Depth check
                                                float fragmentAngle = asin(fragmentDir.y) + sightAngleRads;
                                                float fragmentVal = 1.0f - (fragmentAngle) / (sightAngleRads * 2);
                                                int index = fragmentVal * 256;
                                                if (_SightDepthBuffer[index] > 0 && (1 - distcenter) > _SightDepthBuffer[index])
                                                        col *= 0;
                                        }

                                        col.a *= _Color.a;
                                        return col;
                                }

                                ENDCG
                        }
        }

}



进行判断的时候就会将碰撞到障碍物的后面的透明度都设置为0,这样就实现了光线被遮挡的效果。代码如下:
游客,如果您要查看本帖隐藏内容请回复

三、总结
1、实现了光锥扫描到障碍物的动态效果
2、不足之处是该扫描效果紧紧是水平面的效果,不能做到立体的效果
3、工程下载地址
游客,如果您要查看本帖隐藏内容请回复



回复

使用道具 举报

2初来乍到
123/150
排名
18790
昨日变化

1

主题

35

帖子

123

积分

Rank: 2Rank: 2

UID
218899
好友
1
蛮牛币
253
威望
0
注册时间
2017-4-22
在线时间
55 小时
最后登录
2019-3-26
2019-2-21 16:55:48 显示全部楼层
来学习学习,打算做一个俯视视角的游戏需要这样的功能
回复 支持 反对

使用道具 举报

3偶尔光临
284/300
排名
7735
昨日变化

0

主题

24

帖子

284

积分

Rank: 3Rank: 3Rank: 3

UID
250515
好友
0
蛮牛币
122
威望
0
注册时间
2017-10-24
在线时间
98 小时
最后登录
2019-5-22
2019-2-21 17:20:49 显示全部楼层
来学习学习,打算做一个俯视视角的游戏需要这样的功能
回复 支持 反对

使用道具 举报

3偶尔光临
171/300
排名
11371
昨日变化

2

主题

25

帖子

171

积分

Rank: 3Rank: 3Rank: 3

UID
116279
好友
0
蛮牛币
581
威望
0
注册时间
2015-8-2
在线时间
56 小时
最后登录
2019-2-21
2019-2-21 17:22:04 显示全部楼层
6666666666666666
回复 支持 反对

使用道具 举报

3偶尔光临
171/300
排名
11371
昨日变化

2

主题

25

帖子

171

积分

Rank: 3Rank: 3Rank: 3

UID
116279
好友
0
蛮牛币
581
威望
0
注册时间
2015-8-2
在线时间
56 小时
最后登录
2019-2-21
2019-2-21 17:24:45 显示全部楼层
不错,学习6666666666
回复 支持 反对

使用道具 举报

3偶尔光临
171/300
排名
11371
昨日变化

2

主题

25

帖子

171

积分

Rank: 3Rank: 3Rank: 3

UID
116279
好友
0
蛮牛币
581
威望
0
注册时间
2015-8-2
在线时间
56 小时
最后登录
2019-2-21
2019-2-21 17:26:50 显示全部楼层
学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习学习
回复 支持 反对

使用道具 举报

7日久生情
2022/5000
排名
1896
昨日变化

41

主题

741

帖子

2022

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
214924
好友
4
蛮牛币
18266
威望
0
注册时间
2017-3-28
在线时间
524 小时
最后登录
2019-5-22
2019-2-21 17:44:00 显示全部楼层
回复 支持 反对

使用道具 举报

7日久生情
2222/5000
排名
1089
昨日变化

30

主题

322

帖子

2222

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
82788
好友
25
蛮牛币
7503
威望
0
注册时间
2015-3-21
在线时间
808 小时
最后登录
2019-5-23
2019-2-21 17:58:09 显示全部楼层
这个好,谢谢楼主
回复

使用道具 举报

7日久生情
1636/5000
排名
1159
昨日变化

1

主题

67

帖子

1636

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
179667
好友
1
蛮牛币
6658
威望
0
注册时间
2016-10-31
在线时间
577 小时
最后登录
2019-5-24
2019-2-21 18:17:29 显示全部楼层
6+66666666666666
回复 支持 反对

使用道具 举报

8常驻蛮牛
5239/10000
排名
31
昨日变化

31

主题

540

帖子

5239

积分

Rank: 8Rank: 8

UID
47602
好友
5
蛮牛币
25380
威望
0
注册时间
2014-10-3
在线时间
1494 小时
最后登录
2019-5-24
2019-2-21 19:54:01 显示全部楼层
多谢版主分享,很好的资源。
回复 支持 反对

使用道具 举报

7日久生情
2258/5000
排名
1393
昨日变化

0

主题

701

帖子

2258

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
135463
好友
0
蛮牛币
71
威望
0
注册时间
2016-1-23
在线时间
667 小时
最后登录
2019-5-24
2019-2-21 21:16:26 显示全部楼层
66666666666666666666666
回复 支持 反对

使用道具 举报

7日久生情
2180/5000
排名
757
昨日变化

7

主题

268

帖子

2180

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
167044
好友
0
蛮牛币
3347
威望
0
注册时间
2016-9-6
在线时间
671 小时
最后登录
2019-5-23
2019-2-21 21:20:22 显示全部楼层
厉害了这个 看着很厉害
回复 支持 反对

使用道具 举报

7日久生情
1714/5000
排名
2263
昨日变化

0

主题

643

帖子

1714

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
182268
好友
2
蛮牛币
758
威望
0
注册时间
2016-11-9
在线时间
450 小时
最后登录
2019-4-22
2019-2-21 21:37:11 显示全部楼层
超神之路啊超神之路啊超神之路啊超神之路啊超神之路啊超神之路啊超神之路啊超神之路啊超神之路啊
回复 支持 反对

使用道具 举报

5熟悉之中
796/1000
排名
4012
昨日变化

1

主题

77

帖子

796

积分

Rank: 5Rank: 5

UID
14034
好友
0
蛮牛币
204
威望
0
注册时间
2014-2-10
在线时间
348 小时
最后登录
2019-5-23
2019-2-21 21:42:31 显示全部楼层
支持一下~~~~~~~~
回复

使用道具 举报

7日久生情
3005/5000
排名
515
昨日变化

0

主题

163

帖子

3005

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
57299
好友
3
蛮牛币
2094
威望
0
注册时间
2014-11-24
在线时间
1362 小时
最后登录
2019-5-22
2019-2-21 22:07:40 显示全部楼层
谢谢楼主分享!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则