详解Unity使用ParticleSystem粒子系统模拟药水在血管中流动(粒子碰撞)

一、前言

点关注不迷路,持续输出Unity干货文章。
嗨,大家好,我是新发。
之前我写了一篇Unity流体模拟的文章:《Unity流体模拟,支持粒子系统,支持流体碰撞交互(Obi Fluid插件使用教程)》
然后有同学私信我,问我能否做药剂打入血管的效果。


这个嘛,用ObiFluid可以做,不过我今天要尝试的,是用另一种方式:直接使用Unity的粒子系统来做。

二、最终效果

最终效果如下,效果虽然一般,不过制相对简单很多。

本文Demo工程已上传到CodeChina,感兴趣的同学可自行下载学习。
地址:https://codechina.csdn.net/linxinfa/UnityParticleFluidDemo
注:我使用的Unity版本:Unity 2020.1.14f1c1 (64-bit)

三、制作过程

1、导入血管模型

将血管模型导入工程中。

2、血管Shader

因为我们需要透过血管看到药水流动,所以血管需要半透明显示,我们这里创建一个shader,实现半透明效果。

shader代码如下:

Shader "linxinfa/CustomTransShader" {
	Properties {
		_Color ("Main Tint", Color) = (1,1,1,1)
		_MainTex ("Main Tex", 2D) = "white" {}
		_AlphaScale("Alpha Scale",Range(0,1)) = 1
	}
	SubShader {
		Tags{"Queue" = "AlphaTest" "IgnoreProjector" = "True" "RenderType" = "Transparent"}

		Pass
		{
			Tags{"LightMode" = "ForwardBase"}

			Cull Front

			ZWrite Off
			Blend SrcAlpha OneMinusSrcAlpha

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "Lighting.cginc"
			#include "UnityCG.cginc"

			fixed4 _Color;
			sampler2D _MainTex;
			float4 _MainTex_ST;
			fixed _AlphaScale;

			struct a2v
			{
				float4 vertex : POSITION;
				float3 normal : NORMAL;
				float4 texcoord : TEXCOORD0;
			};

			struct v2f
			{
				float4 pos : SV_POSITION;
				float3 worldNormal : TEXCOORD0;
				float3 worldPos : TEXCOORD1;
				float2 uv : TEXCOORD2;
			};

			v2f vert(a2v v)
			{
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				o.worldNormal = UnityObjectToWorldNormal(v.normal);
				o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;

				o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);

				return o;

			}

			fixed4 frag(v2f i) : SV_TARGET0
			{
				fixed3 worldNormal = normalize(i.worldNormal);
				fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));

				fixed4 texcolor = tex2D(_MainTex,i.uv);

				fixed3 albedo = texcolor.rgb * _Color.rgb;
				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
				fixed3 diffues = _LightColor0.rgb * albedo * max(0,dot(worldNormal,worldLightDir));

				return fixed4(ambient + diffues,texcolor.a * _AlphaScale);
			}

			ENDCG
		}

		Pass
		{
			Tags{"LightMode" = "ForwardBase"}

			Cull Back

			ZWrite Off
			Blend SrcAlpha OneMinusSrcAlpha

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "Lighting.cginc"
			#include "UnityCG.cginc"

			fixed4 _Color;
			sampler2D _MainTex;
			float4 _MainTex_ST;
			fixed _AlphaScale;

			struct a2v
			{
				float4 vertex : POSITION;
				float3 normal : NORMAL;
				float4 texcoord : TEXCOORD0;
			};

			struct v2f
			{
				float4 pos : SV_POSITION;
				float3 worldNormal : TEXCOORD0;
				float3 worldPos : TEXCOORD1;
				float2 uv : TEXCOORD2;
			};

			v2f vert(a2v v)
			{
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				o.worldNormal = UnityObjectToWorldNormal(v.normal);
				o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;

				o.uv = TRANSFORM_TEX(v.texcoord,_MainTex);

				return o;

			}

			fixed4 frag(v2f i) : SV_TARGET0
			{
				fixed3 worldNormal = normalize(i.worldNormal);
				fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));

				fixed4 texcolor = tex2D(_MainTex,i.uv);

				fixed3 albedo = texcolor.rgb * _Color.rgb;
				fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
				fixed3 diffues = _LightColor0.rgb * albedo * max(0,dot(worldNormal,worldLightDir));

				return fixed4(ambient + diffues,texcolor.a * _AlphaScale);
			}

			ENDCG

	}
	}
		FallBack "Transparent/VertexLit"
}

