游戏蛮牛学习群(纯技术交流,不闲聊):159852603
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2332

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 3318|回复: 103

[zhang273162308] Unity&Shader案例篇—角色动态地面印记

  [复制链接]  [移动端链接]
排名
143
昨日变化

114

主题

550

帖子

6666

积分

Rank: 9Rank: 9Rank: 9

UID
3579
好友
103
蛮牛币
4358
威望
0
注册时间
2013-9-10
在线时间
1413 小时
最后登录
2018-10-19

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

发表于 2018-5-7 18:06:32 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 zhang273162308 于 2018-5-7 18:08 编辑

一、介绍

    本篇要介绍的效果如图所示:角色在地形上行走,地形上始终会有一个动态圆环跟随角色,类似于阴影的一个效果,会根据地形的起伏动态变化。但是这


RGPRender1.gif   
个“阴影”是我们可以自己控制它的效果的,如图2所示是通过修改后得到的效果图:圆环是有一定频率别的收缩,这种效果在游戏中也是经常能用到,为了更好的
使用,我在Shader代码中还添加了光照。并且在控制面板上我们可以控制它的半径和颜色


RGPRender2.gif.gif

二,实现方法1、简单圆环版本这个效果还是简单点,基本思路就是在角色周围的位置处画一个有宽度的圆环,核心的Shader代码为:
[C#] 纯文本查看 复制代码
 float d = distance(_Center, IN.worldPos);  
            if (d > _Radius && d < _Radius + _RadiusWidth)  
                o.Albedo = _RadiusColor;  
            else  
                o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;  

这里的_Center,就是角色在世界坐标系下的位置,C#的穿参数代码为:
[C++] 纯文本查看 复制代码
using UnityEngine;

[ExecuteInEditMode]
public class Radius : MonoBehaviour {

    public Material radiusMaterial;
    public float radius = 1;
    public Color color = Color.white;

    // Use this for initialization
    void Start () {
        
        }
        
    //每帧更新shader中的参数值
        // Update is called once per frame
        void Update () {
        radiusMaterial.SetVector("_Center", transform.position);
        radiusMaterial.SetFloat("_Radius", radius);
        radiusMaterial.SetColor("_RadiusColor", color);
    }
}
2、圆环宽度和周期变化基本思路跟上面是一样的,只不过在对圆环宽带的变化上做了正弦周期处理,并且将预设的颜色随着圆心向外做了渐变处理,这样处理的目的是使得效果会更加自然,最后将光照计算也加上就可以在实际的应用中使用了。犹如一道完整的菜一样做好了,完整的Shader代码为:
[C#] 纯文本查看 复制代码
// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'

// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'

Shader "Unlit/RPGGroundRender"
{
        Properties{
                _MainTex("Albedo (RGB)", 2D) = "white" {}
        _Center("Center", Vector) = (0,0,0,0)
                _Radius("Radius",Float) = 0.5
                _RadiusColor("Radius Color",Color) = (1,0,0,1)
                _RadiusWidth("Radius Width",Float) = 2
                _RadiusPower("RadiusPower",Range(0,10)) = 2
                _RadiusSpeed("RadiusSpeed",Range(0,10)) = 50
        }
                SubShader
        {
                Tags { "RenderType" = "Opaque" "PreviewType"="Plane" }
                LOD 200

                Pass
                {
                        CGPROGRAM
                        #pragma vertex vert
                        #pragma fragment frag

                        #pragma target 3.0

                        #include "UnityCG.cginc"

                        //光源的颜色,Unity的Lighting.cginc文件中包含这个
                        float4 _LightColor0;

                        sampler2D _MainTex;
                        float3 _Center;
                        float _Radius;
                        fixed4 _RadiusColor;
                        float _RadiusWidth;
                        float _RadiusPower;
                        float _RadiusSpeed;

                        struct vertexInput {
                                float4 vertex : POSITION;
                                float3 normal : NORMAL;
                                float4 tex:TEXCOORD0;
                        };
                        struct vertexOutput {
                                float4 pos:SV_POSITION;
                                float4 worldPos : TEXCOORD1;
                                float4 col : COLOR;
                                float4 tex:TEXCOORD0;
                        };

                        //顶点程序部分增加了计算光照的部分
                        vertexOutput vert(vertexInput input)
                        {
                                vertexOutput output;

                                float4x4 modelMatrix = unity_ObjectToWorld;
                                float4x4 modelMatrixInverse = unity_WorldToObject;

                                float3 normalDirection = normalize(
                                        mul(float4(input.normal, 0.0), modelMatrixInverse).xyz);
                                float3 lightDirection = normalize(_WorldSpaceLightPos0.xyz);

                                float3 diffuseReflection = _LightColor0.rgb * max(0.0, dot(normalDirection, lightDirection));

                                output.col = float4(diffuseReflection, 1.0);
                                output.pos= UnityObjectToClipPos(input.vertex);
                                output.worldPos = mul(unity_ObjectToWorld, input.vertex);
                                output.tex = input.tex;
                                return output;
                        }

                        float4 frag(vertexOutput input) : COLOR
                        {
                                float d = distance(_Center,input.worldPos.xyz);
                                float tempRadiusWidth = _RadiusWidth*abs(sin(_Time.y*_RadiusSpeed));

                                float4 texCol = tex2D(_MainTex, input.tex.xy);
                                float4 col = texCol;
                                if (d > _Radius&&d < _Radius + tempRadiusWidth)
                                {
                                        col.rgb = texCol.rgb + _RadiusColor*pow(d / (_Radius + tempRadiusWidth), _RadiusPower);
                                }
                                else
                                {
                                        col.rgb = texCol.rgb;
                                }
                                
                                return col;
                        }
                        ENDCG
                }
        }
}

C#的控制传参数代码为:
[C#] 纯文本查看 复制代码
using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
public class RPGRenderControl : MonoBehaviour {

   
    public Material radiusMaterial;
    public Color color = Color.white;
    public float radius = 10f;
    public float radiusWidth = 2f;
    public float power = 5f;
    public float speed = 60f;
    // Use this for initialization
    void Start () {
        
        }
        
    
        // Update is called once per frame
    //保持渲染位置时刻都跟踪这个对象
        void Update () {

        radiusMaterial.SetVector("_Center", transform.position);
        radiusMaterial.SetColor("_RadiusColor", color);
        radiusMaterial.SetFloat("_Radius", radius);
        radiusMaterial.SetFloat("_RadiusWidth", radiusWidth);
        radiusMaterial.SetFloat("_RadiusPower", power);
        radiusMaterial.SetFloat("_RadiusSpeed", speed);

    }
}

三、总结总的来说,效果还是挺实用的,思路和代码也没有过分复杂,唯一我认为还有需要拓展的地方是怎么让这个效果画在地形上,最近也在研究这方面的东西。完整的工程地址为:
游客,如果您要查看本帖隐藏内容请回复

评分

参与人数 1鲜花 +5 收起 理由
public + 5 感谢大佬~正对这个没有思路呢

查看全部评分


回复

使用道具 举报

5熟悉之中
667/1000
排名
13616
昨日变化
10

1

主题

97

帖子

667

积分

Rank: 5Rank: 5

UID
1944
好友
3
蛮牛币
1233
威望
0
注册时间
2013-8-13
在线时间
512 小时
最后登录
2018-10-19
发表于 2018-5-7 18:37:02 | 显示全部楼层
看样子不错
[发帖际遇]: lzqlawrence 发帖时在路边捡到 2 蛮牛币,偷偷放进了口袋. 幸运榜 / 衰神榜

回复

使用道具 举报

7日久生情
1631/5000
排名
3081
昨日变化
4

3

主题

867

帖子

1631

积分

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

UID
246489
好友
1
蛮牛币
2708
威望
0
注册时间
2017-9-28
在线时间
311 小时
最后登录
2018-10-11

活力之星

发表于 2018-5-7 19:18:34 | 显示全部楼层
谢谢分享,nice

回复

使用道具 举报

7日久生情
1603/5000
排名
18504
昨日变化
12

4

主题

759

帖子

1603

积分

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

UID
63377
好友
0
蛮牛币
67
威望
0
注册时间
2014-12-24
在线时间
810 小时
最后登录
2018-10-19
发表于 2018-5-7 19:31:55 | 显示全部楼层
很不错坚实的发生绝代风华万恶

回复 支持 反对

使用道具 举报

排名
14102
昨日变化
271

1

主题

6

帖子

87

积分

Rank: 2Rank: 2

UID
224066
好友
0
蛮牛币
588
威望
0
注册时间
2017-5-28
在线时间
26 小时
最后登录
2018-10-20
发表于 2018-5-7 21:04:47 | 显示全部楼层
好奇貼齊地面的部分

回复 支持 反对

使用道具 举报

排名
130
昨日变化

1

主题

547

帖子

3822

积分

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

UID
16458
好友
7
蛮牛币
5320
威望
0
注册时间
2014-3-5
在线时间
1012 小时
最后登录
2018-10-21
发表于 2018-5-7 21:06:34 | 显示全部楼层
RE: Unity&Shader案例篇—角色动态地面印记 [修改]

回复 支持 反对

使用道具 举报

7日久生情
2623/5000
排名
395
昨日变化
1

6

主题

126

帖子

2623

积分

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

UID
65021
好友
0
蛮牛币
2274
威望
0
注册时间
2015-1-1
在线时间
879 小时
最后登录
2018-10-19
QQ
发表于 2018-5-7 22:42:50 | 显示全部楼层
谢谢分享!!!!!!!!!!
[发帖际遇]: public 在论坛发帖时没有注意,被小偷偷去了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

7日久生情
2704/5000
排名
555
昨日变化
4

28

主题

423

帖子

2704

积分

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

UID
55374
好友
17
蛮牛币
5197
威望
0
注册时间
2014-11-14
在线时间
877 小时
最后登录
2018-10-20
QQ
发表于 2018-5-8 08:26:18 | 显示全部楼层
感谢分享感谢分享

回复 支持 反对

使用道具 举报

5熟悉之中
715/1000
排名
4153
昨日变化
21

9

主题

75

帖子

715

积分

Rank: 5Rank: 5

UID
202690
好友
5
蛮牛币
918
威望
0
注册时间
2017-1-17
在线时间
277 小时
最后登录
2018-10-19
发表于 2018-5-8 08:51:42 | 显示全部楼层
学习学习

回复

使用道具 举报

7日久生情
1912/5000
排名
4296
昨日变化
4

0

主题

1335

帖子

1912

积分

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

UID
267381
好友
6
蛮牛币
3205
威望
0
注册时间
2018-2-1
在线时间
257 小时
最后登录
2018-10-6
发表于 2018-5-8 08:58:06 | 显示全部楼层
谢谢分享

回复

使用道具 举报

3偶尔光临
272/300
排名
17048
昨日变化
10

0

主题

53

帖子

272

积分

Rank: 3Rank: 3Rank: 3

UID
202168
好友
0
蛮牛币
171
威望
0
注册时间
2017-1-15
在线时间
184 小时
最后登录
2018-9-30
发表于 2018-5-8 08:59:52 | 显示全部楼层
现在的shader是越来越受欢迎了呢

回复 支持 反对

使用道具 举报

7日久生情
1913/5000
排名
917
昨日变化
4

1

主题

124

帖子

1913

积分

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

UID
64809
好友
1
蛮牛币
2359
威望
0
注册时间
2014-12-31
在线时间
714 小时
最后登录
2018-10-21
发表于 2018-5-8 09:02:00 | 显示全部楼层
RE: Unity&Shader案例篇—角色动态地面印记 [修改]

回复 支持 反对

使用道具 举报

5熟悉之中
656/1000
排名
3879
昨日变化
7

0

主题

75

帖子

656

积分

Rank: 5Rank: 5

UID
229891
好友
0
蛮牛币
730
威望
0
注册时间
2017-7-2
在线时间
223 小时
最后登录
2018-10-17
发表于 2018-5-8 09:18:34 | 显示全部楼层
学习学习。

回复

使用道具 举报

排名
24361
昨日变化
4

0

主题

8

帖子

48

积分

Rank: 1

UID
250768
好友
0
蛮牛币
114
威望
0
注册时间
2017-10-25
在线时间
25 小时
最后登录
2018-8-16
发表于 2018-5-8 09:25:32 | 显示全部楼层
66666666666666666666666666

回复 支持 反对

使用道具 举报

5熟悉之中
757/1000
排名
3005
昨日变化
7

1

主题

61

帖子

757

积分

Rank: 5Rank: 5

UID
17590
好友
1
蛮牛币
583
威望
0
注册时间
2014-3-13
在线时间
235 小时
最后登录
2018-10-19
发表于 2018-5-8 09:25:55 | 显示全部楼层
这个好啊  先下载看看

回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表