unity_unity 背包 - CSDN
unity 订阅
Unity是游戏引擎开发商 [1-2]  ,实时3D互动内容创作和运营平台 [3]  。 [2]  包括游戏开发、美术、建筑、汽车设计、影视制作在内的创作者运用Unity实现。 [2]  Unity提供一整套软件解决方案,可用于创作、运营和变现实时互动的2D和3D内容 [2]  ,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。 [2]  2019年使用Unity制作的游戏和体验已在全球范围内覆盖将近30亿台设备 [4]  ,月均下载量超过30亿次 [5]  。并且其在2019年的安装量已超过370亿次。 [4]  全平台(包括PC/主机/移动设备)游戏中有一半都是基于Unity创作的。 [5]  Unity提供易用实时平台,开发者可以在平台上构建各种AR和VR互动体验 [5]  ,全球超过60%的AR和VR内容都用Unity制作。 [5]  2020年5月9日,Unity宣布收购加拿大技术服务公司Finger Food,拓展工业应用版图。 [6] 展开全文
Unity是游戏引擎开发商 [1-2]  ,实时3D互动内容创作和运营平台 [3]  。 [2]  包括游戏开发、美术、建筑、汽车设计、影视制作在内的创作者运用Unity实现。 [2]  Unity提供一整套软件解决方案,可用于创作、运营和变现实时互动的2D和3D内容 [2]  ,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。 [2]  2019年使用Unity制作的游戏和体验已在全球范围内覆盖将近30亿台设备 [4]  ,月均下载量超过30亿次 [5]  。并且其在2019年的安装量已超过370亿次。 [4]  全平台(包括PC/主机/移动设备)游戏中有一半都是基于Unity创作的。 [5]  Unity提供易用实时平台,开发者可以在平台上构建各种AR和VR互动体验 [5]  ,全球超过60%的AR和VR内容都用Unity制作。 [5]  2020年5月9日,Unity宣布收购加拿大技术服务公司Finger Food,拓展工业应用版图。 [6]
信息
开发公司
Unity Technologies
类    别
创作引擎、开发工具 [2]
员工数
约3500名 [2]
CEO
John Riccitiello [7]
别    名
U3D、Unity3D
属    性
软件公司 [2]
成立时间
2004年 [4]
支持维度
2D、3D、VR、AR、MR [2]
外文名
Unity
编程语言
C# [2]
Unity基本介绍
Unity3D(7张) Unity [8]  引擎使开发者能够为超过20个平台创作和优化内容 [5]  ,包括iOS、安卓、Windows [2]  、Mac OS、索尼PS4、任天堂Switch [2]  、微软Xbox One、谷歌Stadia、微软Hololens、谷歌AR Core、苹果AR Kit、商汤SenseAR等等 [2]  。公司超过1400人规模的研发团队让Unity的技术跟随合作伙伴迭代 [5]  ,确保在最新的版本和平台上提供优化支持服务。 [5]  Unity还提供运营服务来帮助创作者 [2]  ,包括:Unity Ads广告服务、Unity游戏云一站式联网游戏服务、Vivox游戏语音服务、Multiplay海外服务器托管服务 [2]  、Unity内容分发平台(UDP)、Unity Asset Store资源商店 [2]  、Unity云构建等。 [2]  Unity在中国、比利时、芬兰、加拿大、法国、新加坡、德国等16个国家拥有44个办公室 [5]  ,创作者分布在全球190个国家和地区。 [5] 
收起全文
  • 基于Unity的游戏开发(上)

    万人学习 2019-06-24 11:55:37
    本课程是Unity游戏开发的入门课程,课程分为上、下两个部分。上篇主要讲述游戏的基本概念、Unity的开发环境、游戏资源的创建和使用等基础内容。
  • Unity入门:第一个游戏

    万次阅读 多人点赞 2018-02-02 22:12:12
    Unity官网提供了详尽的文档和丰富的教学视频,昨天跟着视频做了一个简单的3d游戏“roll-a-ball”。游戏涉及了许多Unity的基本知识,用来入门很不错。 这篇博文并不讲述整个游戏的制作流程,如果您感兴趣,可以访问...

    Unity官网提供了详尽的文档和丰富的教学视频,昨天跟着视频做了一个简单的3d游戏“roll-a-ball”。游戏涉及了许多Unity的基本知识,用来入门很不错。

    这篇博文并不讲述整个游戏的制作流程,如果您感兴趣,可以访问这里,如果访问遇到什么困难,在B站有一摸一样的视频

    这是完成以后的样子:


    运行效果:


    作为个人小结,下面写一些做这个游戏的收获:

    1、什么是Unity?

    一款游戏引擎,至于什么是游戏引擎,这里不展开。

    2、下载和安装

    官网:Unity官网

    作为学习用途,下载personal版即可。

    3、熟悉Unity界面

    进入Unity后,将会看到这样的界面:


    上图将界面划分成了5部分,下面分别解释每部分的功能:

    (1)Toolbar

    上面的按钮有不同的功能,比如左侧的第一个按钮可以用来移动场景中的物体,第二个按钮用来进行平移变换,第三个按钮用来进行旋转变换等。

    (2)Hierarchy window

    顾名思义,这个部分显示的是“层次结构”,场景中的对象都会被列到这个窗口中。当我们新建一个Unity项目时,Unity就会自动为我们添加两个东西:Main Camera和Directional Light,一个是相机,一个是光照。Hierarchy window上面有一个create按钮,点击这个按钮,我们可以看到一个包含了空对象、2d,3d对象、UI、光照、相机等在内的菜单,在这里你可以点击你想创建的东西。

    (3)Scene view

    这是游戏的场景,我们可以通过调整右上角的坐标系图案来调整观察场景的位置。

    (4)Inspector window

    当我们选中一个对象,打开Inspector window,这个对象的信息,例如所在的位置,平移了多少等等都会在这个窗口显示,当然也可以用这个窗口来调整场景中的对象,例如为了编辑方便,一开始我们会使用transform中的reset,将对象放置在坐标原点(0,0,0)。Inspector window最下面有一个Add Component按钮,通过这个按钮可以给对象增加其它的component,例如添加一条C#脚本等。

    (5)Project window

    这个窗口显示的是这个游戏使用的资源,通常我们会在这里建立一些文件夹,例如Scenes文件夹专门保存场景,Materials文件夹专门保存材质,Scripts文件夹专门保存脚本等。Project window上有一个不起眼的create按钮,这个按钮很有用,例如我们可以点击create->folder来新建一个文件夹等等。

    事实上,这只是Unity界面一个最基本的布局,你可以自己拖动这些window或者view来将它们放置在自己喜欢的位置,也就是说,操作界面是可以个性化的。其实上面漏掉了一个很重要的view:game view,如下图所示:


    这个view的按钮就在scene view旁边,上图中我已经将它拖动到了scene view下面,这个视图显示的是我们的游戏最终呈现给用户的样子,制作好一个游戏后,可以点击Toolbar中间那个表示Play的按钮进行试玩,游戏的运行情况就显示在这个视图中。

    为了方便编辑,我们常把Scene view和Game view并列在一起,就像上图一样,这样,在用Play试玩调试的时候可以不用频繁切换视图,从而节省了时间。

    4、怎么理解游戏中的几个脚本?

    Unity会自动为每个新建的C#脚本生成void Start()和void Update()两个方法,第一个在第一帧,也就是游戏刚开始时调用,第二个在画面更新时调用(准确地说是在渲染每一帧之前被调用)。

    在这个游戏中我们会用到三个脚本:

    (1)CameraController.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class CameraController : MonoBehaviour {
    	public GameObject player;
    	private Vector3 offset;
    
    	void Start () {
    		offset = transform.position - player.transform.position;
    	}
    	
    	void LateUpdate () {
    		transform.position = player.transform.position + offset;
    	}
    }
    脚本的作用是当Player移动时,让相机也随着移动。

    这里有一个问题:要达到类似的效果,为什么不直接把Main Camera设置成Player的孩子?

    (2)PlayerController.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class PlayerController : MonoBehaviour {
    	public float speed;
    	public Text countText;
    	public Text winText;
    
    	private Rigidbody rb;
    	private int count;
    
    
    	void Start()
    	{
    		rb = GetComponent<Rigidbody>();
    		count = 0;
    		SetCountText();
    		winText.text = "";
    	}
    
    	void FixedUpdate()
    	{
    		float moveHorizontal = Input.GetAxis("Horizontal");
    		float moveVertical = Input.GetAxis("Vertical");
    		Vector3 movement=new Vector3(moveHorizontal,0.0f,moveVertical);
    		rb.AddForce (movement*speed);
    	}
    
    	void OnTriggerEnter(Collider other)
    	{
    		if (other.gameObject.CompareTag ("PickUp")) 
    		{
    			other.gameObject.SetActive (false);
    			count++;
    			SetCountText();
    		}	
    	}
    
    	void SetCountText()
    	{
    		countText.text = "Count:" + count.ToString ();
    		if(count>=12)
    		{
    			winText.text="You Win!";
    		}
    	}
    }

    这个脚本被添加到了叫做Player的小球上,Start函数用来做初始化,其中的getComponent用来获取刚体对象,也就是添加到叫做Player的小球上的那个RigidBody。为什么用FixedUpdate()不用Update()?因为FixedUpdate在做物理计算之前被调用,这个游戏中的碰撞属于physics的范畴,所以用FixedUpdate()。还有一个要注意的函数是OnTriggerEnter(),这个函数在对象碰到collider的时候会被触发,在这个例子中,我们给12个Pickup关联上了一个叫“PickUp”的Tag,当碰撞发生时如果发现Tag是PickUp,就deactivate这个PickUp(每个PickUp的is trigger需要勾选上)。教学视频中提到一个问题:除了要给PickUp的collider勾选is trigger,还要加上rigidbody(is kinematic),这是因为Unity计算所有collider的体积后把它们放在一个cache里,如果collier是静态的(static),这样做可以避免在每帧更新的时候重复计算,但是在我们这个游戏中,因为每次collider都在旋转,所以每次它的体积都会被重复计算,为了节省资源,可以把collider设置成动态的(dynamic=collider+rigidbody)。

    (3)Rotater.cs

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Rotator : MonoBehaviour {
    
    	
    	// Update is called once per frame
    	void Update () {
    		transform.Rotate (new Vector3(15,30,45)*Time.deltaTime);
    	}
    }
    这里要用的是Update而不是FixedUpdate(和物理无关)。

    5、其他

    (1)prefab

    类似模板一样,可以将需要复用某个逻辑的一堆对象放到prefab文件夹中,这就可以对整体进行编辑、修改了。

    (2)快捷键

    例如ctrl+D用来duplicate

    (3)有不懂的查文档!!!

    展开全文
  • 深入浅出Unity3D——第一篇

    万人学习 2019-07-01 10:35:43
    Unity3D基础知识、游戏算法一网打尽。
  • C# For Unity系列之入门篇

    万人学习 2020-07-13 14:36:00
    学习好Unity,其先决条件是一定要有稳固、扎实的编程基础!课程 《C# For Unity系列之入门篇》配套学习资料链接:http://pan.baidu.com/s/1gflxreN 密码:sou5;刘老师讲Unity学员群(2) 497429806 ...
  • Unity3D的UI系统(UGUI)初级入门

    千人学习 2018-10-22 21:38:13
    本课程主要介绍Unity3d的UI系统(UGUI),先对UGUI做一个总体概述,之后对每个UI控件逐一进行详细讲述,内容包括控件的作用、设置方法、使用场景及属性细节,帮助大家熟练使用UGUI设计游戏的交互界面。
  • Unity&火炬效果实例

    2018-08-05 13:44:17
    特效实例1 火炬效果(Torch) 实例演示: 1.创建一个Particle System,重命名为Torch 2.修改Inspector视图内各项粒子参数: ...3.依次选中(勾选上)Inspector视图内的Emission、Shape、Color、over Lifetime...

    特效实例1

    火炬效果(Torch)

    实例演示:
    image
    实现步骤:
    1.创建一个Particle System,重命名为Torch
    2.修改Inspector视图内各项粒子参数:
    image
    3.依次选中(勾选上)Inspector视图内的Emission、Shape、Color、over Lifetime、Size over Lifetime、Renderer,并修改数值:
    image
    image
    image
    image2
    4.为Torch添加一个Point Light子对象,设置参数:
    image

    5.制作成Prefab,至此,火炬效果就完成了


    1. 本实例所采用Unity版本为2018.2.1f1
    2. 被遮挡部分为默认设置,属截图失误
    展开全文
  • UnityShader实例:遮挡透明材质

    千次阅读 2016-10-18 20:16:19
    遮挡透明材质 在3D游戏中,经常会出现控制的角色被房子或者墙壁之类的挡住,一些游戏会把挡住角色的物体透明化显示(这个应该需要脚本配合shader实现,因此不在本文讨论范围),如藏地传奇;...

    转载于:http://blog.csdn.net/u011047171

    遮挡透明材质

    在3D游戏中,经常会出现控制的角色被房子或者墙壁之类的挡住,一些游戏会把挡住角色的物体透明化显示(这个应该需要脚本配合shader实现,因此不在本文讨论范围),如藏地传奇;而一些游戏会做一些特殊效果把角色被挡住的部分显示出来,如火炬之光这样(如下图),下面就用shader实现这一效果:



    shader实现原理:


    分析上图的效果,角色被前面墙体挡住的部分显示的类似xray效果(代码就直接从前面拿了,哈哈),没被挡住的部分显示贴图的正常效果,因此可以知道这个shader需要两个pass来实现。其中一个pass正常显示贴图,另外一个pass实现xray效果。当然不止这么简单,要实现上图的效果还需要Ztest,Zwrite,以及渲染队列等知识。

    准备知识:


    Rendering Order渲染队列


    渲染队列,从字面的意思理解就是渲染的顺序,即对象渲染谁先谁后,如图你画画的时候,如果画画的时候每一笔的顺序一样,如果第一笔画红色,后面一笔画黑色,最终黑色会把红色覆盖掉。Unity里面我们可以通过SubShader Tags中的Queue Tag控制,unity提供了一些内置的渲染队列:

    渲染队列 渲染队列描述 渲染队列值
    Background 这个队列被最先渲染。它被用于skyboxes等。 1000
    Geometry 这是默认的渲染队列。它被用于绝大多数对象。不透明几何体使用该队列。 2000
    AlphaTest 通道检查的几何体使用该队列。它和Geometry队列不同,对于在所有立体物体绘制后渲染的通道检查的对象,它更有效。 2450
    Transparent 该渲染队列在Geometry和AlphaTest队列后被渲染。任何通道混合的(也就是说,那些不写入深度缓存的Shaders)对象使用该队列,例如玻璃和粒子效果。 3000
    Overlay 该渲染队列是为覆盖物效果服务的。任何最后被渲染的对象使用该队列,例如镜头光晕。 4000

    在关闭深度测的情况下,可以看出处于background队列的物体会最先被渲染,如果没有深度测试,他将现实画面的最后面,如果前面geometry队列的物体,就会优先显示geometry的物体,我想一般都会有这个问题:如果属于同一个渲染队列该怎么决定谁先谁后呢,所以unity还有其他的方式决定物体能根据实际深度正常显示,如深度测试。可以这么说,渲染队列相当于把物体进行了大致的排序,如果需要精确的话,还需要其他的操作。

    Depth Testing深度测试


    Depth Testing:深度测试,也叫深度缓冲。用来确定物体的遮挡关系。只有最靠近观察者的物体会被绘制。深度即Z,该值越小表示离观察者越近,该值越大表示离观察者越远。


    Shader里默认有如下代码
    ZWrite On
    ZTest LEqual

    意思即使Shader里没有写任何关于Depth Testing的代码,Shader也会执行深度测试。

    ZWrite:是否此物体的像素深度会被记录(默认记录),
    ZWrite On  深度记录(默认On),此对象的深度会根据实际情况进行记录。
    ZWrite Off  不记录此深度,通常用于半透明物体,

    ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always

    默认是 LEqual。 即当深度小于或者等于 深度最小值时,渲染物体,即渲染最近的物体。


       根据上面的知识我们可以整理个思路,在unity默认情况下物体深度缓存都是打开的,除了半透明物体外,大部分物体都会根据实际情况渲染,显示正确的遮挡关系,即离观察者越近的物体会挡住离观察较远的物体。因此要实现本文的效果,使的被挡住的部分现实出来,我们需要关闭深度缓存(不是关闭ztest),自己控制渲染队列来使被遮挡物体的部分显示到遮挡物的前面来,具体就是在shader中,首先将subshader Tag改成如下形式:
    Tags { "Queue" = "Geometry+500" "RenderType"="Opaque" }  

       这样物体将在不透明物体(墙壁)之后渲染,同时定义两个pass,一个输出xray效果,一个输出贴图颜色,将第一个pass设置成Zwitre off,关闭深度缓存,并将Ztest 参数设置成Greater,第二个pass使用默认设置 即Zwrite on , Ztest LEqual。

       那么执行的时候,如果对象没有被墙壁挡住时,先执行的pass输出xray效果,后执行的pass输出了贴图颜色,最终xray被替换成正常贴图颜色。而如果对象被墙壁遮挡时,第一个pass不将它的深度值写入【深度缓存】,此时Ztest参数为Greater ,显然当前pass的深度值("Geometry+500")是大于墙壁深度值的,所以最终显示了当前pass的颜色,第二个pass是默认设置,并写入了【深度缓存】,深度值是小于墙壁深度值的,根据ztest LEqual第二个pass的贴图颜色被剔除,最终的颜色就会根据blend公式,显示第一个pass和墙壁颜色的混合结果:

    Blend  SrcAlpha   One

    最终颜色=xray效果RGB*xray效果Alpha+墙壁RGB*1


    对于这个效果可以总结出个简单的代码模式:

    [csharp] view plain copy
     print?
    1. Shader "…………"     
    2. {    
    3.     Properties     
    4.     {     
    5.         ……………………  
    6.     }    
    7.         
    8.     SubShader     
    9.     {    
    10.           
    11.         LOD 300    
    12. //更改渲染队列,调整绘制顺序,使物体绘制到其他物体之前  
    13.     Tags { "Queue" = "Geometry+500" "RenderType"="Opaque" }  
    14. //第一个pass输出xray部分,两个pass的顺序不能改变  
    15. Pass  
    16.     {  
    17.         Blend SrcAlpha One//设置颜色混合结果  
    18.         ZWrite off  //关闭深度缓存,重写对象的绘制顺序  
    19.         ztest greater//当深度大于最小值时,渲染对象  
    20.         …………………………  
    21.     }  
    22. //第二个pass正常输出贴图颜色  
    23.         pass    
    24.         {    
    25.                 ZTest LEqual//缺省值,可以不写,当深度小于或者等于深度最小值时,渲染对象,即渲染最近的物体。     
    26.                 …………………………   
    27.         }     
    28. }  





    VF版本代码01:

    [csharp] view plain copy
     print?
    1. Shader "PengLu/OccTransVF"     
    2. {    
    3.     Properties     
    4.     {     
    5.         _MainTex ("Base (RGB)", 2D) = "white" {}    
    6.         _RimColor("RimColor",Color) = (0,1,1,1)  
    7.         _RimPower ("Rim Power", Range(0.1,8.0)) = 1.0  
    8.     }    
    9.         
    10.     SubShader     
    11.     {    
    12.           
    13.         LOD 300    
    14.         Tags { "Queue" = "Geometry+500" "RenderType"="Opaque" }   
    15.         Pass  
    16.         {  
    17.             Blend SrcAlpha One  
    18.             ZWrite off  
    19.             Lighting off  
    20.   
    21.             ztest greater  
    22.   
    23.             CGPROGRAM  
    24.             #pragma vertex vert  
    25.             #pragma fragment frag  
    26.             #include "UnityCG.cginc"  
    27.   
    28.             float4 _RimColor;  
    29.             float _RimPower;  
    30.               
    31.             struct appdata_t {  
    32.                 float4 vertex : POSITION;  
    33.                 float2 texcoord : TEXCOORD0;  
    34.                 float4 color:COLOR;  
    35.                 float4 normal:NORMAL;  
    36.             };  
    37.   
    38.             struct v2f {  
    39.                 float4  pos : SV_POSITION;  
    40.                 float4  color:COLOR;  
    41.             } ;  
    42.             v2f vert (appdata_t v)  
    43.             {  
    44.                 v2f o;  
    45.                 o.pos = mul(UNITY_MATRIX_MVP,v.vertex);  
    46.                 float3 viewDir = normalize(ObjSpaceViewDir(v.vertex));  
    47.                 float rim = 1 - saturate(dot(viewDir,v.normal ));  
    48.                 o.color = _RimColor*pow(rim,_RimPower);  
    49.                 return o;  
    50.             }  
    51.             float4 frag (v2f i) : COLOR  
    52.             {  
    53.                 return i.color;   
    54.             }  
    55.             ENDCG  
    56.         }  
    57.         pass    
    58.         {    
    59.             ZWrite on  
    60.             ZTest less   
    61.   
    62.             CGPROGRAM    
    63.             #pragma vertex vert    
    64.             #pragma fragment frag    
    65.             sampler2D _MainTex;    
    66.             float4 _MainTex_ST;  
    67.                 
    68.             struct appdata {    
    69.                 float4 vertex : POSITION;    
    70.                 float2 texcoord : TEXCOORD0;    
    71.             };    
    72.               
    73.             struct v2f  {    
    74.                 float4 pos : POSITION;    
    75.                 float2 uv : TEXCOORD0;    
    76.             };    
    77.               
    78.             v2f vert (appdata v)   
    79.             {    
    80.                 v2f o;    
    81.                 o.pos = mul(UNITY_MATRIX_MVP,v.vertex);    
    82.                 o.uv = v.texcoord;    
    83.                 return o;    
    84.             }   
    85.                
    86.             float4 frag (v2f i) : COLOR    
    87.             {    
    88.                 float4 texCol = tex2D(_MainTex, i.uv);    
    89.                 return texCol;    
    90.             }    
    91.             ENDCG    
    92.         }    
    93.     }   
    94.     FallBack "Diffuse"   
    95. }    


    VF版本代码01效果


    展开全文
  • UnityShader实例04:遮挡透明材质

    万次阅读 2015-07-16 14:45:34
    遮挡透明材质 边缘光材质原理和xray材质相类似,shader代码也就长得几乎一样了,一般游戏中做一些角色的背光效果,或者宝石材质(如下图所示),总之看怎么灵活运用了。

    遮挡透明材质

    在3D游戏中,经常会出现控制的角色被房子或者墙壁之类的挡住,一些游戏会把挡住角色的物体透明化显示(这个应该需要脚本配合shader实现,因此不在本文讨论范围),如藏地传奇;而一些游戏会做一些特殊效果把角色被挡住的部分显示出来,如火炬之光这样(如下图),下面就用shader实现这一效果:



    shader实现原理:


    分析上图的效果,角色被前面墙体挡住的部分显示的类似xray效果(代码就直接从前面拿了,哈哈),没被挡住的部分显示贴图的正常效果,因此可以知道这个shader需要两个pass来实现。其中一个pass正常显示贴图,另外一个pass实现xray效果。当然不止这么简单,要实现上图的效果还需要Ztest,Zwrite,以及渲染队列等知识。

    准备知识:


    Rendering Order渲染队列


    渲染队列,从字面的意思理解就是渲染的顺序,即对象渲染谁先谁后,如图你画画的时候,如果画画的时候每一笔的顺序一样,如果第一笔画红色,后面一笔画黑色,最终黑色会把红色覆盖掉。Unity里面我们可以通过SubShader Tags中的Queue Tag控制,unity提供了一些内置的渲染队列:

    渲染队列 渲染队列描述 渲染队列值
    Background 这个队列被最先渲染。它被用于skyboxes等。 1000
    Geometry 这是默认的渲染队列。它被用于绝大多数对象。不透明几何体使用该队列。 2000
    AlphaTest 通道检查的几何体使用该队列。它和Geometry队列不同,对于在所有立体物体绘制后渲染的通道检查的对象,它更有效。 2450
    Transparent 该渲染队列在Geometry和AlphaTest队列后被渲染。任何通道混合的(也就是说,那些不写入深度缓存的Shaders)对象使用该队列,例如玻璃和粒子效果。 3000
    Overlay 该渲染队列是为覆盖物效果服务的。任何最后被渲染的对象使用该队列,例如镜头光晕。 4000

    在关闭深度测的情况下,可以看出处于background队列的物体会最先被渲染,如果没有深度测试,他将现实画面的最后面,如果前面geometry队列的物体,就会优先显示geometry的物体,我想一般都会有这个问题:如果属于同一个渲染队列该怎么决定谁先谁后呢,所以unity还有其他的方式决定物体能根据实际深度正常显示,如深度测试。可以这么说,渲染队列相当于把物体进行了大致的排序,如果需要精确的话,还需要其他的操作。

    Depth Testing深度测试


    Depth Testing:深度测试,也叫深度缓冲。用来确定物体的遮挡关系。只有最靠近观察者的物体会被绘制。深度即Z,该值越小表示离观察者越近,该值越大表示离观察者越远。


    Shader里默认有如下代码
    ZWrite On
    ZTest LEqual

    意思即使Shader里没有写任何关于Depth Testing的代码,Shader也会执行深度测试。

    ZWrite:是否此物体的像素深度会被记录(默认记录),
    ZWrite On  深度记录(默认On),此对象的深度会根据实际情况进行记录。
    ZWrite Off  不记录此深度,通常用于半透明物体,

    ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always

    默认是 LEqual。 即当深度小于或者等于 深度最小值时,渲染物体,即渲染最近的物体。


       根据上面的知识我们可以整理个思路,在unity默认情况下物体深度缓存都是打开的,除了半透明物体外,大部分物体都会根据实际情况渲染,显示正确的遮挡关系,即离观察者越近的物体会挡住离观察较远的物体。因此要实现本文的效果,使的被挡住的部分现实出来,我们需要关闭深度缓存(不是关闭ztest),自己控制渲染队列来使被遮挡物体的部分显示到遮挡物的前面来,具体就是在shader中,首先将subshader Tag改成如下形式:
    Tags { "Queue" = "Geometry+500" "RenderType"="Opaque" }  

       这样物体将在不透明物体(墙壁)之后渲染,同时定义两个pass,一个输出xray效果,一个输出贴图颜色,将第一个pass设置成Zwitre off,关闭深度缓存,并将Ztest 参数设置成Greater,第二个pass使用默认设置 即Zwrite on , Ztest LEqual。

       那么执行的时候,如果对象没有被墙壁挡住时,先执行的pass输出xray效果,后执行的pass输出了贴图颜色,最终xray被替换成正常贴图颜色。而如果对象被墙壁遮挡时,第一个pass不将它的深度值写入【深度缓存】,此时Ztest参数为Greater ,显然当前pass的深度值("Geometry+500")是大于墙壁深度值的,所以最终显示了当前pass的颜色,第二个pass是默认设置,并写入了【深度缓存】,深度值是小于墙壁深度值的,根据ztest LEqual第二个pass的贴图颜色被剔除,最终的颜色就会根据blend公式,显示第一个pass和墙壁颜色的混合结果:

    Blend  SrcAlpha   One

    最终颜色=xray效果RGB*xray效果Alpha+墙壁RGB*1


    对于这个效果可以总结出个简单的代码模式:

    Shader "…………"   
    {  
        Properties   
        {   
            ……………………
        }  
          
        SubShader   
        {  
            
            LOD 300  
    //更改渲染队列,调整绘制顺序,使物体绘制到其他物体之前
      	Tags { "Queue" = "Geometry+500" "RenderType"="Opaque" }
    //第一个pass输出xray部分,两个pass的顺序不能改变
    Pass
    	{
    		Blend SrcAlpha One//设置颜色混合结果
    		ZWrite off  //关闭深度缓存,重写对象的绘制顺序
    		ztest greater//当深度大于最小值时,渲染对象
    		…………………………
    	}
    //第二个pass正常输出贴图颜色
            pass  
            {  
                	ZTest LEqual//缺省值,可以不写,当深度小于或者等于深度最小值时,渲染对象,即渲染最近的物体。   
                	………………………… 
        	}   
    }





    VF版本代码01:

    Shader "PengLu/OccTransVF"   
    {  
        Properties   
        {   
            _MainTex ("Base (RGB)", 2D) = "white" {}  
            _RimColor("RimColor",Color) = (0,1,1,1)
    		_RimPower ("Rim Power", Range(0.1,8.0)) = 1.0
        }  
          
        SubShader   
        {  
            
            LOD 300  
      		Tags { "Queue" = "Geometry+500" "RenderType"="Opaque" } 
            Pass
    		{
    			Blend SrcAlpha One
    			ZWrite off
    			Lighting off
    
    			ztest greater
    
    			CGPROGRAM
    			#pragma vertex vert
    			#pragma fragment frag
    			#include "UnityCG.cginc"
    
    			float4 _RimColor;
    			float _RimPower;
    			
    			struct appdata_t {
    				float4 vertex : POSITION;
    				float2 texcoord : TEXCOORD0;
    				float4 color:COLOR;
    				float4 normal:NORMAL;
    			};
    
    			struct v2f {
    				float4  pos : SV_POSITION;
    				float4	color:COLOR;
    			} ;
    			v2f vert (appdata_t v)
    			{
    				v2f o;
    				o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
    				float3 viewDir = normalize(ObjSpaceViewDir(v.vertex));
                    float rim = 1 - saturate(dot(viewDir,v.normal ));
                    o.color = _RimColor*pow(rim,_RimPower);
    				return o;
    			}
    			float4 frag (v2f i) : COLOR
    			{
    				return i.color; 
    			}
    			ENDCG
    		}
            pass  
            {  
                ZWrite on
                ZTest less 
    
                CGPROGRAM  
                #pragma vertex vert  
                #pragma fragment frag  
                sampler2D _MainTex;  
                float4 _MainTex_ST;
                  
                struct appdata {  
                    float4 vertex : POSITION;  
                    float2 texcoord : TEXCOORD0;  
                };  
                
                struct v2f  {  
                    float4 pos : POSITION;  
                    float2 uv : TEXCOORD0;  
                };  
                
                v2f vert (appdata v) 
                {  
                    v2f o;  
                    o.pos = mul(UNITY_MATRIX_MVP,v.vertex);  
                    o.uv = v.texcoord;  
                    return o;  
                } 
                 
                float4 frag (v2f i) : COLOR  
                {  
                    float4 texCol = tex2D(_MainTex, i.uv);  
                    return texCol;  
                }  
                ENDCG  
            }  
        } 
        FallBack "Diffuse" 
    }  


    VF版本代码01效果




    展开全文
  • 10 2D灯光效果(法线贴图) 在这一节中,我们为场景添加一些装饰物件以及对应的灯光效果 添加火炬以及灯光 打开Props资源文件夹,找到我们需要的火炬预制体 Wall Torch,将父级火炬本身以及子物体所带的粒子效果的 ...
  • 各种高品质火特效

    2020-07-21 09:59:05
    各种高级高品质火的资源,各位亲友需要的话不要错过哦,
  • Unity3D基本入门及功能介绍

    万次阅读 多人点赞 2017-06-10 22:44:17
    本章主要是 Unity3D 的基础快速入门篇,通过本章的学习,能让初学者们快速的掌握和 应用 Unity3D 软件。 本章导读 本章无论对于 Unity3D 初学者、或是以前从事建模工作的设计师、又或者是从事过 3D 编程的人群,...
  • 大富翁游戏源码

    2020-07-30 23:33:32
    大富翁游戏源码 [注:本内容来自网络,在此分享仅为帮助有需要的网友,如果侵犯了您的权利,麻烦联系我,我会第一时间删除,谢谢您。]
  • Unity 使用 Spine 动画

    万次阅读 2019-07-27 13:13:19
    Unity 中,常常使用 Spine 来制作一些动画,引擎本身并不能直接播放 Spine 动画,需要额外导入一个 RunTime 插件库才能支持。 运行库导入 关于运行库的导入,有两种方式: 1. 从开源库导入 下载 Spine 的 ...
  • using UnityEngine; using System.Collections; using System.Collections.Generic; [System.Serializable] ...public class BarrackGroupInfo { ...public BarrackGroupType barrackGroupType;...public List barrack
  • Unity技巧】Unity中的优化技术

    万次阅读 多人点赞 2014-12-26 22:12:00
    除此之外,还参考了Unity Cookie中的一个教程。这篇文章旨在简要地说明一下常见的各种优化策略。不过对每个基础有非常深入地讲解,需要的童鞋可以自行去相关资料。影响性能的因素首先,我们得了解,影响游戏性能的...
  • Unity安装官方中文版教程 本文提供全流程,中文翻译。 助力快速完成 Unity 中文汉化的安装 为新手节省宝贵的时间,避免采坑! 安装过程非常简单,这里 Chinar 只说最简单的安装方式 下载官方语言文件 zh-cn.po ...
  • Unity Hub许可证激活问题

    万次阅读 多人点赞 2020-02-18 12:16:45
    去官网下了个Unity2019.1.02f,然后打开的时候又要我下一个Unity Hub2.0.0,很迷,不知道这个是干嘛的,了解了一下才知道,原来这个就是个管理Unity版本的软件,也就是我们可以在自己电脑上安装多个Unity版本,然后...
  • Unity中资源动态加载的几种方式比较

    万次阅读 多人点赞 2014-01-17 16:15:49
    初学Unity的过程中,会发现打包发布程序后,unity会自动将场景需要引用到的资源打包到安装包里,没有到的不会跟进去。我们在编辑器里看到的Asset中的文件结构只是工作于编辑器环境下的,在游戏中unity会重新组织...
  • Unity3d的安装

    万次阅读 2019-06-19 09:46:45
    Unity3d的安装 ** 1.在线安装 a.获取在线安装程序 第一步:进入官网:https://unity.com/cn 第二步:在主页的底部点击下载 第三步:来到UnityStore,拖到该页面的最底部,点击资源下面的Unity旧版本 第四步:来到Unity...
  • 每周更新unity3d视频教程,从入门到就业,官方unity3d培训,上千门实时更新课程,供学员在线观看学习,unity3d游戏开发,可以让学员随时随地学习! 免费网上学习unity3d自学教程,国内名师机构专业授课,O基础快速学习,1小时...
1 2 3 4 5 ... 20
收藏数 249,608
精华内容 99,843
关键字:

unity