2015-08-17 10:50:58 andyhebear 阅读数 3206
//This script enables underwater effects. Attach to main camera.
 
//Define variables
 
var underwaterLevel = 7;
 
//The scene's default fog settings
 
private var defaultFog = RenderSettings.fog;
 
private var defaultFogColor = RenderSettings.fogColor;
 
private var defaultFogDensity = RenderSettings.fogDensity;
 
private var defaultSkybox = RenderSettings.skybox;
 
var noSkybox : Material;
 
function Start () {
 
//Set the background color
 
camera.backgroundColor = Color (0, 0.4, 0.7, 1);
 
}
 
function Update () {
 
if (transform.position.y < underwaterLevel) {
 
RenderSettings.fog = true;
 
RenderSettings.fogColor = Color (0, 0.4, 0.7, 0.6);
 
RenderSettings.fogDensity = 0.04;
 
RenderSettings.skybox = noSkybox;
 
}
 
else {
 
RenderSettings.fog = defaultFog;
 
RenderSettings.fogColor = defaultFogColor;
 
RenderSettings.fogDensity = defaultFogDensity;
 
RenderSettings.skybox = defaultSkybox;
 
}
 
}

2017-10-10 10:33:04 qq_30087879 阅读数 2239

在update中检测

首先要在摄像机中添加组件Physics Raycaster

