找回密碼
 注冊帳號

掃一掃,訪問微社區

zhang273162308 Unity&Shader案例篇—光錐掃描效果

300
回復
15051
查看
打印 上一主題 下一主題
  [ 復制鏈接 ]
排名
139
昨日變化

125

主題

600

帖子

7154

積分

Rank: 9Rank: 9Rank: 9

UID
3579
好友
110
蠻牛幣
5993
威望
0
注冊時間
2013-9-10
在線時間
1713 小時
最后登錄
2020-11-25

專欄作家活力之星游戲蠻牛QQ群會員蠻牛哥

馬上注冊,結交更多好友,享用更多功能,讓你輕松玩轉社區。

您需要 登錄 才可以下載或查看,沒有帳號?注冊帳號

x
一、介紹
      在Unity2018.2.14上,一個實現展示敵方視線扇形光錐效果的Shader,其效果圖如圖所示,當然這種效果還只是實現了一個視線光錐的簡單效果

當這個視線光錐開始掃描的時候,為了表達更加真實的效果,在出現掃描到障礙物的時候,會出現光線被遮擋的效果。如圖所示:當光錐掃描到前面的障礙物的時候,會出現光線被遮擋的效果。

二、實現
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
排名
18795
昨日變化

1

主題

34

帖子

123

積分

Rank: 2Rank: 2

UID
218899
好友
1
蠻牛幣
253
威望
0
注冊時間
2017-4-22
在線時間
55 小時
最后登錄
2019-3-26
沙發
2019-2-21 16:55:48 只看該作者
來學習學習,打算做一個俯視視角的游戲需要這樣的功能
回復 支持 反對

使用道具 舉報

4四處流浪
369/500
排名
7737
昨日變化

0

主題

35

帖子

369

積分

Rank: 4

UID
250515
好友
0
蠻牛幣
5
威望
0
注冊時間
2017-10-24
在線時間
172 小時
最后登錄
2020-11-21
板凳
2019-2-21 17:20:49 只看該作者
來學習學習,打算做一個俯視視角的游戲需要這樣的功能
回復 支持 反對

使用道具 舉報

3偶爾光臨
165/300
排名
11373
昨日變化

2

主題

26

帖子

165

積分

Rank: 3Rank: 3Rank: 3

UID
116279
好友
0
蠻牛幣
630
威望
0
注冊時間
2015-8-2
在線時間
57 小時
最后登錄
2020-7-14
地板
2019-2-21 17:22:04 只看該作者
6666666666666666
回復 支持 反對

使用道具 舉報

3偶爾光臨
165/300
排名
11373
昨日變化

2

主題

26

帖子

165

積分

Rank: 3Rank: 3Rank: 3

UID
116279
好友
0
蠻牛幣
630
威望
0
注冊時間
2015-8-2
在線時間
57 小時
最后登錄
2020-7-14
5#
2019-2-21 17:24:45 只看該作者
不錯,學習6666666666
回復 支持 反對

使用道具 舉報

3偶爾光臨
165/300
排名
11373
昨日變化

2

主題

26

帖子

165

積分

Rank: 3Rank: 3Rank: 3

UID
116279
好友
0
蠻牛幣
630
威望
0
注冊時間
2015-8-2
在線時間
57 小時
最后登錄
2020-7-14
6#
2019-2-21 17:26:50 只看該作者
學習學習學習學習學習學習學習學習學習學習學習學習學習學習學習學習學習
回復 支持 反對

使用道具 舉報

7日久生情
2313/5000
排名
1894
昨日變化

65

主題

828

帖子

2313

積分

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

UID
214924
好友
9
蠻牛幣
27383
威望
0
注冊時間
2017-3-28
在線時間
704 小時
最后登錄
2020-8-27
7#
2019-2-21 17:44:00 只看該作者
回復 支持 反對

使用道具 舉報

排名
1087
昨日變化

33

主題

330

帖子

2959

積分

Rank: 9Rank: 9Rank: 9

UID
82788
好友
40
蠻牛幣
7691
威望
0
注冊時間
2015-3-21
在線時間
1302 小時
最后登錄
2020-11-18
8#
2019-2-21 17:58:09 只看該作者
這個好,謝謝樓主
回復

使用道具 舉報

7日久生情
1917/5000
排名
1157
昨日變化

1

主題

74

帖子

1917

積分

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

UID
179667
好友
1
蠻牛幣
6553
威望
0
注冊時間
2016-10-31
在線時間
850 小時
最后登錄
2020-11-17
9#
2019-2-21 18:17:29 只看該作者
6+66666666666666
回復 支持 反對

使用道具 舉報

8常駐蠻牛
5436/10000
排名
30
昨日變化

31

主題

546

帖子

5436

積分

Rank: 8Rank: 8

UID
47602
好友
8
蠻牛幣
26395
威望
0
注冊時間
2014-10-3
在線時間
1685 小時
最后登錄
2020-10-31
10#
2019-2-21 19:54:01 只看該作者
多謝版主分享,很好的資源。
回復 支持 反對

使用道具 舉報

7日久生情
2523/5000
排名
1385
昨日變化

0

主題

754

帖子

2523

積分

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

UID
135463
好友
0
蠻牛幣
191
威望
0
注冊時間
2016-1-23
在線時間
877 小時
最后登錄
2020-11-25
11#
2019-2-21 21:16:26 只看該作者
66666666666666666666666
回復 支持 反對

使用道具 舉報

7日久生情
2546/5000
排名
756
昨日變化

8

主題

329

帖子

2546

積分

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

UID
167044
好友
1
蠻牛幣
3337
威望
0
注冊時間
2016-9-6
在線時間
975 小時
最后登錄
2020-11-15
12#
2019-2-21 21:20:22 只看該作者
厲害了這個 看著很厲害
回復 支持 反對

使用道具 舉報

7日久生情
1714/5000
排名
2261
昨日變化

0

主題

641

帖子

1714

積分

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

UID
182268
好友
2
蠻牛幣
758
威望
0
注冊時間
2016-11-9
在線時間
450 小時
最后登錄
2019-4-22
13#
2019-2-21 21:37:11 只看該作者
超神之路啊超神之路啊超神之路啊超神之路啊超神之路啊超神之路啊超神之路啊超神之路啊超神之路啊
回復 支持 反對

使用道具 舉報

5熟悉之中
850/1000
排名
4012
昨日變化

1

主題

81

帖子

850

積分

Rank: 5Rank: 5

UID
14034
好友
0
蠻牛幣
25
威望
0
注冊時間
2014-2-10
在線時間
398 小時
最后登錄
2020-3-24
14#
2019-2-21 21:42:31 只看該作者
支持一下~~~~~~~~
回復

使用道具 舉報

7日久生情
3407/5000
排名
514
昨日變化

0

主題

160

帖子

3407

積分

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

UID
57299
好友
3
蠻牛幣
2104
威望
0
注冊時間
2014-11-24
在線時間
1765 小時
最后登錄
2020-11-25
15#
2019-2-21 22:07:40 只看該作者
謝謝樓主分享?。?!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊帳號

本版積分規則

内蒙古麻将app 北斗娱乐棋牌官方下载安装 天津体彩票十一选五 黑龙江十一选五计划推荐 独行侠vs灰熊 南昌麻将顺序 下载晓游游戏大厅 新金沙棋牌游戏官网 江苏体彩七位数开奖走势图 甘肃快三手机上怎么买 香港精选精准九肖中特 腾讯捕鱼来了贴吧 下载四川熊猫麻将 手机麻将作弊器哪个好 大富豪棋牌娱乐客服 广东十一选五计划大全 秒速时时彩技巧公式