unity3d 效果_unity3d 天空效果 - CSDN
  • Unity3d-粒子光环特效

    千次阅读 2018-05-29 17:17:55
    当鼠标hover到图一中间的+号圆圈中间时,光环会收缩成图二的状态,具体效果可自行前往网站体验~ 我们需要模仿这个效果并尝试用粒子流编程控制来实现。 实现 光环在收缩前较为分散,位于光环中间的部分粒子较...

    要求

    这次作业主要是学习粒子系统的使用,在 http://i-remember.fr/en 网站上,可以看到一个很酷炫的白色粒子光带,效果如下:
    这里写图片描述
    这里写图片描述

    当鼠标hover到图一中间的+号圆圈中间时,光环会收缩成图二的状态,具体效果可自行前往网站体验~

    我们需要模仿这个效果并尝试用粒子流编程控制来实现。

    实现

    光环在收缩前较为分散,位于光环中间的部分粒子较周围密集,因此我想用一个正太分布来模拟粒子在光环半径范围内的分布状况。这里我采用了Box-Muller 算法来到服从正态分布的随机数,基本思想是先得到服从均匀分布的随机数再将服从均匀分布的随机数转变为服从正态分布。关于Box-Muller 算法可参考百度百科

    class Ndistribution{
        System.Random rand = new System.Random();
    
        public double getNormalDistribution(double mean, double stdDev)
        {
            double u1 = 1.0 - rand.NextDouble(); //uniform(0,1] random doubles
            double u2 = 1.0 - rand.NextDouble();
            double randStdNormal = Math.Sqrt(-2.0 * Math.Log(u1)) *
                         Math.Sin(2.0 * Math.PI * u2); //random normal(0,1)
            double randNormal = mean + stdDev * randStdNormal; //random normal(mean,stdDev^2)
            return randNormal;
        }
    }

    有了生成服从正太分布随机数的函数之后,接下来我们将用一个脚本来控制粒子的生成以及粒子坐标的变化。
    首先声明一下属性:

        public int particleNum = 10000; // 粒子数目
        public float minRadius = 5.0f;  // 光环最小半径
        public float maxRadius = 10.0f; // 光环最大半径
    
        private ParticleSystem.Particle[] particles;
        private float[] particleAngle;  // 粒子角度
        private float[] particleR;  // 粒子半径
        private int speedLevel = 5; // 粒子旋转速度水平
        private float particleSpeed = 0.1f;  // 粒子旋转速度
    
        private Ray ray;
        private RaycastHit hit;
    
        // 收缩前粒子位置
        private float[] before;   
        // 收缩后粒子位置
        private float[] after;   
        // 粒子缩放的速度
        private float shrinkSpeed = 2f;
        private bool ischange = false;

    在Start()函数中执行初始化的工作,这里的重点是为每一个粒子利用上面提到的随机数生成函数生成一个半径,同时也为它们随机生成(0, 360)之间的一个角度,这样粒子就可以根据半径与角度,形成一个圆形光环。并且还需要令刚生成的半径作为光环收缩前粒子的半径,收缩后的半径我设定为原来的0.7倍。这样一来,效果应该是从一个大的服从正太分布的光环变成一个小的光环,而理想中的效果在收缩后在最内圈的粒子比较集中。因此,我为收缩后半径小于一定数值的粒子重新生成一个收缩半径,如下面的代码所示:

        void Start () {
            particleAngle = new float[particleNum];
            particleR = new float[particleNum];
            before = new float[particleNum];
            after = new float[particleNum];
            particles = new ParticleSystem.Particle[particleNum];
    
            particleSystem.maxParticles = particleNum;
            particleSystem.Emit(particleNum);
            particleSystem.GetParticles(particles);
    
            Ndistribution nd = new Ndistribution();
    
            // 每个粒子在初始化的时候都设定好收缩前和收缩后的粒子半径
            for (int i = 0; i < particleNum; i++)
            {
                float r = (float)nd.getNormalDistribution((minRadius+maxRadius)*0.5f, 1);
                float angle = UnityEngine.Random.Range(0.0f, 360.0f);
                particleAngle[i] = angle;
                particleR[i] = r;
    
                before[i] = r;
                after[i] = 0.7f * r;
    
                if (after[i] < minRadius * 1.1f)
                {
                    float midRadius = minRadius * 1.05f;
                    after[i] = UnityEngine.Random.Range(UnityEngine.Random.Range(minRadius, midRadius), (minRadius * 1.1f));
                }
            }
        }

    然后在每一帧执行Update()函数时更新所有粒子的位置,实现旋转。根据遍历粒子数组时的index的奇偶性,来区分粒子的旋转方向;同时利用不同速度级别和基本旋转速度的乘积,来实现粒子以不同速度旋转。

         // 通过奇偶控制粒子顺时针或逆时针旋转 
         if (i % 2 == 0)  
         {  
             // 逆时针
             particleAngle[i] += (i % speedLevel + 1) * particleSpeed;  
         }  
         else  
         {  
             // 顺时针
             particleAngle[i] -= (i % speedLevel + 1) * particleSpeed;  
         }  
    
         particleAngle[i] = particleAngle[i] % 360;
         // 转换为弧度制
         float rad = particleAngle[i] / 180 * Mathf.PI;  
    
         // 更新粒子坐标
         particles[i].position = new Vector3(particleR[i] * Mathf.Cos(rad), particleR[i] * Mathf.Sin(rad), 0f);  

    接着还要实现鼠标悬停中间后粒子收缩的效果。unity3d不像web一样直接可以用hover,我参考了网上的博客,使用光线射击到中间物体的方法。注意这里需要为光环gameObject添加Box Collider,并设置合适的大小。

    缩放的实现是根据初始化时生成的半径,逐帧更改粒子当前的半径直到与设定的大小一致。

    ray = camera.ScreenPointToRay(Input.mousePosition);  
    if (Physics.Raycast(ray, out hit) && hit.collider.gameObject.tag == "button") ischange = true;  
    else ischange = false;  
    ...
    
    if (ischange)
    {
        // 开始收缩
        if(particleR[i] > after[i])
        {
            particleR[i] -= shrinkSpeed * (particleR[i] / after[i]) * Time.deltaTime;
        }
    }
    else
    {
        // 开始还原
        if (particleR[i] < before[i])
        {
            particleR[i] += shrinkSpeed * (before[i] / particleR[i]) * Time.deltaTime;
        }
        else if (particleR[i] > before[i])
        {
            particleR[i] = before[i];
        }
    }
    

    最后附上相关参数设定:
    这里写图片描述
    这里写图片描述
    这里写图片描述

    最终效果

    粒子光环

    演示视频地址:https://www.bilibili.com/video/av24101271/
    完整项目源码见GitHub:https://github.com/CarolSum/Unity3d-Learning/tree/master/hw7

    展开全文
  • unity3D 下雨效果实现

    万次阅读 2016-03-02 21:15:03
    这个效果借鉴自unity例子angrybot,并做了一部分适应项目的修改。 angrybot的实现方法 单个雨滴 RainBox 1.Start的时候从Mgr里面取一个雨滴的mesh给MeshFilter使用。 2.在Update 做下落的循环位移。 3....


    这个效果借鉴自unity例子angrybot,并做了一部分适应项目的修改。

    angrybot的实现方法

    单个雨滴 RainBox
    1.Start的时候从Mgr里面取一个雨滴的mesh给MeshFilter使用。
    2.在Update 做下落的循环位移。
    3.OnBecameInvisible / OnBecameVisible 可见和不可见的时候设置gameobject的enabled属性,性能优化。


    雨滴管理器 RainManager 
    使用generateNewAssetsOnStart来控制是否在start里面创建雨滴的mesh,正常启动游戏的时候需要把这个开关关掉。这个mgr其实就是个存储雨滴mesh的容器,提前把start里面生成的mesh预设给preGennedMeshes,然后rainbox按顺序从这里面循环着取来用。
    生成mesh的算法比较好懂,值得注意的是这一句,

    uvs2[i4 + 0] = new Vector2(Random.Range(-2,2)*4.0, Random.Range(-1,1)*1.0);
    uvs2[i4 + 1] = new Vector2(uvs2[i4 + 0].x, uvs2[i4 + 0].y);
    uvs2[i4 + 2] = new Vector2(uvs2[i4 + 0].x, uvs2[i4 + 0].y);
    uvs2[i4 + 3] = new Vector2(uvs2[i4 + 0].x, uvs2[i4 + 0].y);
    给了第二套UV,并且值是个随机数,这个是给shader用的,后面会说。

    shader Rain
    VS:v.vertex.yzx += v.texcoord1.xyy; 
    这里面就用了之前给的uv2了,通过一个随机数,给每个雨滴一个随机的偏移,实现雨滴下落的层次效果,不然雨滴会像个盒子一样一起下落,一下就高大上了很多。
    其余没什么特别的

    地面水花效果
    水花 RainsplashBox
    和RainBox基本一样
    管理器 RainsplashManager
    原理和RainManager一样,uv2一样是个随机数,给shader用的
    shader RainSplash
    VS:
    在VS里面做了个uv动画,实现水花从小到大的效果

    	half timeVal = frac(_Time.z * 0.5 + v.texcoord1.x) * 2.0;
    	o.uv.xy = v.texcoord.xy;	
    v.texcoord1.x 是之前给的随机数,这样各个水花的第一帧就不一样了,实现雨滴交错落地的效果。

    <span style="white-space:pre">	</span>o.uv.x = o.uv.x / 6 + floor(timeVal * 6) / 6;
    实现序列帧效果,frac取一个数的小数部分,所以timeVal在[0,2)。当timeVal在(1,2)这个区间时,如果texture的warpmode是clamp,就会采样不到颜色,这样贴图取到最后一帧后就会出现一个间隔,水花效果就比较自然。如果是repeat的,就会出现一个水花连续展开的现象。注意,例子给的水花贴图是NPOT的,在andorid下是不能设置为repeat的。
    <span style="white-space:pre">	</span>o.color = saturate(1.0 - timeVal) * _Intensity;
    当 timeVal 在(1,2)这个区间时,o.color就是0。结合PS中的,
    <span style="white-space:pre">	</span>fixed4 outColor = tex2D(_MainTex, i.uv) * i.color;
    这样 timeVal > 1的时候水花就消失了,其实也是实现了水花间隔展开的效果。


    我的实现
    我把生成mesh的代码单提了出来,分别放在 KRainSplashBuilder和KRainModelBuilder里面,然后在Editor里面做菜单项,这样就可以按需要生成mesh了。

    KRainSplashBox和KRainBox基本没动。
    雨效果控制器 KRainEffectManager 
    这个是个开关,当游戏使用低配的时候需要关闭雨效果以减少开销。


    使用
    1 在场景中种一个emptyObject(取名rainroot),挂载KRainEffectManager。
    2 在rainroot下面加两个emptyObject(分别取名RainEffect和RainSplash)
    3 制作雨滴prefab,挂载RainBox脚本,给MeshFilter挂上需要的mesh,然后挂在各自的父节点上,调整好位置。
    4 制作水花prefab,参考雨滴。





    展开全文
  • Unity3D开发:为地形添加水源和效果

    千次阅读 2015-07-15 11:14:15
    第一步:添加水面 由于我在上一次的地形创作中就已经在山峰之间制作了一块洼地,它就可以作为一个放置湖水的地方。如果您上次的创作并没有这样的地形,那么请您重新创建一个山势地形图,就当作自己的一次练习吧。...

    第一步:添加水面

    由于我在上一次的地形创作中就已经在山峰之间制作了一块洼地,它就可以作为一个放置湖水的地方。如果您上次的创作并没有这样的地形,那么请您重新创建一个山势地形图,就当作自己的一次练习吧。

    在场景面板中点击Y方向的绿色箭头 1.JPG ,切换到顶视图,这样可以便于我们很快的找到洼地所在的地方。如图4.1所示:

    2.JPG

    图4.1

    然后用鼠标滚轮迅速的推进观测距离。如图4.2所示:

    3.JPG

    图4.2

    接着再到Project【项目文件栏】找到“Standard Assets”文件夹下的 4.JPG (仅限专业版使用,如果您使用的版本是非专业版本,请转到 5.JPG )文件夹中,拖拽一个 6.JPG 【白天光照效果的水模型】到洼地的中央,并利用场景调整工具中的缩放工具 7.JPG ,将水模型调整到合适的大小。如图4.3所示:

    8.JPG

    图4.3

    紧接着我们再点击场景面板中右上角的白色小方块 9.JPG ,将视角切换到透视图。然后利用场景调整工具 10.JPG ,将水模型调整到合适的高度。如图4.4所示:

    11.JPG

    图4.4

    这时您只需要在播放时,将摄像机移动到洼地这个地方就可以看见湖水的效果了。

    第二步:添加瀑布。

    现在看来效果略显单调,既然是山中泉水我们还得有一些瀑布和溅起的水花。为了节约查找的时间,我们直接在Project【项目文件栏】上方的搜索框输入字符“water f”,这样就可以查处如图所示的材质和模型。如图4.5所示:

    12.JPG

    图4.5

    在这里面, 13.JPG 是一个喷泉模型, 14.JPG 是一个水面的飞溅模型, 15.JPG 是一个瀑布模型。我们先拖入一个 16.JPG 到洼地,然后利用场景调整工具来调整它的位置和角度。如图4.6所示:

    17.JPG

    图4.6

    这时的瀑布略显小了一些,我们可以先选中它,然后到它的属性面板里面去调整成您想要的效果。如图4.7所示:

    18.JPG

    图4.7

    第三步:添加水面飞溅模型。

    接下来我们会看到瀑布落到水面是没有水花飞溅的效果的,这不合常理。于是我们在瀑布下的水面上方放置一个水面飞溅模型 19.JPG 。由于它的噶偶一定要和水面高度一致,所以我们先点选水平面,看看它的Y轴坐标,然后复制到 20.JPG 属性面板中同样的位置,以确保它是伏在水面上的。紧接着再到它的属性面板中调整它的属性,让模型效果调整成您想要得到的效果。如图4.8所示:

    21.JPG

    图4.8

    第四步:添加水下模糊效果。

    我们运行一下游戏 ,然后将镜头移动到泉水的水面下。如图4.9所示:

    23.JPG

    图4.9

    大家会发现,水下的视觉和在地面上的视觉效果是完全一样的。这和我们平时的生活现状是不相符的,所以我们还得做一下相应的调整。首先点击 24.JPG ——> 25.JPG ——> 26.JPG ,创建一个立方体,并运用场景调整工具将它调整到整个水洼的实体部分。(注:运用其他形体也可以,其主要是用来覆盖水洼的实体部分,以用来和摄像机做碰撞检测,让摄像机的镜头变得模糊。)如图4.10所示:

    123.JPG

    图4.10

    接着,确保您创建的这个cube是被选中状态,到它的属性面板中,将“Box Collider”卷展栏中的“Is Trigger”复选框打上勾(如果这里不打勾,这个cube将作为一个实物,当摄像机撞上它时,就像撞上墙一样,无法穿过。)如图4.11所示:

    28.JPG

    图4.11

    然后再将“Mesh Renderer”卷展栏下的所有复选框全部勾掉,使这个立方体只作为一个形体存在,而不让它在场景中作出任何的显示渲染。如图4.12所示:

    29.JPG

    图4.12

    接着在属性面板的最上方将它的名字由“Cube”改为“WaterColler” 30.JPG ,再选中 31.JPG 的下拉框 中新添加一个“WaterColler”的标签分类。然后将这个“WaterColler”水洼碰撞体的Tag也改成“WaterColler”。

    然后我们在菜单栏中选中 32.JPG ——> 33.JPG ——> 34.JPG ,新添加一个JS脚本。到Project【项目文件栏】找到刚才新建的JS脚本 35.JPG ,按下F2键更改它的名字为“UnderWatereffect”,并双击编辑它,输入代码如图4.13所示:

    36.JPG

    图4.13

    输入完毕,按Ctrl+S保存代码并关闭退出。然后将代码拖拽给摄像机使用。重新运行一下游戏,将摄像机移动到水下,就可以看到一片模糊的景象了。如图4.14所示:

    37.JPG

    【编辑推荐】

    展开全文
  • Unity3D场景转换效果

    千次阅读 2018-09-11 14:52:00
    功能介绍:加载场景时画面会逐渐变亮,退出场景时(或者角色死亡)画面逐渐变暗。 添加一个RawImage对象,设置Tag。 使其铺满整个屏幕 设置Color为合适的值,例RGBA(128,128,128,178); Canvas下添加一个Ganvas ...

    功能介绍:加载场景时画面会逐渐变亮,退出场景时(或者角色死亡)画面逐渐变暗。


    1. 添加一个RawImage对象,设置Tag。
    2. 使其铺满整个屏幕
    3. 设置Color为合适的值,例RGBA(128,128,128,178);
    4. Canvas下添加一个Ganvas Group组件,设置Alpha为0.5;

    添加脚本:

    using UnityEngine.UI;	                //引入UI
    using UnityEngine.SceneManagement;      //场景转换
    
    public float fadeSpeed=0.5f;		//渐变速度
    private bool sceneStarting=ture;	//游戏是否开始(或者其他控制标志)
    private RawImage rawImage=null;		//RawImage对象
    
    void Awake(){
    	RawImage=GetComponent<RawImage>();
    }
    
    //控制rawImage颜色变化
    void FadeToClear(){
    	rawImage.color=Color.Lerp(rawImage,color,Color.clear,fadeSpeed*Time.deltaTime);
    }
    void FadeToBlack(){
    	rawImage.color=Color.Lerp(rawImage,color,Color.black,fadeSpeed*Time.deltaTime);
    }
    
    //开始和结束场景
    void StartScene(){
    	FadeToClear();
    	if(rawImage.color.a<0.05f){
    		rawImage.color=Color.clear;
    		rawImage.enable=false;
    		sceneStarting=false;
    	}
    }
    void EndScene(){
    	rawImage.enable=true;
    	FadeToBlack();
    	if(rawImage.color.a>=0.95f){
    		SceneManager.LoadScene(0);
    	}
    }
    
    //开始游戏调用
    void Update(){
    	if(sceneStarting)
    		StratScene();
    }

    开始游戏,调用StartScene()函数,RawImage的颜色由初始值均匀朝(0,0,0,0)变化,当a小于0.05时,设置RawImage的颜色为Color.clear 。enable=false , 标志位为false。

    结束游戏时,RawImage的enable=true。颜色朝(0,0,0,1)变化,a值达到一定值,重新加载场景。

    也可以通过调用此脚本对象的标志位,来实现其他功能。

    展开全文
  • Unity3d 实现翻书效果(二)

    千次阅读 2018-01-31 19:35:07
    之前一边文章讲了该插件的基本操作,这一次讲如何动态添加修改书页 首先找到插件文件夹下的prefabs文件夹,将预设体BookPro添加到场景中 这个prefabs如果想要实现我们的要求的话,需要对其进行一些修改 ...
  • Unity3D】箭头指向效果实现

    千次阅读 热门讨论 2020-07-08 09:07:37
    本文主要实现一个箭头指向的作用,现在看一下效果 二、需要用到的资源 都是png文件,上传到百度云盘了 链接:https://pan.baidu.com/s/1opQYzSNrXKboM3eFWEb-qQ 提取码:avvu 三、正文 1.新建一个Plane 2.创建...
  • 概要:本文对Unity5中全新的三种Shader模板的源码进行了解析,然后还讲解了运动模糊屏幕特效的实现方法。 Unity5和之前的书写模式有了一定的改变。Unity5时代的Shader Reference官方文档也进一步地变得丰满。主要...
  • Unity制作技能冷却效果

    千次阅读 2017-03-04 21:16:55
    本文介绍在Unity中如何简单实现技能冷却效果 【Mask组件的使用】 首先制作技能图标 创建一个UI->Image Image选择Unity自带的圆形图片 在Image下添加一个按钮作为子节点,并适当放大按钮 选择一张精灵图片作为按钮...
  • Unity3D 粒子系统实现一个简单的爆炸效果

    万次阅读 多人点赞 2017-06-04 09:54:59
    Unity3D 爆炸效果 粒子系统
  • 利用Unity的UGUI制作了2D卡牌翻转的效果,如果是sprite对象的话,原理应该也是一样的,以下是效果图 图1 卡牌翻转效果 2. 关于DoTween DoTween是一款十分强大且好用的动画效果插件,有免费版和收费版,免费版就...
  • Unity3d描边框效果

    千次阅读 2018-06-14 16:08:08
    原文内容:blog.liujunliang.com.cn Unity3d描边框效果网上有很多,大多是使用Shader来实现的 本文介绍使用Collider来实现这么一种效果 效果图如下
  • ## Unity3D实现粒子光环效果

    千次阅读 2016-06-05 16:38:31
    Unity3D实现粒子光环效果参考效果: http://i-remember.fr/en
  • Unity3D雾化效果

    千次阅读 2015-02-04 20:33:18
    Unity3D的Render Settings设置中,可以开启雾的效果,其中,有一个下拉选项:Fog Mode是原来选择雾的模式,此篇文章,就是来解释,雾在游戏场景中扮演的角色和用途 雾化效果就相当于开启大气的效果,让看起来有种...
  • [Unity3D]Unity3D游戏开发之自由视角下的角色控制

    万次阅读 热门讨论 2014-09-10 12:54:34
    在上一篇文章[Unity3D]Unity3D游戏开发之角色控制漫谈>一文中,博主与大家分享自己在角色控制方面的一些感悟。今天呢,我们继续来探讨Unity3D角色控制的内容,今天博主将解决在上一篇文章中没有解决的问题,即自由...
  • 这个工具呢,博主在Unity3D游戏开发之反编译AssetBundle提取游戏资源这篇文章中其实已经提到过了,不过因为有些朋友对如何使用这个工具依然存在问题,所以博主决定特地写一篇文章来讲解如何使用disunity来提取Unity...
  • [Unity3D]Unity3D游戏开发之ACT游戏三连击效果实现综述

    万次阅读 热门讨论 2014-09-01 16:13:37
    各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的...今天博主想和大家分享的是ACT游戏中的三连击效果的实现,由于Unity3D目前存在Animation和Animator两种类型的动画组件,因此本文将分别讲这两种类型的动
  • 今天我们来说说通过反编译Unity3D的AssetBundle来提取游戏资源,博主写这篇文章的目的并非是要教大家如何去破解一款基于Unity3D引擎开发的游戏,而是想通过今天这篇文章来告诉大家如何在开发Unity3D游戏的过程中保护...
  • 2018年什么游戏最火? 不用问,肯定是人人都在撸的“王者荣耀”和吃鸡游戏了。...Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综...
  • Unity3d 引擎原理详细介绍

    万次阅读 2014-03-25 13:22:52
     为了更好地理解游戏的软件架构和对象模型,它获得更好的外观仅有一名Unity3D的游戏引擎和编辑器是非常有用的,它的主要原则。 Unity3D 引擎  Unity3D的是一个屡获殊荣的工具,用于创建交互式3D应用程序在多个...
  • Unity3D开发(九):Unity3d流光效果

    万次阅读 2014-02-25 23:12:12
    游戏开发论坛:Hello Game 游戏开发群:201276069 之前曾经注意过Material...流过效果即通常一条高光光在物体上划过,模拟高光移动照射物体的效果,之前是使用Shader每帧传递一个Offset值,修改高光纹理采样的uv
1 2 3 4 5 ... 20
收藏数 32,384
精华内容 12,953
关键字:

unity3d 效果