3、血管材质球

创建材质球,使用刚刚的CustomTransShader.shader

然后把材质球赋值给血管模型预设,这样,半透明的血管就做好了。

4、添加碰撞体

因为药水要在血管中流动,需要发生碰撞,所以血管需要添加碰撞体:MeshCollider

5、药水粒子

药水粒子其实就是普通的粒子。

最关键点就是开启粒子的Collision属性,这样粒子就可以与血管壁碰撞了。

其中一些参数:
Dampen:阻力
Bounce:弹力
Lifetime Loss:损失率
Min Kill Speed:最小死亡速度
Max Kill Speed: 最大死亡速度
Radius Scale: 半径缩放,可使粒子未撞到Collision便产生碰撞

四、测试效果

最终运行Unity,测试效果如下:

五、结束语

完毕。

到此这篇关于Unity使用ParticleSystem粒子系统模拟药水在血管中流动(粒子碰撞)的文章就介绍到这了,更多相关Unity ParticleSystem粒子系统内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Unity实现3D射箭小游戏

    Unity 小游戏:3D射箭,供大家参考,具体内容如下 前两周因为实训太忙,再加上自己对老师所讲的设计模式并不是很理解,所以就没有写博客.这次博客是记录3D射箭游戏的实现过程. 1. 准备资源 我是在网上找的弓与箭的资源,至于靶子,创建五个不同大小的同心圆柱体,如图所示: 需要注意的是,五个圆柱体并不在同一个平面上,这样才能够看清每一环的颜色,并且在检测碰撞时不会出现各种问题. 另外,如果靶子放得离相机太近,就没有射箭的感觉了:离相机太远,好像又看不清靶子了,然后我试着把靶子Material的S

  • 详解Unity入门之GameObject

    GameObject和Component GameObject是游戏场景中真实存在的,而且有位置的一个物件 Component附属于GameObject,控制GameObject的各种属性 GameObject是由Component组合成的,Component的生命周期和GameObject息息相关.调用此GameObject的Destroy方法,它的子对象和对应的所有Component都会被销毁,但也可以一次只销毁一个Component 常见的Component: Component 作用 R

  • Unity 如何通过反射给gameObject添加组件

    C#版本 public static Component AddComponent(GameObject go, string assembly, string classname) { var asmb = System.Reflection.Assembly.Load(assembly); var t = asmb.GetType(assembly + "." + classname); if(null != t) return go.AddComponent(t); else r

  • Unity实现瞄准镜效果

    本文实例为大家分享了Unity实现瞄准镜效果的具体代码,供大家参考,具体内容如下 using UnityEngine; using System.Collections; public class TelesopicView : MonoBehaviour { public float zoomLevel = 2.0f; public float zoomInSpeed = 100.0f; public float zoomOutSpeed = 100.0f; private float ini

  • Unity实现老虎机滚动抽奖效果的示例代码

    直接看下效果图吧: 制作思路: 设计四张图片,五个点,每个图片同时向下一个点移动,到最后一个就回到0号点,以此循环. 场景搭建: 创建Image命名为Bg作为电视框背景: 创建Image命名Mask并添加Mask组件作为电视框内容显示遮罩框: 创建四个Image作为滚动图片: 创建开始抽奖按钮: PS:实际项目中可以根据需求来动态修改图片显示,以达到的控制每次抽奖奖品内容. 源码分享: using System.Collections; using UnityEngine; using Unit

  • Unity给物体添加多个Tag的实现

    在unity中,我们经常通过给物体添加标签来判断这个物体是不是我们想要的 但是unity默认只能添加一个标签,那如果我们要给一个物体添加多个标签应该怎么办 首先,我们定义一个Tag.cs类,这个类用来存储物体的tag信息 public class Tags : MonoBehaviour{ public List<string> tags=new List<string>(); } 然后创建一个单例类TagManager.cs用来管理tag public class TagMana

  • Unity3D旧电视滤镜shader的实现示例

    实现思路 既然是要实现旧电视的后处理效果,那么只要回忆一下那些古旧的电视的显示效果然后进行模拟就可以了. 1.首先那种大头电视一般屏幕有一些曲率,并不是完全的一个平面,而且一般是向外凸起,这种凸起会造成中间的显示区域会比原来更近一些,边缘的显示区域会比原来更远一些.这种效果我们直接用简单的二次函数来实现. 2.那种老旧电视会有不断运动的噪声,我们直接使用噪声函数加上时间变量来实现. 3.屏幕上会有一些条纹效果,这种周期性的条纹效果一般用三角函数来实现. 当然不可能模拟的完全准确..也没有完全准确

  • Unity之跑马灯抽奖效果单抽与连抽(附demo)

    本文主要介绍了Unity之跑马灯抽奖效果单抽与连抽,分享给大家,具体如下: 效果图 单次抽奖效果 跳过动画抽奖效果 三连抽抽奖效果 设计思路 点击按钮 ,根据需求(概率)计算本次抽奖获得物品模拟转动 (先加速后减速), 一段时间后停止连抽的情况下等所有奖品动画都表演完成才结束跳过动画设计,有跳过时抽奖速度直接到最大,并进入可中奖 场景搭建 一个按钮,一个组奖品放到一个父物体上. 奖品元素,有两种状态,一种旋转状态,一种中奖状态. 代码 using System; using System.Col

  • Unity实现模型点击事件的方法

    模型点击事件监听 触发模型点击事件的必要条件 需要触发模型点击事件的模型身上必须要挂载Collider 组件 方法一 通过 OnMouseDown 函数监听(只能在PC端有效) 1.在Hierarchy 面板中右键,点击 3D Object->Cube 按钮,创建一个 Cube 模型 2.新建一个脚本,命名为"Test.cs"(代码如下) using System.Collections; using System.Collections.Generic; using Unity

  • 详解Unity使用ParticleSystem粒子系统模拟药水在血管中流动(粒子碰撞)

    一.前言 点关注不迷路,持续输出Unity干货文章. 嗨,大家好,我是新发. 之前我写了一篇Unity流体模拟的文章:<Unity流体模拟,支持粒子系统,支持流体碰撞交互(Obi Fluid插件使用教程)> 然后有同学私信我,问我能否做药剂打入血管的效果. 这个嘛,用ObiFluid可以做,不过我今天要尝试的,是用另一种方式:直接使用Unity的粒子系统来做. 二.最终效果 最终效果如下,效果虽然一般,不过制相对简单很多. 本文Demo工程已上传到CodeChina,感兴趣的同学可自行下载学习

  • 详解Unity安卓共享纹理

    概述 本文的目的是实现以下的流程: Android/iOS native app 操作摄像头 -> 获取视频流数据 -> 人脸检测或美颜 -> 传输给 Unity 渲染 -> Unity做出更多的效果(滤镜/粒子) 简单通信 在之前的博客里已经说到,Unity 和安卓通信最简单的方法是用 UnitySendMessage 等 API 实现. Android调用Unity: //向unity发消息 UnityPlayer.UnitySendMessage("Main Cam

  • 详解Unity地面检测方案

    1.普通射线 在角色坐标(一般是脚底),发射一根向下的射线(长度约0.2) 但是简单射线只适用于简单地形,实际使用中常常遇到以下问题 1.用collider去碰撞地面,某些时候会有一定的穿插,于是角色的最低点就可能穿透地面,你发射射线的点可能就到了地面以下,射线一直检测不到真正的地面,于是角色就一直悬空 2.角色走斜坡时,角色中点可能会离开地面一小段距离,这一小段距离往往就足够让判断机制误以为角色已经离地,如果你增加射线的长度,那么一定程度上能缓解斜坡问题,但是会降低跳跃判断的精度,精度过低就有

  • 详解Spring与Mybatis整合方法(基于IDEA中的Maven整合)

    项目结构 项目路径可以自己定义,只要路径映射正确就可以 pom.xml <properties> <spring.version>5.1.5.RELEASE</spring.version> <mybatis.version>3.4.6</mybatis.version> <log4j.version>1.2.17</log4j.version> </properties> <dependencies&g

  • 详解Mybatis是如何把数据库数据封装到对象中的

    一.前言 接到一个问题,数据库为Null的数据,传递到前端显示为0.之前有了解过,持久层框架(mybatis)在把数据库数据封装到对象中,是利用对象的Setter方法,这个大家也都知道,因此我就在Setter方法尝试,结果并不完全是这样.下面我用例子演示. 二.准备阶段 1.数据表 2.表对应的实体类 @Data @ApiModel("用户账号") public class User { @ApiModelProperty(value = "用户id") Integ

  • 详解C语言中sizeof如何在自定义函数中正常工作

    1.在main函数中,sizeof是可以正常工作的,比如: int main() { int n[5]; printf("input: \n"); int i ; for(i = 0; i < 5; i++) { scanf("%d",n + i); } int len = sizeof(n)/sizeof(n[0]); printf("%d\n",len); return 0; } 2.但是在自定义函数中就不可以了,如下: #includ

  • 详解Unity中的ShaderGraph入门使用教程

    一,ShaderGraph 简介 简介: Unity2018版本之后推出了一个可编程渲染管线工具ShaderGraph,让我们可以通过可视化界面拖拽来实现着色器的创建和编辑. 官方话术: Shader Graph 使您能够直观地构建着色器.您无需编写代码,而是在图形框架中创建和连接节点.Shader Graph 提供反映您的更改的即时反馈,并且对于不熟悉着色器创建的用户来说非常简单. Shader Graph 仅与可编写脚本的渲染管线 (SRP) 兼容,即高清晰度渲染管线 (HDRP) 和通用渲

  • 详解Unity 实现语音识别功能

    现在语音识别已经被广泛的应用到各个领域中,在Unity开发中,语音识别也非常受欢迎.大部分人都会选择科大讯飞的语音识别功能,但是在一些小的项目中,使用科大讯飞的就有点大材小用了.今天就介绍一下Unity自带的语音识别功能.说是语音识别,其实unity本身还是做不到的,Unity自带的语音识别功能其实是关键字识别.比如我在Unity中设定好一句话汇总的几个关键词.当我再说这句话的时候就会和识别到.经过测试发现当一句话中有八个关键字,这句话就会非常好的被识别出来. 接下来就一起来实现一下: 首先贴一

  • 详解Unity中Mask和RectMask2D组件的对比与测试

    组件用法 Mask组件可以实现遮罩的效果,将一个图像设为拥有mask组件图像的子物体,最后就会隐藏掉子图像和mask图像不重合的部分.例如: (蓝色的圆形名为mask,数字图片名为image) 在"mask"图片上添加mask组件后的结果(可以选择是否隐藏mask图像): RectMask2D的基本用法 RectMask2D的用法和mask大致相同,不过RectMask2D只能裁剪一个矩形区域,同时RectMask2D可以选择边缘虚化 原理分析 Mask的原理分析 Mask会赋予Ima

随机推荐