unity3d 2D游戏中摄像机投影类型
我们盘点一下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-8或UTF-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游戏效果图映入我们眼帘了哦。按键W、S、A、D控制摄像机移动,按键J、K、I、L、控制主角移动。
unity3d 2D游戏中摄像机投影类型相关推荐
- Unity3D 2D游戏中寻径算法的一些解决思路
需求 unity3d的3d开发环境中,原生自带了Navigation的组件,可以很便捷快速的实现寻路功能.但是在原生的2d中并没有相同的功能. 现在国内很多手机游戏都有自动寻路的功能,或者游戏中存在一 ...
- unity3d 2d游戏制作的模式
经过了4个月不懈的努力,我和图灵教育合作的这本3D游戏开发书预计下个月就要出版了.这里MOMO先打一下广告,图灵的出版社编辑成员都非常给力,尤其是编辑小花为这本书付出了很大的努力,还有杨海玲老师, ...
- 游戏开发 unity3d python_游戏研发系列 Unity3D/2D游戏开发从0到1 第2版.pdf
作 者 :刘国柱著 出版发行 : 北京:电子工业出版社 , 2018.01 ISBN号 :978-7-121-33499-3 页 数 : 507 丛书名 : 游戏研发系列 原书定价 : 99.00 开 ...
- java2d游戏代码_Java 2d游戏中的“JUMP”
我有这个代码,我想在java 2d游戏中启动一个跳转,事情是我的对象没有去任何地方,它只是停留在那里...我想我的对象跳,当我按下键和程序显示我的图像上下移动..我试图通过简单的repaint()方法 ...
- [Unity学习笔记]2D游戏中的触碰/OnMouseDown
[Unity学习笔记]2D游戏中的触碰/OnMouseDown 这种情况多用于2D游戏的触屏 1.给2D游戏对象加上collider 2D,让其能够被检测到
- 2D游戏中的地图创造
尽管3D技术成熟的今天,2D游戏以独特的画面风格和趣味性仍有一席之地,开发者们是用什么方法了构建游戏中复杂丰富的2D游戏地图的呢,我大致将其分为以下三方面: 整体绘制 代表游戏:Ori and the ...
- unity3d 2d游戏(太空大战)开发笔记
最近刚开始看unity3d游戏开发,感觉2d游戏似乎简单些,所以先从2d游戏入手试试看吧. 2d游戏大约要分为背景,角色(需要控制的己方角色car,敌机enemy,奖励物品prop),ui(分数显示, ...
- Unity - 2D游戏中掉帧严重问题解决
目的:解决unity2D中游戏掉帧严重问题 这个问题的出现一开始我并不知道什么原因,于是在unity-profiler中寻找答案. 一开始我发现这个问题 然后我在网站上搜索"Animator ...
- 如何用Unity3D实现游戏中的角色换装?
换装系统是游戏中较为常见的功能,我们给它一个专业词avatar,可以做到装备与人物分离,实现自由换装效果.我们可以将头部.身体.手.脚.武器独立建模.贴图,利用avatar来动态换装,实现各种搭配.实 ...
最新文章
- Leetcode 102. 二叉树的层次遍历 解题思路及C++实现
- MySQL主从复制详细配置步骤及复制延时问题解决
- 网桥如何把信号传给服务器,无线网桥传输的三种传输方式
- nio框架中的多个Selector结构
- Eclipse(PHP、JAVA)的快捷键大全
- 适合人工智能开发的5种最佳编程语言优缺点对比
- 【语音隐写】基于matlab GUI LSB语音信号数字水印【含Matlab源码 619期】
- 网络编程实验综合报告
- 第22篇-安卓手机端抓包软件VNET介绍
- vue华视电子身份证阅读器的使用II
- 解决Win10 无线显示器功能安装时失败
- Auto.js Pro 替代品
- 鸿蒙系统桌面壁纸,好桌道壁纸横空出世 万千壁纸随心换
- CTFHUB——RCE之eval执行和文件包含漏洞
- 4k电视测试软件准确吗,真假4K怎么分辨?告诉你几个买4K电视必看的知识
- oracle 连接 双网卡,Oracle Linux 6.4(BOND)双网卡绑定实战—附加说明
- 数据分析必备|你不得不知道的11款数据分析工具
- IE/Firefox每次刷新时自动检查网页更新,无需手动清空缓存的设置方法
- 海康威视USB相机踩坑指南
- java 两个页面传递数据,怎么将一个页面的数据传给另外个页面
热门文章
- Varnish缓存服务器原理
- Bootstrap网页切版练习(一) - 响应式交错版
- Bootstrap系列之图片(Image)
- 使用notepad++批量在每行首尾添加内容
- Duplicate class xxxx found in modules
- intellij idea设置默认工作目录
- flink taskmanager参数优化
- 中文转码 java_URL 中中文转码
- 你的标签,是什么?(转自:一直特立独行的猫)
- android tbs 内核加载失败_腾讯TBS初始化失败,加载失败问题(踩坑记录 64位手机无法加载x5)...