2d摄像机 unity3d_unity3d正交摄像机如何调整摄像机视口大小 - CSDN
  • 首先确认开发分辨率,以移动平台为例,主流的分辨率比例是16:9,暂定开发分辨率16:9,设置Orthographicz正交摄像机 这里的size 的含义是屏幕的一般,也就是640/2=320,由于sprite默认的Pixels Per Unit设置的是100...

    首先确认开发分辨率,以移动平台为例,主流的分辨率比例是16:9,暂定开发分辨率16:9,设置Orthographicz正交摄像机
    在这里插入图片描述
    这里的size 的含义是屏幕的一般,也就是640/2=320,由于sprite默认的Pixels Per Unit设置的是100,所以 320/100=3.2

    脚本代码:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Script_06_01 : MonoBehaviour {
    
    	public Camera camera;
    
    	void Update () 
    	{
    		float designWidth = 1136f;//开发时分辨率宽
    		float designHeight = 640f;//开发时分辨率高
    		float designOrthographicSize=3.2f;//开发时正交摄像机Size
    		float designScale  =  designWidth/designHeight;
    		float scaleRate  =  (float)Screen.width/(float)Screen.height;
    		//当前分辨率大于开发分辨率,会自动缩放,小于的时候需要手动处理如下
    		if(scaleRate<designScale)
    		{
    			float scale = scaleRate / designScale;
    			camera.orthographicSize = 3.2f / scale;
    		}else{
    			camera.orthographicSize = 3.2f;
    		}
    	}
    
    	void OnGUI()
    	{
    		GUILayout.Label (string.Format ("<size=60><color=red>{0} X {1} </color></size>", Screen.width, Screen.height));
    	}
    }
    
    展开全文
  • 正交摄像机Unity 3D 中普通摄像机相比没有透视效果(近大远小),所以正交相机一般可以用于 2D 游戏开发或者是 3D 游戏的 UI 开发。 在 2D 游戏开发中,有时会遇到根据屏幕的分辨率对游戏的背景进行自适应缩放...

    在 Unity 3D 中可以把摄像机设置为正交。正交摄像机与 Unity 3D 中普通摄像机相比没有透视效果(近大远小),所以正交相机一般可以用于 2D 游戏开发或者是 3D 游戏的 UI 开发。

    在 2D 游戏开发中,有时会遇到根据屏幕的分辨率对游戏的背景进行自适应缩放的需求,这就需要对正交摄像机的尺寸也就是显示范围有一定的了解。

    在正交相机中唯一与显示范围相关的属性只有一个,那就是 Size,单位为 Unity 单位。这个属性的值代表了摄像机在纵向上一半的显示范围。举例来说,如果把 Size 设置为5,那就意味着这个摄像机在纵向可以显示10个 Uinty 单位。摄像机的 Size 是不会随着屏幕的分辨率而变化。而摄像机横向的显示范围则是会发生变化的,Uinty 3D 通过屏幕的宽度除以高度获 Camera.aspect,再通过纵向的显示范围乘以 Camera.aspect 获得摄像机横向的显示范围,这就保证了摄像机的显示范围可以覆盖整个屏幕。

    在通常情况下,使用 Unity 单位来对游戏中的对象(例如:Rigidbody,Collider)的大小进行调节就够了,但是要调节一些图片素材的大小时就需要考虑到像素(Pixel)和 Unity 单位之间的转换。那么问题就来了,像素和 Unity 单位之间的转换关系是怎么的呢?准确的说,他们两者之间的关系是不固定的,这取决与在导入素材时"Pixels To Units"这一属性的值,在默认情况下这个属性的数值为100,也就是说100像素等于1个 Unity 单位。

    了解这些知识之后,再根据屏幕的分辨率来做游戏背景的自适应就会很容易了。首先,使用摄像机的 Size 和 aspect 计算出以 Unity 单位为单位的屏幕长宽。然后,根据"Pixels To Units"的值算出以像素为单位的长宽。同理,对于背景素材,首先通过 gameObject.render.bounds.size 获取以 Unity 单位为单位的素材大小,然后转换为像素大小。知道了背景和素材的像素大小后就可以很容易地得出他们之间的比例,最后通过调节背景的 transform.localScale 就可以达到背景自适应的目的了。

    展开全文
  •  摄像机:无论是3D游戏还是unity3d 2D游戏摄像机都是非常重要的属性,移动摄像机即可更改屏幕中显示的内容,游戏地图的坐标永远都不会发生改变。  地图:unity3d 2D游戏中的地图一般是由tile拼接而成,它可由...

      我们盘点一下unity3d 2D游戏中必备的几个元素。

      摄像机:无论是3D游戏还是unity3d 2D游戏摄像机都是非常重要的属性,移动摄像机即可更改屏幕中显示的内容,游戏地图的坐标永远都不会发生改变。

      地图:unity3d 2D游戏中的地图一般是由tile拼接而成,它可由地图编辑器生成然后将每一块tile绘制在整个贴图中,最后将贴图贴在平面网格面之上即可。还有一种作法是将两个或两个以上屏幕大小平面以队列的形式排在屏幕后面,当摄像机移动超出第一块面显示范围时,将它的坐标移动在第二块面后面,此时地图就形成了一个排序的队列。为了让地图的效果更加完美,一般地图可以由好几层来组成,比如背景层、与主角的遮挡曾、物理层等等。

      地图拼接:地图的排序队列中两张图应当是可以无缝拼接,这个应当是由美术来提供资源,这里我就不那么细致了将远离说明白即可。

      主角:它的范围就比较广的,敌人、物品等等出现在地图之上的都可以使用它。如果控制主角移动,摄像机移动的同时主角也当跟随移动,并且保持屏幕中的移动比例,除非摄像机无法移动,这时将直接移动主角在屏幕中的坐标。

      然而上面的一切面是由Plane面来完成。

      再Unity层次视图中选择摄像机对象,右侧监测面板视图中我们看看摄像机组件的一些属性。需要注意的就是Projection 投影类型。

      首先我们应当修改摄像机的属性,默认摄像机投影的类型是Perspective,它保持摄像机以扩散的的形式照射着不利于2D平面的展示。这里我们应当选择Orthographic,这样摄像机将直直的照射在显示的区域。

      从侧面观察摄像机,通过这两张图我相信大家应当能看懂为什么unity3d 2D游戏要用Orthographic了吧,摄像机的投影类型是可以在代码中动态的修改的。

      [代码]java代码:

      1//得到游戏中摄像机对象

      2Camera camera = Camera.mainCamera;

      3//设置摄像机投影类型OrthoGraphic

      4camera.isOrthoGraphic = true;

      5//设置摄像机投影类型Perspective

      6camera.isOrthoGraphic = false;

      在代码中取得摄像机投影的区域大小,它也可以动态的修改,这样就可是实现摄像机拉近与拉远的效果。根据投影区域的大小配合着整个地图的宽高来写判断条件,避免移动摄像机时超过地图的范围。

      [代码]java代码:

      1Camera camera = Camera.mainCamera;

      2Debug.Log(camera.orthographicSize);

      接着我们使用代码来得到地图面的宽高,这段代码写的就比较精细,因为网格面是可以缩放的,首先得到网格面的宽与高,然后分别乘以缩放系数就可以得到真实面的宽与高,然而Unity中的坐标是以为单位。下面代码中用到了中文,如果要想在编辑器中显示中文C#语言需要修改编码格式为UTF-16。 JavaScript修改编码格式UTF-8UTF-16即可。

      [代码]java代码:

      01using UnityEngine;

      02using System.Collections;

      03

      04public class Test : MonoBehaviour

      05{

      06

      07 void Start ()

      08 {

      09

      10 GameObject plane = GameObject.Find("Plane0");

      11 //得到面默认宽度

      12 float size_x = plane.GetComponent().mesh.bounds.size.x;

      13 //得到面宽度的缩放比例

      14 float scal_x = plane.transform.localScale.x;

      15 //得到面默认高度

      16 float size_z = plane.GetComponent().mesh.bounds.size.z;

      17 //得到面高度缩放比例

      18 float scal_z = plane.transform.localScale.z;

      19

      20 //原始宽度乘以缩放比例计算出真实宽度

      21 float mapWidth = size_x * scal_x;

      22 float mapHeight = size_z * scal_z;

      23

      24 Debug.Log("得到面的位置:"+plane.transform.position);

      25 Debug.Log("得到面的宽度:"+ mapWidth);

      26 Debug.Log("得到面的高度:"+ mapHeight);

      27 }

      28

      29}

      有了摄像机照射的区域以及背景地图的宽高尺寸那么就可以在代码中编写逻辑判断条件啦。下面我们来使用简单的代码控制摄像机移动以及主角移动。

      [代码]java代码:

      01using UnityEngine;

      02using System.Collections;

      03

      04public class Controller : MonoBehaviour

      05{

      06

      07 //动画数组

      08 private Object[] anim;

      09 //主角对象

      10 private GameObject hero;

      11 //限制一秒多少帧

      12 private float fps = 10;

      13 //帧序列

      14 private int nowFram;

      15 //记录当前时间

      16 private float time;

      17

      18 void Start ()

      19 {

      20 //得到资源名称为down文件夹中的所有对象资源

      21 anim = Resources.LoadAll("down");

      22 //得到主角的对象

      23 hero = GameObject.Find("hero");

      24 }

      25

      26 void FixedUpdate ()

      27 {

      28 //上、下、左、右平移摄像机

      29 if (Input.GetKey (KeyCode.A))

      30 {

      31 transform.Translate(-0.01f,0,0);

      32

      33 }

      34

      35 if(Input.GetKey (KeyCode.D))

      36 {

      37 transform.Translate(0.01f,0,0);

      38 }

      39

      40 if (Input.GetKey (KeyCode.W))

      41 {

      42 transform.Translate(0,0.01f,0);

      43 }

      44

      45 if(Input.GetKey (KeyCode.S))

      46 {

      47 transform.Translate(0,-0.01f,0);

      48 }

      49

      50 //上、下、左、右平移主角

      51 if (Input.GetKey (KeyCode.J))

      52 {

      53

      54 hero.transform.Translate(0.001f,0,0);

      55 }

      56

      57 if(Input.GetKey (KeyCode.L))

      58 {

      59

      60 hero.transform.Translate(-0.001f,0,0);

      61 }

      62

      63 if (Input.GetKey (KeyCode.I))

      64 {

      65 hero.transform.Translate(0,0,-0.001f);

      66 }

      67

      68 if(Input.GetKey (KeyCode.K))

      69 {

      70 hero.transform.Translate(0,0,0.001f);

      71 }

      72

      73 DrawAnimation(anim);

      74 }

      75

      76 void DrawAnimation(Object[] tex)

      77 {

      78

      79 //计算限制帧的时间

      80 time += Time.deltaTime;

      81 //超过限制帧切换贴图

      82 if(time >= 1.0 / fps){

      83 //帧序列切换

      84 nowFram++;

      85 //限制帧清空

      86 time = 0;

      87 //超过帧动画总数从第0帧开始

      88 if(nowFram >= tex.Length)

      89 {

      90 nowFram = 0;

      91 }

      92 }

      93 //将对应的贴图赋予主角对象,强制将资源文件转换成贴图

      94 hero.renderer.material.mainTexture = (Texture)tex[nowFram];

      95 }

      96}

      代码中我们使用 Resources.LoadAll(“down”);来加载主角动画资源,这里将主角一组4帧的行走动画放在项目资源视图中 Resources文件夹中的down文件夹内。值得注意的是,使用Resources来加载资源就必须将资源放在Resources文件夹中,否则提示无法找到喔。在书中我以将人物四宫格行走动画加入在其中,因为这里只是一个是示例,所以我只加载了向下行走的4帧动画。

      还有一个比较重要的地方就是要修改材质的shder类型,因为默认的材质是Diffuse,它是不支持透明的。如果材质不支持透明。主角的背景将会是白色。如下图所示,这里选择Transparent/Diffuse。保存为Transparent家族中的材质都是支持透明的。

      最后unity3d 2D游戏效果图映入我们眼帘了哦。按键WSAD控制摄像机移动,按键JKIL、控制主角移动。

    展开全文
  • 好一段时间没写博客了,新年来第一天正式上班,新的一年里要求自己有新的变化,坚持每天不断的学习和提高,改变过去的晚睡晚期的不好习惯,昨天周末,利用一天休息时间去打打篮球,发现过去一百天里每天熬夜到深夜,...

    好一段时间没写博客了,新年来第一天正式上班,新的一年里要求自己有新的变化,坚持每天不断的学习和提高,改变过去的晚睡晚期的不好习惯,昨天周末,利用一天休息时间去打打篮球,发现过去三个月里每天熬夜到深夜,发现体质明显下降,今天起来发现浑身酸痛,得调整一下作息和生活,坚持锻炼,坚持早睡早起,早晨起来每天都坚持看一小时的书,如果每天都坚持在某个时间段固定去学一样东西,时间一长,一周或者一个月甚至一年下来你会惊讶的发现原来你自己学了那么多,贵在坚持,每个人都知道,但真真能做到的人比较少,如果能做到这点,就算将来即便成不了大牛那也是一直走在成为大牛做过的路上,也会受益匪浅,我写上这个也是自我勉励,另一方面也是大家共勉,生活上,学习上的点点滴滴总是那么神奇,过去未知答案时所走出的道路在未来的这天,发觉将其串联起来,现在所走的路不知道是何路,但必是将来通向未来之路,因不满足于现状,觉得可以做的更好,所以,通过不断的努力,去改变现状,一直不想当一个井底之蛙,IT技术上更是如此,如果仅仅是安于现状,那永远是跟不上时代的步伐,只会不进则退。不知何时开始,我有了自己的追求,有一股劲儿,一直想做的更好,学的更多,相信有一天能成为一个参天大树。假如抛开一切的负担,你最在乎的是什么?或者说你最想做的事是什么?燃气你的激情,为理想而奋斗。实现理想的过程是艰辛的,但如果一旦实现,发现时甜蜜的,理想or梦想,但他们不是梦,并不是遥不可及,用燃烧不进的激情,追随她~ 不要让自己迷失方向,安于现状,不要冷漠了任何事物,她总会有她神奇的一面,不断的挖掘,相信你都会有人家体会不到的收获,好奇心,永远保持一颗好奇心!以上是算给自己新年鼓鼓气,接下来还是要落地,写写今天的收获!

    问题说明:

    年前做的web和pc的一个项目,背景当时是用的一个plane然后上面放的是一个带有背景图片的一个材质球,这个通过改变plane的z轴属性是能控制它的显示在3D模型之后,但貌似自适应有点难以控制,当时是用过在界面上手动改变的Scale属性来让背景铺满整个窗口,但无法自适应所有分辨率大小的窗口,然后我就想通过动态代码在plane上添加一个Textrue2D的一个图片,但发现无论怎样拖动模型的z轴属性还是不能让模型显示在背景之前。后来经过一段摸索,搞定,这将摸索过程写下来。

    在这里我要提一下MeshRenderer,即网格渲染器,如果我们不勾选这个网格渲染器,在Game场景中是看不到plane的样子的,即网格渲染器将材质渲染出来,材质中包含Texture属性,我们可以选择自己的贴图,也可以选择颜色,网格渲染器就可以将材质中的这些给渲染出来,让我们看到,原来我就是通过这个方法来实现的背景图,下面是另一种添加GUITexture的方法来实现,利用到了多个摄像机共同合作达到效果!

    解决步骤:

    1.添加一个摄像机,命名为BackgroundCamera,然后在Layer添加一个background层。并且将plane拖放到改相机节点下。然后将BackgroundCamera和Plane都置于background层,修改ClearFlags未Depthonly深度渲染,并且设置CullingMask为只看到background层,还有设置Depth为-1,说明背景层是最深,其他model所在的相机的Depth是0,NGUI的是1,这里层次关系就是NGUI在最前面,model层其次,然后是背景层,这样确保3D模型在背景的前面!


    2.同样的操作,将MainCamera设置一下,注意的就是,将MainCamera的CullingMask不能包含background层,也就是让它看不到背景层,不然还是会出现背景遮挡住模型的情况。


    3.在plane上添加一个脚本,用于动态在plane上加载贴图
    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    
    public class AddBackground : MonoBehaviour
    {
        public Texture2D mtexture;
    
        void Awake()
        {
    //        Texture2D mtxture = new Texture2D(Screen.width, Screen.height);
    //        renderer.material.mainTexture = mtxture;
    //        mtxture.Apply();
            
            gameObject.AddComponent<GUITexture>();
        }
    
        // Use this for initialization
        void Start()
        {
            guiTexture.texture = mtexture;
            transform.localScale = new Vector3(0, 0, 0);
            transform.localPosition = new Vector3(0, 0, 25);
            guiTexture.pixelInset = new Rect(65, 0, Screen.width, Screen.height);
        }
    }
    上面Start方法中设置position的z轴属性是原来尝试的,想通过z轴来进行深度的修改后来发现行不通,还是层的关系影响渲染的深度。

    4.效果图


    ==================== 迂者 丁小未 CSDN博客专栏=================

    MyBlog:http://blog.csdn.net/dingxiaowei2013             MyQQ:1213250243

    Unity QQ群:375151422         cocos2dx QQ群:280818155

    ====================== 相互学习,共同进步 ===================


    展开全文
  • Unity3D

    Unity3D - UI摄像机、场景摄像机协同工作原理 :

    UI摄像机和场景摄像机分别属于两个渲染层(Layer),所以它们之间的渲染互不干扰 , 将摄像机深度(depth)控制好 , 使得 UI摄像机高于场景摄像机 , UI永远位于场景上层 .

    展开全文
  •   首先说一下什么是摄像机,这和我们现实生活里的摄像机概念一样,只不过Unity里的摄像机是用来拍摄游戏场景的,我们透过屏幕能够看到的游戏场景都是通过摄像机拍摄出来的,从游戏开始摄像机就在工作,把每一帧...
  • unity3d开发2d游戏中有了摄像机照射的区域以及背景地图的宽高尺寸那么就可以在代码中编写逻辑判断条件啦。下面我们来使用简单的代码控制摄像机移动以及主角移动。 01using UnityEngine; 02using System....
  • unity3d 如果你没有碰到摄像机抖动的
  • 通过代码控制SceneView的摄像机进入2D模式。 炒鸡简单,SceneView里提供了一个字段叫做in2DMode,开启它会使SceneView的摄像机变成正交相机并且锁定在Z轴上。以下代码呈现了这种切换的主要部分: boo...
  • 获得人物在场景中的世界坐标位置, 一般情况下 会沿着摄像机的向上的方向上做一些偏移 就确定了头像/血条在3d世界坐标系中的位置 用场景的摄像机把世界坐标位置转换到屏幕坐标系用2d摄像机把屏幕坐标系转移到2d显示...
  • using UnityEngine; using System.Collections; public class CameraMove : MonoBehaviour { public Camera mMapCamera; private float mMapWidth;... private float mMapHeight;... public Transfor
  • 在上一篇文章中,我们以经典的打砖块游戏为例,讲解了一个Unity3D游戏的完整实现过程。今天呢,我们来做一个在游戏中十分重要的组成元素:血条。血条是什么呢?血条是生命值的一种体现,就像《仙剑奇侠传三》电视剧...
  • Unity 2D 终结手册 (1) - 2D 项目_Unity3d 开发技术:这篇系列文章主要介绍 Unity 2D 开发技术。包括 2D/3D 项目的区别、如何设置 2D/3D 模式、2D 开发中使用到的组件等。
  • 再游戏运行的时候,往往需要 在 正交Orthographic (无消失点投影) 与正交Orthographic (无消失点投影) 两个视角中来回转化。 以达到 不同的 2D3D 视角。So! 今天的 实例代码就是 描述了 这一个功能
  • 为啥要写这个呢,主要是因为在之前制作游戏的时候,需要在3D游戏场景之上加一层2D的用户界面。之前一直属于小白的阶段,身边玩unity的人也少,也没人教,网上去问了一下也没有特合适的方法(大概是关键词没有搜对)...
  • // 摄像机功能 // 鼠标左键按住,上下左右滑动,控制摄像机观察的位置 // 鼠标右键没做设定,因为WebPlayer里点鼠标右键是浏览器事件 // 鼠标滚轮滚动,调整摄像机与被看点的距离 //---------------------------...
  • 在做一个策略类的游戏时,需要实现一个基地的功能,功能并不是太复杂,默认只能显示场景(45度视角...下面我们先把地表的网格显示出来,这儿用的是 Unity3D 自带的透明顶点 Shader,暂时没有想到好的解决办法,如下图:
  • 在最开始使用Unity时(版本5.2.1),因为要跟着各种教程去动手,所以新建工程特别多...现在使用Unity也有一小段时间了,在这里整理一下2D模式和3D模式中的区别,希望能对碰到同样情况的同学有所帮助。首先,Unity中不存
1 2 3 4 5 ... 20
收藏数 4,339
精华内容 1,735
关键字:

2d摄像机 unity3d