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

扫一扫,访问微社区

开发者专栏

关注:2286

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

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

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

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

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

112

主题

543

帖子

6564

积分

Rank: 9Rank: 9Rank: 9

UID
3579
好友
102
蛮牛币
4023
威望
0
注册时间
2013-9-10
在线时间
1384 小时
最后登录
2018-8-15

专栏作家社区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熟悉之中
628/1000
排名
13571
昨日变化
2

1

主题

94

帖子

628

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

7日久生情
1602/5000
排名
3114
昨日变化
4

3

主题

862

帖子

1602

积分

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

UID
246489
好友
1
蛮牛币
2659
威望
0
注册时间
2017-9-28
在线时间
305 小时
最后登录
2018-8-14

活力之星

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

回复

使用道具 举报

6蛮牛粉丝
1480/1500
排名
25305
昨日变化
8

3

主题

736

帖子

1480

积分

Rank: 6Rank: 6Rank: 6

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

回复 支持 反对

使用道具 举报

排名
14910
昨日变化
8

1

主题

5

帖子

74

积分

Rank: 2Rank: 2

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

回复 支持 反对

使用道具 举报

排名
130
昨日变化

1

主题

543

帖子

3717

积分

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

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

回复 支持 反对

使用道具 举报

7日久生情
2555/5000
排名
399
昨日变化

6

主题

125

帖子

2555

积分

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

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

回复

使用道具 举报

7日久生情
2588/5000
排名
607
昨日变化
1

28

主题

421

帖子

2588

积分

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

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

回复 支持 反对

使用道具 举报

5熟悉之中
606/1000
排名
4904
昨日变化
31

9

主题

72

帖子

606

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

7日久生情
1906/5000
排名
4251
昨日变化
2

0

主题

1334

帖子

1906

积分

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

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

回复

使用道具 举报

3偶尔光临
267/300
排名
16686
昨日变化
3

0

主题

51

帖子

267

积分

Rank: 3Rank: 3Rank: 3

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

回复 支持 反对

使用道具 举报

7日久生情
1787/5000
排名
1023
昨日变化
1

1

主题

116

帖子

1787

积分

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

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

回复 支持 反对

使用道具 举报

5熟悉之中
534/1000
排名
4502
昨日变化
28

0

主题

63

帖子

534

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

排名
23851
昨日变化
13

0

主题

8

帖子

48

积分

Rank: 1

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

回复 支持 反对

使用道具 举报

5熟悉之中
658/1000
排名
3482
昨日变化
17

1

主题

58

帖子

658

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

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

本版积分规则

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