【游戏技术群】959392658  【游戏出海群】12067810
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2393

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

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

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

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

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

116

主题

551

帖子

6760

积分

Rank: 9Rank: 9Rank: 9

UID
3579
好友
106
蛮牛币
4736
威望
0
注册时间
2013-9-10
在线时间
1442 小时
最后登录
2019-1-1

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

1

主题

98

帖子

682

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

7日久生情
1694/5000
排名
3029
昨日变化
1

5

主题

888

帖子

1694

积分

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

UID
246489
好友
1
蛮牛币
2642
威望
0
注册时间
2017-9-28
在线时间
325 小时
最后登录
2019-1-2

活力之星

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

回复

使用道具 举报

7日久生情
1731/5000
排名
17570
昨日变化
2

4

主题

761

帖子

1731

积分

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

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

回复 支持 反对

使用道具 举报

排名
14279
昨日变化
1

1

主题

6

帖子

91

积分

Rank: 2Rank: 2

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

回复 支持 反对

使用道具 举报

排名
147
昨日变化

1

主题

548

帖子

3847

积分

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

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

回复 支持 反对

使用道具 举报

7日久生情
2689/5000
排名
392
昨日变化
1

6

主题

126

帖子

2689

积分

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

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

回复

使用道具 举报

7日久生情
2900/5000
排名
490
昨日变化
2

29

主题

436

帖子

2900

积分

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

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

回复 支持 反对

使用道具 举报

5熟悉之中
840/1000
排名
3652
昨日变化
1

9

主题

84

帖子

840

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

7日久生情
1917/5000
排名
4407
昨日变化
2

0

主题

1333

帖子

1917

积分

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

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

回复

使用道具 举报

3偶尔光临
287/300
排名
17141
昨日变化
4

0

主题

56

帖子

287

积分

Rank: 3Rank: 3Rank: 3

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

回复 支持 反对

使用道具 举报

7日久生情
2005/5000
排名
860
昨日变化

1

主题

124

帖子

2005

积分

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

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

回复 支持 反对

使用道具 举报

5熟悉之中
734/1000
排名
3606
昨日变化
1

0

主题

77

帖子

734

积分

Rank: 5Rank: 5

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

回复

使用道具 举报

排名
25111
昨日变化
13

0

主题

8

帖子

49

积分

Rank: 1

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

回复 支持 反对

使用道具 举报

5熟悉之中
886/1000
排名
2542
昨日变化
7

1

主题

61

帖子

886

积分

Rank: 5Rank: 5

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

回复 支持 反对

使用道具 举报

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

本版积分规则

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