unity3d粒子系统水流

2017-12-16 17:55:22 sinat_20559947 阅读数 10785
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

Shader "Custom/Stream" {
	Properties {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _MainTint ("Diffuse Tint", Color) = (1,1,1,1)
		_ScrollXSpeed ("X Scroll Speed", Range(0,10)) = 2
		_ScrollYSpeed ("Y Scroll Speed", Range(0,10)) = 2
	}
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200
		
		CGPROGRAM
		// Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows
		// Use shader model 3.0 target, to get nicer looking lighting
		#pragma target 3.0

        // 将类型转换到CG中的可用类型
		sampler2D _MainTex;
        fixed4 _MainTint;
        fixed _ScrollXSpeed;
        fixed _ScrollYSpeed;

        // 读取模型数据的结构体,名字有些迷惑人
		struct Input {
			float2 uv_MainTex;
		};

        // inout类型是一个输出数据的类型,顶点着色器处理好数据之后传递给片段着色器
        // 就是通过inout修饰的参数来传递的,也就是说inout修饰的类型是提供给片段着色器进一步渲染的     
		void surf (Input IN, inout SurfaceOutputStandard o) {
        
            // 先将UV坐标保存起来(这个值的类型是float2或者fixed2都可以)
            float2 scrolledUV = IN.uv_MainTex;

            // 可以根据自己的需求来决定滚动方向,此处为xy两个方向偏移
            // _Time:是基于Unity的系统内置的时间变量
            fixed xScrollValue = _ScrollXSpeed * _Time;
            fixed yScrollValue = _ScrollYSpeed * _Time;

            // fixed2(x,y):这个就不用过多解释了,将xy合并成一个二元的数据类型
            scrolledUV += fixed2(xScrollValue,yScrollValue);

            // tex2D(sampler2D,fixed2)官方定义叫:二维纹理查询
            // 给出一张图和纹理坐标计算出颜色
			half4 c = tex2D (_MainTex, scrolledUV)* _MainTint;
			o.Albedo = c.rgb;
			o.Alpha = c.a;
		}
		ENDCG
	}
	FallBack "Diffuse"
}


2019-03-19 09:29:54 u011643463 阅读数 1646
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

新版粒子系统Visual Effect Graph,目前基于HDRP高清渲染管线,所以使用前项目需要在PackageManager中导入HDRP,同时为了有HDR效果,也需要导入Post Processing

上面两个模块的配置网上有很多,这里不再赘述

这是基础配置的笔记:笔记链接

新版粒子系统是基于GPU进行渲染的,所以可以同时渲染大量的粒子,几十万个粒子一般也不会造成卡顿,不过要是想要进行物理运算需要慎重考虑。

这是官方的视频,达哥讲的: 视频链接

 

 

2018-03-08 14:41:10 bobo553443 阅读数 272
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

什么是粒子系统

粒子系统表示三维计算机图形学中模拟一些特定的模糊现象的技术,而这些现象用其它传统的渲染技术难以实现的真实感的 game physics。经常使用粒子系统模拟的现象有火、爆炸、烟、水流、火花、落叶、云、雾、雪、尘、流星尾迹或者象发光轨迹这样的抽象视觉效果等等。

这里写图片描述


新版粒子系统介绍

Shuriken粒子系统是继Unity3.5版本之后推出的新版粒子系统,它采用了模块化管理,个性化的粒子模块配合粒子曲线编辑器使用户更容易创作出各种兵分复杂的粒子效果。 
新版的粒子系统中准备了很多常用的利息效果的预制体 
这里写图片描述


参数讲解

这里写图片描述


脚本与粒子系统的结合使用


简单粒子效果的制作

粒子制作过程篇幅较长,大家可以参考以下博客 
建造过程泥土飞溅粒子特效

2019-11-04 09:30:06 diosmai_kingso 阅读数 586
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

粒子光环制作

实现目标

多个粒子组成环状,每个粒子都有各自的运动轨迹

实现步骤

  • 在场景中创建一个空对象,并将其命名为ParticleHalo,再在其下创建一个Particle System子对象,命名为Halo
  • 两个新的脚本,分别命名为ParticleData和ParticleHalo

ParticleData.cs

该脚本提供了一个保存每个粒子数据的结构,分别对应其极坐标角度,半径长,在半径方向上游离速度,运动方向(顺时针/逆时针)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ParticleData : MonoBehaviour
{
	public float angle = 0f;
	public float radius = 0f;
	public float speed = 0f;
	public bool clockwise = false;

	public ParticleData(float _angle,float _radius, float _speed, bool _clockwise)
	{
		angle = _angle;
		radius = _radius;
		speed = _speed;
		clockwise = _clockwise;
	}
}

ParticleHalo.cs

该脚本的类中提供三个方法,Start,Update和randomPlace

  • 参数:
