• unity3d摄像机

    2013-08-25 10:00:53
    主要来自unity3d reference,再加上一些自己的理解 一 概述 摄像头是用于将世界场景投影到屏幕的设备。可以在场景中放置不限数目的摄像机,它们可以设定成任意的渲染次序,渲染到屏幕上的任意地方。 摄像机实质上是...
    
    

    主要来自unity3d reference再加上一些自己的理解

    一 概述

    摄像头是用于将世界场景投影到屏幕的设备。可以在场景中放置不限数目的摄像机,它们可以设定成任意的渲染次序,渲染到屏幕上的任意地方。

    摄像机实质上是用于将游戏显示给玩家看,它们可以被定制,在上面写脚本或者挂载到其他物体上面以获得想象中的各种效果。对于一个猜谜的游戏,可能只需对游戏的全部视图保持摄像机静止即可。对于第一人称的射击游戏,常会将摄像机挂载到玩家角色上面,将其放置在角色眼睛的高度。对于一个赛车游戏,可能会让摄像机跟随赛车。

    可以创建多个摄像机,然后为每一个赋予一个不同的深度值。摄像机是从低深度值到高深度值的次序进行绘制,一个深度值为2的摄像机将会在深度值为1的摄像机绘制之后再绘制。同时可以调整Normalized View Port Rect属性来调整摄像机视图在屏幕上的位置大小,使用这个可以创建多个迷你视图。


    二 属性

    1 clear flags

    确定屏幕的哪一部分将被清除。

    每个摄像机在渲染它视图的时候都会缓存颜色和深度信息。绘制出来的图像中那部分没有被绘制到的部分是空白的,默认的情况下会显示天空盒的颜色。

    当使用多个摄像机的时候,每个都在缓存中存放了它自己的颜色和深度信息,在每个相机渲染的时候会累积更多的数据。在场景中任何特定的摄像机渲染其视图的时候,可以指定清除标志来清除缓存信息中的不同部分。可选项有sky box,solid color,depth only和dont clear。


    <1> Skybox

    这是清除标志的默认设置。屏幕的任何空白部分都会显示摄像机的天空盒,如何当前摄像机没有设定天空盒,它会默认使用渲染设置中(Eidt->Render Settings)的天空盒。假如默认渲染设置中也没有设定天空盒,它会退而使用背景色。可以选择是否将一个天空盒组件添加到摄像机。

    <2> Solid Color

    屏幕的任何空白部分都会显示当前摄像机的背景色

    <3> Depth Only

    如果想要绘制一个玩家的枪而不让它在环境中不被裁剪,可以设定一个深度为0的相机来绘制环境,同时另一个深度为1的相机单独绘制这个武器。武器相机的清除标志应该设置成Depth Only。这会保持环境的图形显示在屏幕上,但是丢弃所有关于每个对象处于3D空间什么位置的信息。当枪被绘制的时候,被绘制出来的不透明部分会完全覆盖现有的被绘制的环境图像,而不管枪离墙壁多近。


    为相机使用Depth Only作为清除标志,会使相机仅仅根据相机的深度信息来输出画面,比如相机深度为N的清除标志设为Depth only,那么它的输出会直接覆盖在所有深度小于N的相机输出画面上,而不管在真实的3D环境中,各种对象的z值如何

    <4> Don’t clear

    这个模式下不会清除颜色和深度缓存。这会导致下一帧会在上一帧的结果上进行绘制,这个模式在游戏中用得少,一般用于常规的shader中。

    不清除的话不过一会屏幕所有的空白区域都会被填满,完全看不出是什么东西。


    2 Background

    在没有天空盒的时候,当所有的元素绘制完成后剩余屏幕的颜色,即那些没有被元素绘制到的屏幕区域显示的颜色


    3 Culling Mask

    用于来设定是否剔除处于某一层的对象。Unity场景中的每一个对象,都被分配了一个层,默认为“default”层。打开层级管理器可以看到初始状态下分配了8个层,即0-7层是已经被U3D使用,而”default”处于第0层。



    摄像机的Culling Mask的可选项就是这些被使用的层,外加两个完全选项Everthing和Nothing,摄像机Culling Mask的默认选择是Everything,即不剔除任何层,这个时候所有的层也都被选中,如下图


    假如现在要隐藏处于Background Image层的对象,只需在该列表中取消勾选Background Image即可。


    4 Projection

    摄像机的投影方式,有透视投影和正交投影两种。

    正交投影:投影线垂直于投影面,也叫平行投影


    将摄像机设成正交投影,可以看到它变成了一个立方体



    5 Size

    当摄像机设成正交投影时,摄像机对应的那个长方体的大小


    6 Field of view

    视角,透视投影时才有的特性。视角越大,能看到的视野也越大,对应的焦距也越短


    7 Clipping Planes

    裁剪平面,Near和Far指定了裁剪的区域范围,即在Near-Far范围之内的面将被裁剪掉,不进行渲染。

    远近裁剪平面和由Field Of view决定的平面一起构成一个椎体,被称为相机椎体或视椎体,完全处于该椎体之外的物体将会被剔除,这被称为椎体剔除。

    8 Normalized viewport rect

    指定如何将摄像机的视图绘制到屏幕坐标系上(取值范围为0-1)

    X:摄像机视图在屏幕上被绘制的水平初始位置

    Y:摄像机视图在屏幕上被绘制的垂直初始位置

    W:摄像机视图输出图像占屏幕宽度的比例

    H:摄像机视图输出图像占屏幕高度的比例

    U3D屏幕的坐标系是以左下角为坐标原点,向右为X轴,向上为Y轴


    9 Depth

    摄像机在绘制序列中的位置(层级)。有更大深度值的摄像机将会在深度值更小的摄像机上面绘制,即假如两个相机C1和C2,深度值分别为10和8,假如将摄像机设为在场景中可见,则C1会在C2的上层绘制,会把摄像机C2也绘制到图像中


    10 Rendering Path

    用于指定摄像机使用哪种渲染方法,有下面几种

    • Use Player Settings,摄像机会使用在玩家配置里面指定的渲染路径

    • Vertex Lit,所有被该摄像机渲染的对象都会被渲染成Vertex-Lit对象

    • Forward,所有的对象都会被渲染为一个材质对应一个通道

    • Deferred Lighting,所有的对象在没有光照的情况下绘制一次,然后在渲染队列的末端将所有对象的光照一起绘制,也就是所谓的“延迟光照”技术。


    11 Target Texture

    可以用于容纳摄像机视图输出的Render Texture对象的引用,设定这个引用将会禁止摄像机将视图绘制到屏幕


    12 HDR

    启用摄像机的高动态范围渲染(High Dynamic Range Rendering)



    三 示例

    示例:在屏幕上显示一个2D背景图

    做法如下,来自这里

    • 创建一个新的摄像机,取名为”Background Camera”

    • 创建一个新的GUI贴图,取名为”Background Image”

    • 单击Background Image的监视器面板的”Layer”下拉按钮,创建一个新的层,取名为”Background Image”

    • 设置好贴图Background Image的大小和位置,同时将它的层设定为“Background Image”

    • 选中Background Camera,对它的一些属性进行这样的操作:取消勾选Flare Layer和Audio Listener,设定清除标志为Solid Color,设定深度为-1,先将Culling Mask设为nothing,然后设为Background Image

    • 选中主摄像机,设置清除标志为Depth Only,将它的Culling Mask里面的Background Image取消勾选

    到此为止,即设定了一个屏幕的背景贴图。这里先将背景相机的清除标志设置为Solid Color,那么该相机绘图后的空白区域就会填充背景色,让后通过设置Culling Mask使其仅仅显示层”Background Image”,也就是说背景摄像机仅仅绘制背景贴图,空白部分用背景色填充。然后主摄像机设置Culling Mask使其不绘制背景贴图,并且将清除标志设置成Depth Only,因为背景相机的深度为-1,那么主相机的深度就为0,背景相机先进行绘制,然后主相机进行绘制,主相机绘制出来的不透明的部分会完全覆盖在前面层级相机的图像上,也就是说主相机的绘制结果会直接覆盖到背景贴图上,这就达到了屏幕背景贴图的效果。


    假如要进行满屏显示的话,手动调整背景图的大小显然是不实际的,应该使用代码

    backgroundGUITexture.pixelInset.width = Screen.width;

    backgroundGUITexture.pixelInset.height = Screen.height;

    backgroundGUITexture.pixelInset.x = 0;

    backgroundGUITexture.pixelInset.y = 0;

    但是由于程序运行的时候可能分辨率会发生改变,所以前面的两句应该设置成和分辨率相关的大小

    backgroundGUITexture.pixelInset.width = Screen.currentResolution.width;

    backgroundGUITexture.pixelInset.height = Screen.currentResolution.height;


    展开全文
  • 原文:http://blog.csdn.net/kfqcome/article/details/10159201

    原文:http://blog.csdn.net/kfqcome/article/details/10159201

    一 概述

    摄像头是用于将世界场景投影到屏幕的设备。可以在场景中放置不限数目的摄像机,它们可以设定成任意的渲染次序,渲染到屏幕上的任意地方。

    摄像机实质上是用于将游戏显示给玩家看,它们可以被定制,在上面写脚本或者挂载到其他物体上面以获得想象中的各种效果。对于一个猜谜的游戏,可能只需对游戏的全部视图保持摄像机静止即可。对于第一人称的射击游戏,常会将摄像机挂载到玩家角色上面,将其放置在角色眼睛的高度。对于一个赛车游戏,可能会让摄像机跟随赛车。

    可以创建多个摄像机,然后为每一个赋予一个不同的深度值。摄像机是从低深度值到高深度值的次序进行绘制,一个深度值为2的摄像机将会在深度值为1的摄像机绘制之后再绘制。同时可以调整Normalized View Port Rect属性来调整摄像机视图在屏幕上的位置大小,使用这个可以创建多个迷你视图。


    二 属性

    1 clear flags

    确定屏幕的哪一部分将被清除。

    每个摄像机在渲染它视图的时候都会缓存颜色和深度信息。绘制出来的图像中那部分没有被绘制到的部分是空白的,默认的情况下会显示天空盒的颜色。

    当使用多个摄像机的时候,每个都在缓存中存放了它自己的颜色和深度信息,在每个相机渲染的时候会累积更多的数据。在场景中任何特定的摄像机渲染其视图的时候,可以指定清除标志来清除缓存信息中的不同部分。可选项有sky box,solid color,depth only和dont clear。


    <1> Skybox

    这是清除标志的默认设置。屏幕的任何空白部分都会显示摄像机的天空盒,如何当前摄像机没有设定天空盒,它会默认使用渲染设置中(Eidt->Render Settings)的天空盒。假如默认渲染设置中也没有设定天空盒,它会退而使用背景色。可以选择是否将一个天空盒组件添加到摄像机。

    <2> Solid Color

    屏幕的任何空白部分都会显示当前摄像机的背景色

    <3> Depth Only

    如果想要绘制一个玩家的枪而不让它在环境中不被裁剪,可以设定一个深度为0的相机来绘制环境,同时另一个深度为1的相机单独绘制这个武器。武器相机的清除标志应该设置成Depth Only。这会保持环境的图形显示在屏幕上,但是丢弃所有关于每个对象处于3D空间什么位置的信息。当枪被绘制的时候,被绘制出来的不透明部分会完全覆盖现有的被绘制的环境图像,而不管枪离墙壁多近。


    为相机使用Depth Only作为清除标志,会使相机仅仅根据相机的深度信息来输出画面,比如相机深度为N的清除标志设为Depth only,那么它的输出会直接覆盖在所有深度小于N的相机输出画面上,而不管在真实的3D环境中,各种对象的z值如何

    <4> Don’t clear

    这个模式下不会清除颜色和深度缓存。这会导致下一帧会在上一帧的结果上进行绘制,这个模式在游戏中用得少,一般用于常规的shader中。

    不清除的话不过一会屏幕所有的空白区域都会被填满,完全看不出是什么东西。


    2 Background

    在没有天空盒的时候,当所有的元素绘制完成后剩余屏幕的颜色,即那些没有被元素绘制到的屏幕区域显示的颜色


    3 Culling Mask

    用于来设定是否剔除处于某一层的对象。Unity场景中的每一个对象,都被分配了一个层,默认为“default”层。打开层级管理器可以看到初始状态下分配了8个层,即0-7层是已经被U3D使用,而”default”处于第0层。



    摄像机的Culling Mask的可选项就是这些被使用的层,外加两个完全选项Everthing和Nothing,摄像机Culling Mask的默认选择是Everything,即不剔除任何层,这个时候所有的层也都被选中,如下图


    假如现在要隐藏处于Background Image层的对象,只需在该列表中取消勾选Background Image即可。


    4 Projection

    摄像机的投影方式,有透视投影和正交投影两种。

    正交投影:投影线垂直于投影面,也叫平行投影


    将摄像机设成正交投影,可以看到它变成了一个立方体



    5 Size

    当摄像机设成正交投影时,摄像机对应的那个长方体的大小


    6 Field of view

    视角,透视投影时才有的特性。视角越大,能看到的视野也越大,对应的焦距也越短


    7 Clipping Planes

    裁剪平面,Near和Far指定了裁剪的区域范围,即在Near-Far范围之内的面将被裁剪掉,不进行渲染。

    远近裁剪平面和由Field Of view决定的平面一起构成一个椎体,被称为相机椎体或视椎体,完全处于该椎体之外的物体将会被剔除,这被称为椎体剔除。

    8 Normalized viewport rect

    指定如何将摄像机的视图绘制到屏幕坐标系上(取值范围为0-1)

    X:摄像机视图在屏幕上被绘制的水平初始位置

    Y:摄像机视图在屏幕上被绘制的垂直初始位置

    W:摄像机视图输出图像占屏幕宽度的比例

    H:摄像机视图输出图像占屏幕高度的比例

    U3D屏幕的坐标系是以左下角为坐标原点,向右为X轴,向上为Y轴


    9 Depth

    摄像机在绘制序列中的位置(层级)。有更大深度值的摄像机将会在深度值更小的摄像机上面绘制,即假如两个相机C1和C2,深度值分别为10和8,假如将摄像机设为在场景中可见,则C1会在C2的上层绘制,会把摄像机C2也绘制到图像中


    10 Rendering Path

    用于指定摄像机使用哪种渲染方法,有下面几种

    • Use Player Settings,摄像机会使用在玩家配置里面指定的渲染路径

    • Vertex Lit,所有被该摄像机渲染的对象都会被渲染成Vertex-Lit对象

    • Forward,所有的对象都会被渲染为一个材质对应一个通道

    • Deferred Lighting,所有的对象在没有光照的情况下绘制一次,然后在渲染队列的末端将所有对象的光照一起绘制,也就是所谓的“延迟光照”技术。


    11 Target Texture

    可以用于容纳摄像机视图输出的Render Texture对象的引用,设定这个引用将会禁止摄像机将视图绘制到屏幕


    12 HDR

    启用摄像机的高动态范围渲染(High Dynamic Range Rendering)


    13.Hints

    • 相机可以像其他对象一样被实例化、父子化和脚本化。
    • 为提高赛车游戏的速度感,请使用高视野范围。
    • 如果你添加一个刚体组件,相机可以用于物理模拟。
    • 在你的场景中你可以使用的相机数量是没有限制的。
    • 正交相机可以很好的用于制作3D用户界面。
    • 如果你正遭遇深度问题(表面互相接近闪烁),尝试设置NearPlane尽可能大。
    • 相机无法同时渲染到屏幕和渲染纹理,只能有一个。
    • Pro版有一个渲染相机的视图到纹理的选项,称为渲染到纹理,可以得到更独特效果。
    • Unity预装了相机脚本,在Components->Camera Control 中可以找到。用它们来实验以体会“一切皆有可能”

    三 示例

    示例:在屏幕上显示一个2D背景图

    做法如下,来自这里

    • 创建一个新的摄像机,取名为”Background Camera”

    • 创建一个新的GUI贴图,取名为”Background Image”

    • 单击Background Image的监视器面板的”Layer”下拉按钮,创建一个新的层,取名为”Background Image”

    • 设置好贴图Background Image的大小和位置,同时将它的层设定为“Background Image”

    • 选中Background Camera,对它的一些属性进行这样的操作:取消勾选Flare Layer和Audio Listener,设定清除标志为Solid Color,设定深度为-1,先将Culling Mask设为nothing,然后设为Background Image

    • 选中主摄像机,设置清除标志为Depth Only,将它的Culling Mask里面的Background Image取消勾选

    到此为止,即设定了一个屏幕的背景贴图。这里先将背景相机的清除标志设置为Solid Color,那么该相机绘图后的空白区域就会填充背景色,让后通过设置Culling Mask使其仅仅显示层”Background Image”,也就是说背景摄像机仅仅绘制背景贴图,空白部分用背景色填充。然后主摄像机设置Culling Mask使其不绘制背景贴图,并且将清除标志设置成Depth Only,因为背景相机的深度为-1,那么主相机的深度就为0,背景相机先进行绘制,然后主相机进行绘制,主相机绘制出来的不透明的部分会完全覆盖在前面层级相机的图像上,也就是说主相机的绘制结果会直接覆盖到背景贴图上,这就达到了屏幕背景贴图的效果。


    假如要进行满屏显示的话,手动调整背景图的大小显然是不实际的,应该使用代码

    backgroundGUITexture.pixelInset.width = Screen.width;

    backgroundGUITexture.pixelInset.height = Screen.height;

    backgroundGUITexture.pixelInset.x = 0;

    backgroundGUITexture.pixelInset.y = 0;

    但是由于程序运行的时候可能分辨率会发生改变,所以前面的两句应该设置成和分辨率相关的大小

    backgroundGUITexture.pixelInset.width = Screen.currentResolution.width;

    backgroundGUITexture.pixelInset.height = Screen.currentResolution.height;


    展开全文
  • unity3d--摄像机

    2016-09-20 23:53:27
    unity3d摄像机 转载自http://blog.csdn.net/kfqcome/article/details/10159201 主要来自unity3d reference,再加上一些自己的理解 一 概述 摄像头是用于将世界场景投影到屏幕的设备。可以在场景中放置不限...

    unity3d摄像机

    转载自http://blog.csdn.net/kfqcome/article/details/10159201

    主要来自unity3d reference再加上一些自己的理解

    一 概述

    摄像头是用于将世界场景投影到屏幕的设备。可以在场景中放置不限数目的摄像机,它们可以设定成任意的渲染次序,渲染到屏幕上的任意地方。

    摄像机实质上是用于将游戏显示给玩家看,它们可以被定制,在上面写脚本或者挂载到其他物体上面以获得想象中的各种效果。对于一个猜谜的游戏,可能只需对游戏的全部视图保持摄像机静止即可。对于第一人称的射击游戏,常会将摄像机挂载到玩家角色上面,将其放置在角色眼睛的高度。对于一个赛车游戏,可能会让摄像机跟随赛车。

    可以创建多个摄像机,然后为每一个赋予一个不同的深度值。摄像机是从低深度值到高深度值的次序进行绘制,一个深度值为2的摄像机将会在深度值为1的摄像机绘制之后再绘制。同时可以调整Normalized View Port Rect属性来调整摄像机视图在屏幕上的位置大小,使用这个可以创建多个迷你视图。


    二 属性

    1 clear flags

    确定屏幕的哪一部分将被清除。

    每个摄像机在渲染它视图的时候都会缓存颜色和深度信息。绘制出来的图像中那部分没有被绘制到的部分是空白的,默认的情况下会显示天空盒的颜色。

    当使用多个摄像机的时候,每个都在缓存中存放了它自己的颜色和深度信息,在每个相机渲染的时候会累积更多的数据。在场景中任何特定的摄像机渲染其视图的时候,可以指定清除标志来清除缓存信息中的不同部分。可选项有sky box,solid color,depth only和dont clear。


    <1> Skybox

    这是清除标志的默认设置。屏幕的任何空白部分都会显示摄像机的天空盒,如何当前摄像机没有设定天空盒,它会默认使用渲染设置中(Eidt->Render Settings)的天空盒。假如默认渲染设置中也没有设定天空盒,它会退而使用背景色。可以选择是否将一个天空盒组件添加到摄像机。

    <2> Solid Color

    屏幕的任何空白部分都会显示当前摄像机的背景色

    <3> Depth Only

    如果想要绘制一个玩家的枪而不让它在环境中不被裁剪,可以设定一个深度为0的相机来绘制环境,同时另一个深度为1的相机单独绘制这个武器。武器相机的清除标志应该设置成Depth Only。这会保持环境的图形显示在屏幕上,但是丢弃所有关于每个对象处于3D空间什么位置的信息。当枪被绘制的时候,被绘制出来的不透明部分会完全覆盖现有的被绘制的环境图像,而不管枪离墙壁多近。


    为相机使用Depth Only作为清除标志,会使相机仅仅根据相机的深度信息来输出画面,比如相机深度为N的清除标志设为Depth only,那么它的输出会直接覆盖在所有深度小于N的相机输出画面上,而不管在真实的3D环境中,各种对象的z值如何

    <4> Don’t clear

    这个模式下不会清除颜色和深度缓存。这会导致下一帧会在上一帧的结果上进行绘制,这个模式在游戏中用得少,一般用于常规的shader中。

    不清除的话不过一会屏幕所有的空白区域都会被填满,完全看不出是什么东西。


    2 Background

    在没有天空盒的时候,当所有的元素绘制完成后剩余屏幕的颜色,即那些没有被元素绘制到的屏幕区域显示的颜色


    3 Culling Mask

    用于来设定是否剔除处于某一层的对象。Unity场景中的每一个对象,都被分配了一个层,默认为“default”层。打开层级管理器可以看到初始状态下分配了8个层,即0-7层是已经被U3D使用,而”default”处于第0层。



    摄像机的Culling Mask的可选项就是这些被使用的层,外加两个完全选项Everthing和Nothing,摄像机Culling Mask的默认选择是Everything,即不剔除任何层,这个时候所有的层也都被选中,如下图


    假如现在要隐藏处于Background Image层的对象,只需在该列表中取消勾选Background Image即可。


    4 Projection

    摄像机的投影方式,有透视投影和正交投影两种。

    正交投影:投影线垂直于投影面,也叫平行投影


    将摄像机设成正交投影,可以看到它变成了一个立方体



    5 Size

    当摄像机设成正交投影时,摄像机对应的那个长方体的大小


    6 Field of view

    视角,透视投影时才有的特性。视角越大,能看到的视野也越大,对应的焦距也越短


    7 Clipping Planes

    裁剪平面,Near和Far指定了裁剪的区域范围,即在Near-Far范围之内的面将被裁剪掉,不进行渲染。

    远近裁剪平面和由Field Of view决定的平面一起构成一个椎体,被称为相机椎体或视椎体,完全处于该椎体之外的物体将会被剔除,这被称为椎体剔除。

    8 Normalized viewport rect

    指定如何将摄像机的视图绘制到屏幕坐标系上(取值范围为0-1)

    X:摄像机视图在屏幕上被绘制的水平初始位置

    Y:摄像机视图在屏幕上被绘制的垂直初始位置

    W:摄像机视图输出图像占屏幕宽度的比例

    H:摄像机视图输出图像占屏幕高度的比例

    U3D屏幕的坐标系是以左下角为坐标原点,向右为X轴,向上为Y轴


    9 Depth

    摄像机在绘制序列中的位置(层级)。有更大深度值的摄像机将会在深度值更小的摄像机上面绘制,即假如两个相机C1和C2,深度值分别为10和8,假如将摄像机设为在场景中可见,则C1会在C2的上层绘制,会把摄像机C2也绘制到图像中


    10 Rendering Path

    用于指定摄像机使用哪种渲染方法,有下面几种

    • Use Player Settings,摄像机会使用在玩家配置里面指定的渲染路径

    • Vertex Lit,所有被该摄像机渲染的对象都会被渲染成Vertex-Lit对象

    • Forward,所有的对象都会被渲染为一个材质对应一个通道

    • Deferred Lighting,所有的对象在没有光照的情况下绘制一次,然后在渲染队列的末端将所有对象的光照一起绘制,也就是所谓的“延迟光照”技术。


    11 Target Texture

    可以用于容纳摄像机视图输出的Render Texture对象的引用,设定这个引用将会禁止摄像机将视图绘制到屏幕


    12 HDR

    启用摄像机的高动态范围渲染(High Dynamic Range Rendering)



    三 示例

    示例:在屏幕上显示一个2D背景图

    做法如下,来自这里

    • 创建一个新的摄像机,取名为”Background Camera”

    • 创建一个新的GUI贴图,取名为”Background Image”

    • 单击Background Image的监视器面板的”Layer”下拉按钮,创建一个新的层,取名为”Background Image”

    • 设置好贴图Background Image的大小和位置,同时将它的层设定为“Background Image”

    • 选中Background Camera,对它的一些属性进行这样的操作:取消勾选Flare Layer和Audio Listener,设定清除标志为Solid Color,设定深度为-1,先将Culling Mask设为nothing,然后设为Background Image

    • 选中主摄像机,设置清除标志为Depth Only,将它的Culling Mask里面的Background Image取消勾选

    到此为止,即设定了一个屏幕的背景贴图。这里先将背景相机的清除标志设置为Solid Color,那么该相机绘图后的空白区域就会填充背景色,让后通过设置Culling Mask使其仅仅显示层”Background Image”,也就是说背景摄像机仅仅绘制背景贴图,空白部分用背景色填充。然后主摄像机设置Culling Mask使其不绘制背景贴图,并且将清除标志设置成Depth Only,因为背景相机的深度为-1,那么主相机的深度就为0,背景相机先进行绘制,然后主相机进行绘制,主相机绘制出来的不透明的部分会完全覆盖在前面层级相机的图像上,也就是说主相机的绘制结果会直接覆盖到背景贴图上,这就达到了屏幕背景贴图的效果。


    假如要进行满屏显示的话,手动调整背景图的大小显然是不实际的,应该使用代码

    backgroundGUITexture.pixelInset.width = Screen.width;

    backgroundGUITexture.pixelInset.height = Screen.height;

    backgroundGUITexture.pixelInset.x = 0;

    backgroundGUITexture.pixelInset.y = 0;

    但是由于程序运行的时候可能分辨率会发生改变,所以前面的两句应该设置成和分辨率相关的大小

    backgroundGUITexture.pixelInset.width = Screen.currentResolution.width;

    backgroundGUITexture.pixelInset.height = Screen.currentResolution.height;

    展开全文
  • if (Camera!=null&amp;&amp;Camera.transform.hasChanged)  {  SetObjectVisibilityDirty();  Camera.transform.hasChanged = false; }               转自:...

    if (Camera!=null&&Camera.transform.hasChanged)
     {
             SetObjectVisibilityDirty();
             Camera.transform.hasChanged = false;
    }

     

     

     

     

     

     

     

    转自:http://www.cnblogs.com/AdvancePikachu/p/6733620.html

    using System.Collections;

    using System.Collections.Generic;

    using UnityEngine;

    /// <summary>

    /// 将脚本挂在摄像机观察的物体上  物体必须带有Render

    /// </summary>

    public class PlayerView : MonoBehaviour {

     

        bool isRendering;  

        float curtTime = 0f;

        float lastTime = 0f;

     

        void OnWillRenderObject()

        {

            curtTime = Time.time;

        }

        public bool IsInView(Vector3 worldPos)

        {

            Transform camTransform = Camera.main.transform;

            Vector2 viewPos = Camera.main.WorldToViewportPoint(worldPos);

            Vector3 dir = (worldPos - camTransform.position).normalized;

            float dot = Vector3.Dot(camTransform.forward, dir);     //判断物体是否在相机前面

     

            if (dot > 0 && viewPos.x >= 0 && viewPos.x <= 1 && viewPos.y >= 0 && viewPos.y <= 1)

                return true;

            else

                return false;

        }

     

        void Update()

        {

            Vector2 vec2 = Camera.main.WorldToScreenPoint(this.gameObject.transform.position);

            

            if (IsInView(transform.position))   

            {

                Debug.Log("目前本物体在摄像机范围内");

            }

            else

            {

                Debug.Log("目前本物体不在摄像机范围内");  

            }

        }

    }

     

    展开全文
  • Unity3D实战】零基础一步一步教你制作跑酷类游戏(填坑完整版) - Unity3D知识库

    一、前言

    最近跑酷游戏比较流行,开发教程也很多,但是大部分都是不太详细,这篇文章就带着大家一步一步开发出来一个跑酷类的游戏,教程比较基础,适合大部分Unity开发的初学者。
    还有就是,此专栏已经开通收费,里面整合的都是小游戏的开发教程,想要学习Unity开发游戏的,都可以订阅一下。
    如果文章出现什么问题,就及时联系我

    二、效果图&下载链接

    在这里插入图片描述
    Github地址:https://github.com/764424567/Game_Parkour

    三、教程

    在教程开始之前,我们分析一下跑酷类游戏制作思路。
    首先是道路和障碍物,我们可以先设置三段道路,然后障碍物随机生成
    道路中间有抵达点,角色到达抵达点判断是否将后面的道路移动到前面接起来。
    首先到达第一段的抵达点,肯定是不切换
    到达第二段的抵达点,将1号路段移动到最前面
    到达第三段的抵达点,将2号路段移动到最前面
    循环往复,无穷尽也
    然后是主角的移动脚本,躲避障碍物,移动位置固定三个点,可以跳,可以铲地
    主角碰到障碍物就挂,游戏结束

    1、新建项目

    博主的Unity版本是Unity5.6.1f1,推荐大家使用我这个版本,或者其他的5.6.x版本,不然可能会出现各种各样奇奇怪怪的问题。
    在这里插入图片描述
    文件目录的话就按照我这个目录来,比较清晰明了。

    2、导入资源

    资源已经上传到Github,需要的可以下载
    https://github.com/764424567/Unity-plugin/tree/master/ParkourDemo
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    3、处理动画资源

    在这里插入图片描述
    可以看到所有的动画文件都有。
    接着我们就可以新建一个Animator Controller文件来管理动画文件。
    在这里插入图片描述
    命名随意。
    在这里插入图片描述
    接着我们将动画剪辑拖到Animator处理面板中:
    在这里插入图片描述
    默认状态是run,然后有jump 、slide、idle
    在这里插入图片描述
    接着就是“Take Transition”将run和jump 以及 run 、slide、idle连下线。

    设置两个bool值,来控制动画的切换:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    接下来我们就可以在场景中看一下动画效果了:
    在这里插入图片描述

    4、处理路段模型

    在这里插入图片描述
    首先我们找到导入的资源SimpleRoadwork,里面有一个Demo场景,点进去可以看一下各类模型:
    在这里插入图片描述
    在Prefabs文件夹中,可以找到我们需要的各类模型,包括路面、路标、障碍物:
    在这里插入图片描述
    接下来,我们就设计一下路面:
    在这里插入图片描述
    在这里插入图片描述
    接着摆放路标:
    在这里插入图片描述
    接着摆放障碍物:
    在这里插入图片描述
    因为障碍物我们要后期自动生成,现在就可以先隐藏起来。
    在这里插入图片描述
    然后设置到达点(到达点的目的是当角色到达这个位置的时候,自动切换路线):
    在这里插入图片描述
    隐藏它的Mesh Renderer ,将BoxCollider IsTrigger设置成true:
    在这里插入图片描述
    路段就完成了:

    在这里插入图片描述
    整个目录如下:
    在这里插入图片描述
    不会摆放也没有关系,我已经设置好了,用我的也行。

    5、主角模型处理

    在这里插入图片描述

    明显是有点大,我们给它同比例缩小一下:
    在这里插入图片描述
    在这里插入图片描述
    接着设置一下摄像机的视角:

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

    6、生成障碍物

    新建脚本Control_Scenes.cs
    我们首先来生成障碍物:

    using UnityEngine;
    
    public class Control_Scenes : MonoBehaviour
    {
        public GameObject[] m_ObstacleArray;
        public Transform[] m_ObstaclePosArray;
    
        void Start()
        {
            Spawn_Obstacle(1);
        }
    	
    	//生成障碍物
    	public void Spawn_Obstacle(int index)
        {
            //销毁原来的对象
            GameObject[] obsPast = GameObject.FindGameObjectsWithTag("Obstacle" + index);
            for (int i = 0; i < obsPast.Length; i++)
            {
                Destroy(obsPast[i]);
            }
            //生成障碍物
            foreach (Transform item in m_ObstaclePosArray[index])
            {
                GameObject prefab = m_ObstacleArray[Random.Range(0, m_ObstacleArray.Length)];
                Vector3 eulerAngle = new Vector3(0, Random.Range(0, 360), 0);
                GameObject obj = Instantiate(prefab, item.position, Quaternion.Euler(eulerAngle));
                obj.tag = "Obstacle" + index;
            }
        }
    }
    
    

    将脚本挂在Control_Scenes对象上:
    将Prefab文件夹里面的模型拖入到ObstacleArray对象数组卡槽中
    将隐藏以后的障碍物拖入到ObstaclePosArray对象数组卡槽中
    在这里插入图片描述
    添加Tag:
    在这里插入图片描述
    运行看一下:
    在这里插入图片描述

    7、路段切换

    我们接着打开Control_Scenes.cs
    添加函数:

    void Start()
    {
            //Spawn_Obstacle(1);
            Change_Road(1);
    }
    public void Change_Road(int index)
    {
            if (m_ISFirst && index == 0)
            {
                m_ISFirst = false;
                return;
            }
            else
            {
                int lastIndex = index - 1;
                if (lastIndex < 0)
                    lastIndex = 2;
                m_RoadArray[lastIndex].transform.position = m_RoadArray[lastIndex].transform.position - new Vector3(150, 0, 0);
                Spawn_Obstacle(lastIndex);
            }
    }
    

    PS:这里解释一下代码,怎么切换的呢
    举个例子,角色跑到了第二段,那么第一段要移动到第三段后面隔一个路段长度的距离,接下来画个图:
    在这里插入图片描述
    那么为啥x轴减去150。这是因为我发现这三条路段的距离都差了50,坐标轴是负轴,所以就减去了150。
    在这里插入图片描述

    我们可以测试一下效果:
    在这里插入图片描述
    但是仅仅这样是不够的,我们还需要在角色到达抵达点的时候,切换路线,当然第一段路不用切换,因为再切就没了。。
    这个在我们写完角色移动以后再补充。

    8、角色移动

    新建脚本:Control_Player.cs
    说明一下:因为我们设定的三条道,所以角色只能在三条道里面切换。那么只需要改变角色的z值就可以了。如果角色在最左边,那么只能往右移动,同理在最右边,只能往左移动,在中间两边都可以移动。

    接着我们就可以看一下z轴的值:
    中间:
    在这里插入图片描述
    在这里插入图片描述

    左边:
    在这里插入图片描述
    在这里插入图片描述
    右边:
    在这里插入图片描述
    在这里插入图片描述
    代码:

    using UnityEngine;
    
    public class Control_Player : MonoBehaviour
    {
        //前进速度
        public float m_ForwardSpeeed = 7.0f;
        //动画组件
        private Animator m_Anim;
        //动画现在状态
        private AnimatorStateInfo m_CurrentBaseState;
    
        //动画状态参照
        static int m_jumpState = Animator.StringToHash("Base Layer.jump");
        static int m_slideState = Animator.StringToHash("Base Layer.slide");
    
        // Use this for initialization
        void Start()
        {
            m_Anim = GetComponent<Animator>();
        }
    
        // Update is called once per frame
        void Update()
        {
            transform.position += Vector3.left * m_ForwardSpeeed * Time.deltaTime;
            m_CurrentBaseState = m_Anim.GetCurrentAnimatorStateInfo(0);
            if (Input.GetKeyDown(KeyCode.W))
            {
                m_Anim.SetBool("jump", true);
            }
            else if (Input.GetKeyDown(KeyCode.S))
            {
                m_Anim.SetBool("slide", true);
            }
            else if (Input.GetKeyDown(KeyCode.A))
            {
                Change_PlayerZ(true);
            }
            else if (Input.GetKeyDown(KeyCode.D))
            {
                Change_PlayerZ(false);
            }
            if (m_CurrentBaseState.fullPathHash == m_jumpState)
            {
                m_Anim.SetBool("jump", false);
            }
            else if (m_CurrentBaseState.fullPathHash == m_slideState)
            {
                m_Anim.SetBool("slide", false);
            }
        }
    
        public void Change_PlayerZ(bool IsAD)
        {
            if (IsAD)
            {
                if (transform.position.z == -14.7f)
                    return;
                else if (transform.position.z == -9.69f)
                {
                    transform.position = new Vector3(transform.position.x, transform.position.y, -14.7f);
                }
                else
                {
                    transform.position = new Vector3(transform.position.x, transform.position.y, -9.69f);
                }
            }
            else
            {
                if (transform.position.z == -6.2f)
                    return;
                else if (transform.position.z == -9.69f)
                {
                    transform.position = new Vector3(transform.position.x, transform.position.y, -6.2f);
                }
                else
                {
                    transform.position = new Vector3(transform.position.x, transform.position.y, -9.69f);
                }
    
            }
        }
    }
    
    

    键盘WSAD控制上跳,下滑,左右移动等操作。现在就可以去试试啦。
    在这里插入图片描述

    但是,有一点哈,角色怎么越跑越远离开了我们呢,因为,还没有写摄像机跟随脚本,接下来继续吧。

    9、摄像机跟随

    新建脚本Control_Camera.cs

    using UnityEngine;
    
    public class Control_Camera : MonoBehaviour
    {
    	//间隔距离
    	public float m_DistanceAway = 5f;
    	//间隔高度
    	public float m_DistanceHeight = 10f;
    	//平滑值
    	public float smooth = 2f;               
    	//目标点
    	private Vector3 m_TargetPosition;      
    	//参照点
    	Transform m_Follow;        
    
    	void Start()
    	{
    		m_Follow = GameObject.Find("Player").transform;
    	}
    
    	void LateUpdate()
    	{
    		m_TargetPosition = m_Follow.position + Vector3.up * m_DistanceHeight - m_Follow.forward * m_DistanceAway;
    		transform.position = Vector3.Lerp(transform.position, m_TargetPosition, Time.deltaTime * smooth);
    	}
    }
    
    

    OK 摄像机跟着Player跑起来了

    10、碰撞检测

    我们需要不停的躲避障碍物,一旦碰撞到障碍物就dead了
    我们首先修改障碍物的碰撞器属性:
    在这里插入图片描述
    Mesh Collider : Is Trigger=true
    在这里插入图片描述
    我们给Player加上刚体和碰撞体:
    在这里插入图片描述
    注意要勾上Is Trigger

    打开Control_Player.cs脚本:

    //游戏结束
    bool m_IsEnd = false;
    void OnGUI()
    {
            if (m_IsEnd)
            {
                GUIStyle style = new GUIStyle();
                style.alignment = TextAnchor.MiddleCenter;
                style.fontSize = 40;
                style.normal.textColor = Color.red;
                GUI.Label(new Rect(Screen.width / 2 - 100, Screen.height / 2 - 50, 200, 100), "你输了~", style);
            }
    }
    void OnTriggerEnter(Collider other)
        {
            if (other.gameObject.name == "Vehicle_DumpTruck" || other.gameObject.name == "Vehicle_MixerTruck")
            {
                m_IsEnd = true;
                m_ForwardSpeeed = 0;
                m_Anim.SetBool("idle", true);
            }
        }
    

    11、切换道路

    在第七章的时候就已经写好了道路切换,但是一直没有讲到碰撞检测,那么现在我们就结合碰撞检测,检测到抵达点然后切换道路吧

    我们首先找到三个抵达点:MonitorPos
    然后改名叫做MonitorPos0 MonitorPos1 MonitorPos2
    在这里插入图片描述
    修改一下BoxCollider的Is Trigger属性:
    在这里插入图片描述
    修改Control_Player.cs的代码:

     //场景控制对象
    Control_Scenes m_ControlScenes;
    void Start()
    {
            m_Anim = GetComponent<Animator>();
            m_ControlScenes = GameObject.Find("Control_Scenes").GetComponent<Control_Scenes>();
    }
    void OnTriggerEnter(Collider other)
    {
            if (other.gameObject.name == "Vehicle_DumpTruck" || other.gameObject.name == "Vehicle_MixerTruck")
            {
                m_IsEnd = true;
                m_ForwardSpeeed = 0;
                m_Anim.SetBool("idle", true);
            }
            if (other.gameObject.name == "MonitorPos0")
            {
                m_ControlScenes.Change_Road(0);
            }
            else if (other.gameObject.name == "MonitorPos1")
            {
                m_ControlScenes.Change_Road(1);
            }
            else if (other.gameObject.name == "MonitorPos2")
            {
                m_ControlScenes.Change_Road(2);
            }
    }
    
    展开全文
  • Unity3D常见面试题

    2017-08-11 20:20:00
    Unity3D常见面试题
  • 在上篇博客中,简单整理了一下Unity Native 2D功能:《C#程序员整理的Unity 3D笔记(十九):Unity 3D的Native 2D》. 本文开始学习2D商用比较广泛的2D Toolkit插件.
  • unity3d 各大插件评测

    2018-01-30 15:00:43
    原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 引言:想用Unity3D制作优秀的游戏,插件是必不可少的。工欲善其事必先利其器。本文主旨是告诉使用Unity3D引擎的同学们如何根据需求选择适当的工具...
  • 刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散,这也造成初学者对Unity3D Shader编程望而却步。该系列教程的第一篇文章(译者注:即本文,后续还有5篇文章)详细介绍了Unity3D中的表面着色器...
  • 通过自定义和操纵摄像机,你可以使你的游戏表现得真正独特。您在场景中摄像机的数量不受限制。他们可以以任何顺序设定放置在屏幕上的任何地方,或在屏幕的某些部分。 Unity's flexible Camera object  Unity...
  • Unity3d不久之前正式发布了Unity3d 2017.1, 这个版本的发布也宣告了Unity3d正式告别了5.x时代,并且开始已年份直接命名,开启了新的纪元。那么Unity3d 2017相较上一版本到底有哪些改进呢?这介绍这些改进之前先放出...
  • 原文地址: http://www.rocket5studios.com/tutorials/make-a-2d-game-with-unity3d-using-only-free-tools-part-3/ 原版翻译,转载请注明出处:http://blog.csdn.net/ariel7321/article/details/7777157 ...
  • Unity3D改变鼠标样式很简单,直接就封装好方法,以满足在游戏里面定制自己的鼠标样式的需求。下面举一个例子来说明这个问题。...将a.png导入Unity3D,可以在主摄像机挂载如下的脚本CursorChange.cs: using Unit
  • Unity中使用RawImage和RenderTexture在UI界面上投影其他相机拍摄的内容...选中第二个摄像机,将New Render Texture挂载上4.选中RawImage,将New Render Texture挂载上 物体A跟随物体B移动 个人认为所谓的 “ 物体...
  • 一、前言 发现就喜欢研究这些插件,为什么...要不说Unity3D入门容易,提升难呢,因为提升全是靠苦功夫,去研究底层代码。算了,不絮叨了 二、参考文章 Unity3D 装备系统学习Inventory Pro 2.1.2 总结 Unity3D...
  • Unity3D中使用NGUI和U3D的两个摄像机会出现重影,出现两个相同但是画面大小不一致的情况 NGUI的Camera在UI Root中,而Main Camera是unity自带的摄像机 网络上面有的说是改变深度,搞不懂是怎么设置的 注意...
  • Unity3D常用知识点总结

    2020-06-18 10:29:01
    Unity3D 可以通过将游戏中的物体拖入新键文件夹来重复使用(往往包括该物体用到的模型,动画,贴图,脚本等等) 右上可以调整Debug还是Normal模式 物体 unity3d下 常用物体 cube cylinder sphere plane quad ...
1 2 3 4 5 ... 20
收藏数 806
精华内容 322
关键字:

2d摄像机隐藏 unity3d