public void Update(){
if(Input.getMouseButtonUp(0)){
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit rayhit;
if(Physics.Raycast(ray,out rayhit)){
debug.log(rayhit.collider.gamaObject.name);

}
}


 

2019-09-12 16:37:49 u014805066 阅读数 1385

Unity3D实现谷歌地球

示例视频:https://v.youku.com/v_show/id_XNDQ0MTczNjcwMA==.html?spm=a2hzp.8244740.0.0

https://v.youku.com/v_show/id_XNDUxMDM3MzYwMA==.html?spm=a2hzp.8244740.0.0

在Unity3d平台实现的类似谷歌地球的功能,可动态加载谷歌影像,最高可加载到22层,也可加载国界线等矢量文件以及tif高程文件。

2019-01-11 14:26:28 qq_40985921 阅读数 3682

参考博文https://blog.csdn.net/u010989951/article/details/52768794

unity版本5.4(项目源码百度云
链接:https://pan.baidu.com/s/1vsh0S21V1GQNBwtzIfnUoQ
提取码:agat )

最终效果截图
在这里插入图片描述

首先,新建项目,导入Characters和Environment资源包,搭建地形场景(设置宽度高度为100,并把地形抬高50),用工具布置场景。(地形布置这里不细讲)

在这里插入图片描述
布置水面,在导入的Environment资源包里,将Water4Advanced拖入场景中,调整位置和大小
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

运行项目,此时水下是没有水底效果的,接下来做水底特效在这里插入图片描述

做一个触发器,检测相机是否进入水中。新建一个Cube,命名为IsTriggerCube 放大,cube比水下容量大一些就可以,Box Colleder 下勾选 Is Trigger(这里不勾选相机穿不过去),不勾选Mesh Renderer(取消渲染,就是不在场景中显示)。
在这里插入图片描述
导入Effects,里面有Blur脚本,下面要用到
在这里插入图片描述
删除原来的Main Camera
Blur(模糊视角)里面的Iterations和Blur Spread属性可自行调整。我是直接写在脚本里面了。

在这里插入图片描述

新建脚本underWater.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityStandardAssets.ImageEffects;

public class underWater : MonoBehaviour
{
    public GameObject cm;//相机

    public GameObject checkObject;//角色

    private float blurspread = 0.3f;
    void Start()
    {
        RenderSettings.fog = false;//关闭 Fog
        cm.GetComponent<Blur>().enabled = false;//关闭Blur组件
    }

//当相机进入水中时开启Fog和Blur组件
    void OnTriggerStay(Collider col)
    {
        if (col.gameObject == checkObject)
        {
        	//开启相机上的Blur脚本,设置属性值(可以在可视化面板中设置属性值,这样在代码里就只用控制enable)
            cm.GetComponent<Blur>().enabled = true;
            cm.GetComponent<Blur>().iterations = 0;
            cm.GetComponent<Blur>().blurSpread = blurspread;
            
			//开启Fog(雾)
            RenderSettings.fog = true;
            RenderSettings.fogColor = new Color(0, 0.4f, 0.7f, 0.6f);//颜色浅蓝
            RenderSettings.fogDensity = 0.04f;
        }
    }
//离开水下时,关闭Blur和Fog
    void OnTriggerExit(Collider col)
    {
        if (col.gameObject == checkObject)
        {
            cm.GetComponent<Blur>().enabled = false;
            RenderSettings.fog = false;

        }
    }

}

在hierarchy中点击IsTriggerCube(之前创建的大Cube),添加underWater脚本在这里插入图片描述

运行项目,可以看到水下场景

在这里插入图片描述

接下来添加气泡,去Asset Store搜索bubble,找免费的-_-。我选的是第一个

在这里插入图片描述
导入后得到

在这里插入图片描述

在Hierarchy面板中右击添加Particle System,设置属性如图。

在这里插入图片描述

在这里插入图片描述再次,运行项目

在这里插入图片描述

(水下模糊)参考:https://blog.csdn.net/u010989951/article/details/52768794

2016-06-05 16:19:35 datealive 阅读数 4971

Unity3D实现粒子光环效果


参考效果: http://i-remember.fr/en
基本思路如下
1. 使用unity3d自带的粒子系统
2. 为圆环设置最大半径maxR和最小半径minR
3. 使用x=R*sin(angle), y=R*cos(angle)来计算每个粒子的坐标
4. 将粒子数组设置到选定的粒子系统中

下面说说具体步骤

一.
设置Main Camera的投影方式为正交投影,将背景设置为黑色,方便观察粒子效果
摄像机设置

接着新建一个Empty GameObject,用来挂载粒子系统,注意这个空物体要放在摄像机的投影范围内,为这个物体添加粒子系统,并且按图中方式设置粒子系统
粒子系统设置
主要是要将Looping选项和Play OnAwake选项去掉,同时把Emission Rate设为0

二.
新建C#脚本,用来控制粒子系统
定义点结构,用来表示粒子的坐标信息

public class Point {
    public float angle;
    public float radius;

    private float x = 0.0f;
    private float y = 0.0f;


    public void Cal() {
        float temp = angle / 180.0f * Mathf.PI;
        y = radius * Mathf.Sin(temp);
        x = radius * Mathf.Cos(temp);
    }
    public Point(float angle, float radius) {
        this.angle = angle;
        this.radius = radius;
    }

    public float getX() {
        return x;
    }

    public float getY() {
        return y;
    }
}

三.
声明粒子系统和粒子系统的相关参数

    private ParticleSystem particleSystem;
    //粒子数组
    private ParticleSystem.Particle[] particleArray;
    //粒子坐标集合
    private Point[] points;

    //颜色梯度
    public Gradient grad;
    //控制透明度的变化
    private GradientAlphaKey[] gradAplp;
    //控制颜色的变化
    private GradientColorKey[] gradCol;

    //粒子参数
    public int count = 1000;
    public float size = 0.5f;
    public float minRadius = 5.0f;
    public float maxRadius = 12.0f;
    //控制主方向是顺时针还是逆时针
    public bool clockwise = true;
    public float speed = 0.5f;

四:
初始化粒子坐标,在一开始就生成一个圆环

private void Init() {
        int i;
        for (i = 0; i < count; i++) {
            float midRadius = (minRadius + maxRadius) / 2.0f;
            float minRate = Random.Range(1.0f, midRadius / minRadius);
            float maxRate = Random.Range(midRadius / maxRadius, 1.0f);
            float radius = Random.Range(minRadius * minRate, maxRadius * maxRate);
            float angle = Random.Range(0.0f, 360.0f);
            points[i] = new Point(angle, radius);
            points[i].Cal();
            particleArray[i].position = new Vector3(points[i].getX(), points[i].getY(), 0f);
        }

        particleSystem.SetParticles(particleArray, particleArray.Length);
}

这里为了让粒子尽量集中在圆环的中间,首先计算出最大半径和最小半径之间的平均值,这个值就是圆环的中间,分别求出一个在最小半径和中间之间的一个随机比率以及中间值和最大半径之间的一个随机比率,再在这两个随机比率对应的半径值之间求出一个随机值就可以让粒子的坐标集中在中间值附近,根据概率的知识可知,求出的两个随机比率是符合正太分布的,所以这两个比率的中间值也是接近于圆环的中间,由于这两个比率对应的半径值中选取随机数也是符合正太分布的,所以会让大部分粒子集中在圆环中间的位置

四:
设置颜色梯度,我希望圆环在运动的时候能够根据当前的位置对颜色和透明度做出相应的变化

// Update is called once per frame
    void Update () {
        int i;
        int level = 7; //将整个粒子系统分成七层,每一层的旋转方向和速度都有差异
        for (i = 0; i < count; i++) {

            if (i % level > 3)
            {
                //外层顺时针旋转
                points[i].angle -= (i % level + 1) * speed;
            } else {
                //内层逆时针旋转
                points[i].angle += (i % level + 1) * speed;
            }

            points[i].angle = (points[i].angle + 360.0f) % 360.0f;
            //粒子旋转半径的微小变化,能够让粒子运动体现出随机性
            points[i].radius += 0.04f * (Mathf.PerlinNoise(points[i].angle/360.0f, 0.0f))-0.02f;
            //Debug.Log(points[i].radius);
            points[i].Cal();
            particleArray[i].color = grad.Evaluate(Time.time*0.1f);
            particleArray[i].position = new Vector3(points[i].getX(), points[i].getY(), 0.0f);
        }
        particleSystem.SetParticles(particleArray, particleArray.Length);
}

这里面为了实现样例中的效果,需要让不同层次的粒子旋转方向不同,所以我将粒子分成了7层,每一层都有自己的旋转方向,当然这里还可调整旋转增量的参数,让旋转增量和运动半径产生关联,实现外围的粒子半径增量更大的效果,同时我使用Perlin噪声让粒子的运动半径发生随机的改变,然粒子的运动看起来更加无序,当然每次Update也需要重新计算梯度的变化

最终效果(不同时期的运行效果,可以看到粒子的运行半径和圆环形状,透明度等都有变化):
这里写图片描述

这里写图片描述

这里写图片描述

完整代码

using UnityEngine;
using System.Collections;


public class Point {
    public float angle;
    public float radius;

    private float x = 0.0f;
    private float y = 0.0f;


    public void Cal() {
        float temp = angle / 180.0f * Mathf.PI;
        y = radius * Mathf.Sin(temp);
        x = radius * Mathf.Cos(temp);
    }
    public Point(float angle, float radius) {
        this.angle = angle;
        this.radius = radius;
    }

    public float getX() {
        return x;
    }

    public float getY() {
        return y;
    }
}
public class PCircle : MonoBehaviour {

    private ParticleSystem particleSystem;
    //粒子数组
    private ParticleSystem.Particle[] particleArray;
    //粒子坐标集合
    private Point[] points;

    //颜色梯度
    public Gradient grad;
    //控制透明度的变化
    private GradientAlphaKey[] gradAplp;
    //控制颜色的变化
    private GradientColorKey[] gradCol;

    //粒子参数
    public int count = 1000;
    public float size = 0.5f;
    public float minRadius = 5.0f;
    public float maxRadius = 12.0f;
    //控制主方向是顺时针还是逆时针
    public bool clockwise = true;
    public float speed = 0.5f;

    private void Init() {
        int i;
        for (i = 0; i < count; i++) {
            float midRadius = (minRadius + maxRadius) / 2.0f;
            float minRate = Random.Range(1.0f, midRadius / minRadius);
            float maxRate = Random.Range(midRadius / maxRadius, 1.0f);
            float radius = Random.Range(minRadius * minRate, maxRadius * maxRate);
            float angle = Random.Range(0.0f, 360.0f);
            points[i] = new Point(angle, radius);
            points[i].Cal();
            particleArray[i].position = new Vector3(points[i].getX(), points[i].getY(), 0f);
        }

        particleSystem.SetParticles(particleArray, particleArray.Length);
    }
    // Use this for initialization
    void Start () {
        particleSystem = this.GetComponent<ParticleSystem>();
        particleArray = new ParticleSystem.Particle[count];
        points = new Point[count];
        particleSystem.startSpeed = 0;
        particleSystem.startSize = size;
        particleSystem.maxParticles = count;
        particleSystem.Emit(count);
        particleSystem.GetParticles(particleArray);

        grad = new Gradient();
        gradAplp = new GradientAlphaKey[5];
        gradCol = new GradientColorKey[5];
        float delt = 0f;
        //设置梯度变化有五个程度,且是均匀变化
        for (int i = 0; i < 5; i++) {
            gradAplp[i].time = delt;
            gradAplp[i].alpha = delt;
            delt += 0.2f;
        }

        gradCol[0].time = 0.0f;
        gradCol[0].color = Color.black;
        gradCol[1].time = 1.0f;
        gradCol[1].color = Color.white;
        grad.SetKeys(gradCol, gradAplp);
        Init();
    }

    // Update is called once per frame
    void Update () {
        int i;
        int level = 7; //将整个粒子系统分成七层,每一层的旋转方向和速度都有差异
        for (i = 0; i < count; i++) {

            if (i % level > 3)
            {
                //外层顺时针旋转
                points[i].angle -= (i % level + 1) * speed;
            } else {
                //内层逆时针旋转
                points[i].angle += (i % level + 1) * speed;
            }

            points[i].angle = (points[i].angle + 360.0f) % 360.0f;
            //粒子旋转半径的微小变化,能够让粒子运动体现出随机性
            points[i].radius += 0.04f * (Mathf.PerlinNoise(points[i].angle/360.0f, 0.0f))-0.02f;
            //Debug.Log(points[i].radius);
            points[i].Cal();
            particleArray[i].color = grad.Evaluate(Time.time*0.1f);
            particleArray[i].position = new Vector3(points[i].getX(), points[i].getY(), 0.0f);
        }
        particleSystem.SetParticles(particleArray, particleArray.Length);
    }
}

当然也可以自己写shader,毕竟unity3d自带的光效还是不太灵活,鉴于水平问题(本人太渣),这里就不做了

没有更多推荐了,返回首页