private ParticleSystem par_sys;
private ParticleSystem.MainModule main;
private ParticleSystem.Particle[] halo;
private ParticleData[] par_data;

public float size = 0.05f;              //粒子大小
public float time = 9999f;				//粒子生命周期
public int par_count = 10000;			//粒子数量
  • Start:初始化粒子系统,设置粒子系统参数,并发射粒子
void Start()
    {
		halo = new ParticleSystem.Particle[par_count];
		par_data = new ParticleData[par_count];

		//初始化粒子系统
		par_sys = this.GetComponent<ParticleSystem>();
		main = par_sys.main;
		main.loop = false;
		main.startLifetime = time;
		main.startSpeed = 0f;
		main.startSize = size;
		main.maxParticles = par_count;
		par_sys.Emit(par_count);
		par_sys.GetParticles(halo);

		randomPlace();
    }
  • randomPlace:将粒子发射到环的不同位置上
//随机放置粒子
	private void randomPlace()
	{
		for(int i = 0; i < par_count; i++)
		{
			float r = Random.Range(5f, 12f);
			if (r % 3 == 1)
				r = Random.Range(7f, 10f);
			else if(r%3==2)
				r = Random.Range(8f, 9f);
			float angle = Random.Range(0f, 360f);
			float theta = angle / 180 * Mathf.PI;
			float speed = Random.Range(0.5f, 1.5f);
			int flag = Random.Range(0, 2);
			bool clockwise = (flag == 0) ? false : true;


			halo[i].position = new Vector3(r * Mathf.Cos(theta), r * Mathf.Sin(theta), 0f);
			par_data[i] = new ParticleData(angle, r, speed, clockwise);
		}
		par_sys.SetParticles(halo, halo.Length);
	}
  • Update:实现每个粒子的运动,包括运动方向,绕圆心旋转以及游离运动
void Update()
    {
		for (int i = 0; i < par_count; i++)
		{
			if (par_data[i].clockwise)			//顺时针
				par_data[i].angle -= Random.Range(0.01f, 0.5f);
			else                                //逆时针
				par_data[i].angle += Random.Range(0.01f, 0.5f);
			par_data[i].angle %= 360f;
			float theta = par_data[i].angle / 180 * Mathf.PI;

			//粒子进行游离
			float r = par_data[i].radius;
			r += Mathf.PingPong(Time.time * par_data[i].speed, 2f);

			halo[i].position = new Vector3(r * Mathf.Cos(theta), r * Mathf.Sin(theta), 0);
		}

		par_sys.SetParticles(halo, halo.Length);
	}

最终结果

在这里插入图片描述

github传送门:传送门
参考师兄博客:粒子光环

2018-08-22 09:57:37 qq_40343451 阅读数 1773
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

我们接下来制作模拟云层的发射口以产生雨雪天气效果。

循例先上效果图

Unity粒子实例制作3-雨雪天气特效

Unity粒子实例制作3-雨雪天气特效
下面先讲解下制作下雪天气特效
首先需要一个圆形的图片

例如Unity粒子实例制作3-雨雪天气特效

 

通过GameObject->Particle System添加一个粒子

之后设置贴图为圆形,把shader设置为Unity粒子实例制作3-雨雪天气特效

之后设置粒子系统的旋转为0,0,0

Unity粒子实例制作3-雨雪天气特效
 

然后设置粒子速度为0,设置粒子大小为自己认为适当的大小

Unity粒子实例制作3-雨雪天气特效

然后设置粒子的生命周期y轴速度,因为雨雪是向下的,所以y轴速度小于0

Unity粒子实例制作3-雨雪天气特效
由于雪的粒子速度都不一致相同,因此我们设置类型为两个数间的随机数
Unity粒子实例制作3-雨雪天气特效
Unity粒子实例制作3-雨雪天气特效
 

这时候粒子开始下落了,但是雨雪天气的范围是非常大的,所以我们设置下发射器的形状
Unity粒子实例制作3-雨雪天气特效
现在看起来雪的粒子比较稀疏,于是乎我们需要设置粒子发射器的发射数量

Unity粒子实例制作3-雨雪天气特效
现在看起来雪的粒子都一样大,有点生硬,那么我们需要设置粒子的起始大小为两个数值的随机数

Unity粒子实例制作3-雨雪天气特效
嗯,现在看起来差不多了,之后我们再设置粒子系统的高度,这样就像粒子是由高处下落了,如果感觉粒子的下落有的需要有左右的速度,那么再设置x和z轴的速度,如下

Unity粒子实例制作3-雨雪天气特效
那么我们的下雪天气就完成了。

至于下雨天气特效和下雪雷同,只是把贴图改为长方形,可以自己去尝试下制作雨天气,还有雨是具有透明度的,这个得设置颜色透明度。