经过了4个月不懈的努力,我和图灵教育合作的这本3D游戏开发书预计下个月就要出版了。这里MOMO先打一下广告,图灵的出版社编辑成员都非常给力,尤其是编辑小花为这本书付出了很大的努力,还有杨海玲老师,不然我也无法完成这本书的编写。等这本书出版了大家记得买喔,哇咔咔~ 下面,这篇文章是MOMO 3D游戏开发书籍中的一小段章节的修改版本,本篇文章我们将探讨一下Unity3D中如何来制作2D游戏。目前市面上已经有非常成熟的2D游戏引擎,比如cocos2d 或cocos2d-x等,并且都是免费的开发者可以直接用来制作2D游戏。然而使用3D引擎来制作2D游戏会让游戏画面更加附有立体感,因为2D游戏中Z轴永远是0,而3D游戏中Z轴是可变化的。

        接着说说在Unity3D中制作2D游戏的原理。在Unity3D中绘制贴图的方式大致可分为两种,第一种是在GUI中绘制贴图,第二种是在网格面上绘制贴图。先说说第一种,GUI主要用来制作简单的游戏2D界面,比如游戏主界面中绘制的“游戏名称”、“开始游戏”、“保存游戏”、“退出游戏”一些按钮或界面中一切其它的高级控件,文本框,输入框等等、GUI只能制作简单的图形化界面,因为它的渲染效率非常低,它与3D世界中网格模型的渲染机制完全不一样。第二种的属于将图片绘制在3D中网格平面中,它的渲染效率远远高于GUI中,在制作2D游戏时都是将所有贴图绘制在平面模型对象之上,最后用摄像机以90度垂直的角度照射这这些平面。

  下面我们开始学习在Unity3D中制作2D游戏的原理。2D游戏又可以分为两种,区别是物体碰撞时带物理引擎或不带物理引擎。带物理引擎就好比《奋斗的小鸟》一样,大家应该都玩过,小鸟发射后下落击落其它物体将发生物理的碰撞。(我没有细看这款游戏,但是我知道2D 与3D引擎都都可制作),不带物理引擎的就好比《捕鱼达人》这种游戏,游戏中碰撞都是由代码自己来完成的,经典的2D碰撞监测包括:矩形与矩形的碰撞、点与矩形的碰撞、圆与圆的碰撞等。今天这篇文章我们主要讨论第二种不带物理引擎的2D游戏。

如下图所示,我们盘点一下2D游戏中必备的几个元素。

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

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

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

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

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

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

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

Perspective类型

Orthographic

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

1
2
3
4
5
6

//得到游戏中摄像机对象
Camera camera = Camera.mainCamera;
//设置摄像机投影类型OrthoGraphic
camera.isOrthoGraphic = true;
//设置摄像机投影类型Perspective
camera.isOrthoGraphic = false;

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

1
2

