上一篇文章(草地的顶点动画实现风吹草动)中我们通过模型的顶点动画来模拟了风吹草动的效果。今天我们在给他加上一个交互的效果,就是有角色或者其他物体在草地上走过时,草地会向周围散开。我们先看下草不动的时候向周围散开的样子。

其实实现方法也很简单,只要向Shader传递一下物体的坐标信息,然后在shader中用草的顶点坐标减去传递进来的物体坐标就可以得到草每个顶点散开的方向了。然后再通过一个半径的范围值来控制交互影响的范围,当然还是要通过UV的V方向的值来控制根部不动。

v2f vert (appdata v){v2f o;float4 worldPos = mul(unity_ObjectToWorld, v.vertex);//得到物体和草模型顶点之间的距离float dis = distance(_PlayerPos, worldPos);//通过影响范围,还有强度和UV的值来控制草的弯曲强度float pushDown = saturate((1 - dis + _PushRadius) * v.uv.y * _Strength);//计算出每个顶点散开的方向并做归一化处理float3 direction = normalize(worldPos.xyz - _PlayerPos.xyz);//减弱一些y轴向上的影响,否则很多草顶点会穿过地面direction.y *= 0.5;worldPos.xyz += direction * pushDown;o.pos = mul(UNITY_MATRIX_VP, worldPos);o.uv = v.uv;return o;}

是不是很简单,接下来我们再把这个加在之前的风吹草动上面就行了。shader代码如下:

Shader "Custom/GrassVertexAniInteractive"
{Properties{_MainTex ("Texture", 2D) = "white" {}_Noise("Noise", 2D) = "black" {}_WindControl("WindControl(x:XSpeed y:YSpeed z:ZSpeed w:windMagnitude)",vector) = (1,1,1,0.5)//前面几个分量表示在各个轴向上自身摆动的速度, w表示摆动的强度_WaveControl("WaveControl(x:XSpeed y:YSpeed z:ZSpeed w:worldSize)",vector) = (1,0,1,1)//前面几个分量表示在各个轴向上风浪的速度, w用来模拟地图的大小,值越小草摆动的越凌乱,越大摆动的越整体//_PlayerPos("PlayerPos", vector) = (0,0,0,0)//物体的位置坐标,需要在运行时通过C#代码传入,所以这里注释掉,把这个参数作为全局控制的参数_Strength("Strength", float) = 1//草地弯曲的强度_PushRadius("PushRadius", float) = 1//交互的范围}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_instancing#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;UNITY_VERTEX_INPUT_INSTANCE_ID};struct v2f{float2 uv : TEXCOORD0;float4 pos : SV_POSITION;};sampler2D _MainTex;sampler2D _Noise;half4 _WindControl;half4 _WaveControl;float4 _PlayerPos;half _Strength;half _PushRadius;v2f vert (appdata v){v2f o;UNITY_SETUP_INSTANCE_ID(v);//草地自身风吹草动的计算float4 worldPos = mul(unity_ObjectToWorld, v.vertex);float2 samplePos = worldPos.xz / _WaveControl.w;samplePos += _Time.x * -_WaveControl.xz;fixed waveSample = tex2Dlod(_Noise, float4(samplePos, 0, 0)).r;worldPos.x += sin(waveSample * _WindControl.x) * _WaveControl.x * _WindControl.w * v.uv.y;worldPos.z += sin(waveSample * _WindControl.z) * _WaveControl.z * _WindControl.w * v.uv.y;//草地交互的计算float dis = distance(_PlayerPos, worldPos);float pushDown = saturate((1 - dis + _PushRadius) * v.uv.y * _Strength);float3 direction = normalize(worldPos.xyz - _PlayerPos.xyz);direction.y *= 0.5;worldPos.xyz += direction * pushDown;o.pos = mul(UNITY_MATRIX_VP, worldPos);o.uv = v.uv;return o;}fixed4 frag (v2f i) : SV_Target{fixed4 col = tex2D(_MainTex, i.uv);return col;}ENDCG}}
}

在C# 代码中我们只要在Update里面把物体的位置传递给Shader 的_PlayerPos参数就行了

void Update(){playerPos = transform.position;Shader.SetGlobalVector("_PlayerPos" , playerPos);}

最后如果是大面积的草地顶点数量很多的时候,可以写两份Shader,一个是带交互的,一个是不带交互的。然后把草地分块再加上Trigger,默认都使用不带交互的Shader,当角色或物体进入到某块草地的Trigger时动态把这块草地的Shader替换成带交互的,这样Trigger以外的顶点都不会参与计算了。

unity lookat导致物体颠倒怎么解决_Unity草地交互的实现相关推荐

  1. unity lookat导致物体颠倒怎么解决_在Unity 2D中如何用一行代码实现LookAt的效果,以及向量归一化小总结...

    被疫情困在家无聊翻翻以前的文章,发现好黑历史啊,虽然是刚学unity的时候写的,后面学习了DX11并且补了3D数学,发现这些问题都是小case了O(∩_∩)O. 在我最近制作的小游戏中,需要实现防御塔 ...

  2. unity lookat导致物体颠倒怎么解决_爆款的诞生:《胡闹厨房2》的多人游戏模式解决方案...

    5月11日,由Unity主办的Unite Shanghai 2019开发者大会上,Team17技术总监David Smethurst以"爆款的诞生:<胡闹厨房2>的多人游戏模式解 ...

  3. unity 如何让物体不显示材质_unity如何把材质调透明

    unity透明贴图怎么设置显示 在Unity中,透明材质球不接受阴影.使用Transparent/Cutout/Bumped Diffuse材质,透明通道稍差但是接收阴影.同时对其Cast Shado ...

  4. Unity 判断两物体碰撞方向

    Unity 判断两物体碰撞方向 问题描述:游戏玩家可以在两个平面之间不断进行跳跃,且出现玩家顶着上面平面飞着走的情况. 问题原因:玩家碰撞体与平面不断进行碰撞体检测,导致游戏玩家可以不断进行跳跃. 解 ...

  5. Unity点击物体后,移动到物体所在位置

    Unity点击物体后,移动到物体所在位置 方法一:OnMouse检测(需要Collider组件) 脚本挂在被点击的物体上 using System.Collections.Generic; using ...

  6. Unity 多场景/大场景加载解决方法

    Unity 多场景/大场景加载解决方法 文章目录 Unity 多场景/大场景加载解决方法 前言 一.通过距离判断实现加载场景 1.1.原理: 1.2.范围检测 1.3.方法弊端 二.通过触发检测实现加 ...

  7. Unity 2D检测物体碰撞

    文章目录 添加物理脚本 使用脚本检测碰撞 添加物理脚本 Unity2D中,检测物体碰撞首相要给物体添加两个属性分别是: rigibody和collider,刚体和碰撞器. collider有不同的形状 ...

  8. Unity三种物体溶解方法

    Unity三种物体溶解方法 @[TOC](Unity三种物体溶解方法 效果展示 1. 利用Noise纹理进行溶解 shader要点 shader代码 2. 屏幕空间棋盘格 shader要点 shade ...

  9. SQL Server中TOP子句可能导致的问题以及解决办法

    SQL Server中TOP子句可能导致的问题以及解决办法 参考文章: (1)SQL Server中TOP子句可能导致的问题以及解决办法 (2)https://www.cnblogs.com/firs ...

最新文章

  1. python编程自学能学会吗-小白看看!本人自学Python编程经验分享。
  2. androidHandler讲解
  3. 解决maven cannot change version of project facet dynamic web module to 3.0
  4. Python学习:Python简介
  5. linux下的c编程
  6. 专访vivo X27产品经理:以技术进步为根 以用户需求为本
  7. html把多个div做成块,HTML块
  8. MSSQL2005:“超时时间已到。在操作完成之前超时时间已过或服务器未响应”
  9. 提取swf素材_swf素材提取工具
  10. 关于利用DEM生成水系图
  11. 华为防火墙双机热备-HRP
  12. tp5.1 保利威视 云课堂 三分屏 PC直播DEMO(不适合普通直播)
  13. row format delimited fields terminated by “,“含义是以‘,‘结尾的行格式分隔字段
  14. Latex 表格单元格内换行
  15. 局部静态变量和全局静态变量
  16. ajax调用ashx页面内的方法
  17. Python数据分析高薪实战第八天 数据计算统计与分析
  18. JQuery OrgChart
  19. 城市交通指挥与应急疏导广播系统方案
  20. 【EI检索_AMM】第二届工业设计与机械动力(ICIMDP2013)征稿中 距离截稿日期仅有八天

热门文章

  1. android 网络gif_Android SurfaceView实现GIF动画架包,播放GIF动画
  2. 心斋-------马克奥勒流
  3. linux(Ubuntu)下安装英伟达的显卡驱动、cuda和cudnn详细步骤
  4. loop在python中什么意思_在python中使用loop打开多个文件
  5. 如何避免学习linux必然会遇到的几个问题
  6. 2018.08.21随笔
  7. Chapter 1 First Sight——37
  8. Android Toast 设置到屏幕中间,自定义Toast的实现方法,及其说明
  9. Linux 端口- PID - 启动目录
  10. [Python] Python 之 __new__() 方法与实例化