Camera camera = Camera.mainCamera;
Debug.Log(camera.orthographicSize);

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour
{
void Start ()
{
    GameObject plane = GameObject.Find("Plane0");
//得到面默认宽度
float size_x = plane.GetComponent<MeshFilter>().mesh.bounds.size.x;
//得到面宽度的缩放比例
float scal_x = plane.transform.localScale.x;
//得到面默认高度
float size_z = plane.GetComponent<MeshFilter>().mesh.bounds.size.z;
//得到面高度缩放比例
float scal_z = plane.transform.localScale.z;
//原始宽度乘以缩放比例计算出真实宽度
float mapWidth = size_x * scal_x;
float mapHeight = size_z * scal_z;
Debug.Log("得到面的位置:"+plane.transform.position);
Debug.Log("得到面的宽度:"+ mapWidth);
Debug.Log("得到面的高度:"+ mapHeight);
}
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96

using UnityEngine;
using System.Collections;
public class Controller : MonoBehaviour
{
//动画数组
private Object[] anim;
//主角对象
private GameObject hero;
//限制一秒多少帧
private float fps = 10;
//帧序列
private int nowFram;
//记录当前时间
private float time;
void Start ()
{
//得到资源名称为down文件夹中的所有对象资源
anim = Resources.LoadAll("down");
//得到主角的对象
hero = GameObject.Find("hero");
}
void FixedUpdate ()
{
   //上、下、左、右平移摄像机
if (Input.GetKey (KeyCode.A))
{
transform.Translate(-0.01f,0,0);  
}
if(Input.GetKey (KeyCode.D))
{
transform.Translate(0.01f,0,0);  
}
if (Input.GetKey (KeyCode.W))
{
transform.Translate(0,0.01f,0);  
}
if(Input.GetKey (KeyCode.S))
{
transform.Translate(0,-0.01f,0);  
}
//上、下、左、右平移主角
    if (Input.GetKey (KeyCode.J))
{
    hero.transform.Translate(0.001f,0,0);  
}
if(Input.GetKey (KeyCode.L))
{
    hero.transform.Translate(-0.001f,0,0);  
}
if (Input.GetKey (KeyCode.I))
{
hero.transform.Translate(0,0,-0.001f);  
}  
if(Input.GetKey (KeyCode.K))
{
     hero.transform.Translate(0,0,0.001f);    
}
DrawAnimation(anim);
}
void  DrawAnimation(Object[] tex)
{
//计算限制帧的时间
time += Time.deltaTime;
//超过限制帧切换贴图
if(time >= 1.0 / fps){
//帧序列切换
       nowFram++;
//限制帧清空
       time = 0;
//超过帧动画总数从第0帧开始
       if(nowFram >= tex.Length)
       {
       nowFram = 0;
       }
        }
//将对应的贴图赋予主角对象,强制将资源文件转换成贴图
        hero.renderer.material.mainTexture = (Texture)tex[nowFram];
}
}

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

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

最后2D游戏效果图映入我们眼帘了哦。按键W、S、A、D控制摄像机移动,按键J、K、I、L、控制主角移动。

         总结一下这篇文章,本文我们在多个Plane对象身上贴上材质资源,再让摄像机直直的照射着它。实现2D游戏的基本原理,本文没有涉及到Unity3D的物理引擎,不要紧在下章中我将向大家介绍一下Unity3D中的刚体组件与角色控制器组件如何来实现模型的物理效果,包括物理引擎与3D或2D游戏的结合。另外大家一定要期待我的新书喔,哇咔咔~嘿嘿。

转载于:https://www.cnblogs.com/cfas/p/5144649.html

unity3d 2d游戏制作的模式相关推荐

  1. Unity-业余2D游戏制作笔记02-Dialogue System for Unity使用

    纯新手,仅用于记录个人学习中遇到的问题. 目录 当前目标: C#的变量数值和LUA代码连接 (一)Dialogue System任务流程里简单的LUA代码修改变量 (二)Lua通过调用C#函数,来修改 ...

  2. 游戏开发 unity3d python_游戏研发系列 Unity3D/2D游戏开发从0到1 第2版.pdf

    作 者 :刘国柱著 出版发行 : 北京:电子工业出版社 , 2018.01 ISBN号 :978-7-121-33499-3 页 数 : 507 丛书名 : 游戏研发系列 原书定价 : 99.00 开 ...

  3. unity3d 2D游戏中摄像机投影类型

    我们盘点一下unity3d 2D游戏中必备的几个元素. 摄像机:无论是3D游戏还是unity3d 2D游戏摄像机都是非常重要的属性,移动摄像机即可更改屏幕中显示的内容,游戏地图的坐标永远都不会发生改变 ...

  4. unity3d 2d游戏(太空大战)开发笔记

    最近刚开始看unity3d游戏开发,感觉2d游戏似乎简单些,所以先从2d游戏入手试试看吧. 2d游戏大约要分为背景,角色(需要控制的己方角色car,敌机enemy,奖励物品prop),ui(分数显示, ...

  5. Unity 2D游戏制作

    调试背景 2D游戏的制作最重要的是层的设置 先设置两个层①Layers②Edit Layers③Sorting Layers添加两个层BackGround和Front 调试大雁 创建2D object ...

  6. 【2D游戏制作笔记】给游戏战斗增加一点打击感

    目录 1.敌人颜色改变 2.相机震动 3.击退效果 4.受击特效 5.音效 以下内容是对自己制作过程中遇到问题的记录,不一定科学准确. 1.敌人颜色改变 学习链接 当敌人受到攻击时,改变敌人图像的颜色 ...

  7. Unity3D 2D游戏中寻径算法的一些解决思路

    需求 unity3d的3d开发环境中,原生自带了Navigation的组件,可以很便捷快速的实现寻路功能.但是在原生的2d中并没有相同的功能. 现在国内很多手机游戏都有自动寻路的功能,或者游戏中存在一 ...

  8. 【2D游戏制作笔记】如何做出较好的角色操作手感

    目录 1.地面与角色的碰撞检测 2.操作过程中人物消失不见 3.墙上控制 以下内容是对自己制作过程中遇到问题的记录,不一定科学准确. 1.地面与角色的碰撞检测 当人物下落速度较大时,有时会出现人物穿过 ...

  9. Unity-业余2D游戏制作笔记01-Dialogue System for Unity使用

    纯新手,仅用于记录个人学习中遇到的问题. 目前进度: 已完成几个人物角色的移动,基本场景,简单的背包和箱子,简单的保存和加载. 刚开始学习使用Dialogue System for Unity插件和L ...

最新文章

  1. poj - 3786 Repeater
  2. VS如何新建一个基于对话框的MFC工程并添加按钮
  3. C++ code:数值计算之矩形法求解积分问题
  4. 关于RTP时间戳及多媒体通信同步的问题/H264关于RTP协议的实现
  5. java错位_java – 如何保护自己免受参数错位的影响
  6. 百度地图API如何申请?(自认为比较详细,如解决了你的问题请收藏、点赞、关注!)
  7. 图算法之——dijkstra算法
  8. kettle使用记录
  9. LinkedList 链表总结
  10. android更改应用图标大小,Android选项菜单:更改图标大小
  11. 科技爱好者周刊:第 83 期
  12. Bought a new glass in BeiJing Pan Jia Yuan
  13. 推销自己的最佳媒介之一就是博客
  14. [产品规划]行业公司如何做产品
  15. 基于安卓/android/微信小程序的学生考勤签到APP-#计算机毕业设计
  16. 2019 下半年 Flutter 实现的性能优化 | 英雄榜
  17. DataBinding(一)
  18. 贺利坚的课程教学链接
  19. 目前最稳定的Win10 21H2版本19044.2006
  20. 你都是会点啥技术(五)--- 数据库

热门文章

  1. angry_birds_again_and_again SD5THACM
  2. 软件开发项目管理检查清单:天气晴雨表
  3. 美国好莱坞影星肖像图
  4. 中职计算机论文参考文献,中职计算机论文范文 中职计算机论文参考文献范文2500字...
  5. 设计程序,从键盘输入十进制数,结果存放在BUFFER中(无符号数,16位),再把结果以十六进制方式在屏幕输出。
  6. 转正小结计算机,计算机实习生转正自我鉴定
  7. 2B的研发工程师需要有什么样的业务sense?
  8. Autojs微信运动自动点赞免root脚本源码
  9. 微信多点登录与QQ消息漫游架构随想
  10. 使用Fabric.js库制作一个绘画网站,实现绘画板涂鸦功能