分类目录归档:游戏

游戏栏目将记录本人在学习或开发中得到的知识,并有部分的教程或文档翻译,共同学习,共同进步。

3D数学基础:向量

本文摘自:《3D数学基础:图形与游戏开发》

向量是2D、3D数学研究的标准工具。术语向量有两种不同但相关的意义,一种是纯抽象的数学意义,另一种是几何意义。为了精通3D数学,你需要理解这两种意义以及它们之间的关系。

数学意义:对程序员而言,向量就是一个数组数学上,区分向量标量

几何意义:向量是有大小方向的线段。

  • 向量的大小就是向量的长度()。向量有非负的长度。

  • 向量的方向描述了空间中向量的指向。注意,方向并不完全和方位等同。

向量中的数表达了向量在每个维度上的有向位移。例如向量 [1,2] 表示向x轴正方向移动1,向y轴正方向移动2。向量可以理解为位移序列。

向量不描述位置,点用来描述位置。

形状和角度不变的向量,不管位置在哪里,它的值都是不变的。(你可以理解为,向量永远是相对于向量的起点来描述的,虽然这样并不太准确)

QQ截图20160421132402.png

3D数学基础:惯性坐标系

本文摘自:《3D数学基础:图形与游戏开发》

有时候,好的术语是引领人们正确理解主题的钥匙。为了简化世界坐标系到物体坐标系的转换,人们引入了一种新的坐标系,称作惯性坐标系。意思是在世界坐标系到物体坐标系的“半途”。

惯性坐标系的原点和物体坐标系的原点重合,但惯性坐标系的轴平行于世界坐标系的轴。

坐标系.png

为什么要引入惯性坐标系呢?因为从物体坐标系转换到惯性坐标系只需旋转,从惯性坐标系转换到世界坐标系只需要平移。分开考虑两件事比把它们糅合在一起容易得多。

将物体坐标系绕原点顺时针旋转45°,则会从物体坐标系转换为惯性坐标系。再从惯性坐标系向左下角平移,即可转换到世界坐标系。

3D数学基础:摄像机坐标系

本文摘自:《3D数学基础:图形与游戏开发》

摄像机坐标系是和观察者密切相关的坐标系。摄像机坐标系和屏幕坐标系相似,差别在于摄像机坐标系处于3D空间中,而屏幕坐标系在2D平面里。摄像机坐标系能被看作一种特殊的“物体”坐标系,该“物体”坐标系是定义在摄像机的屏幕可视区域。摄像机坐标系中,摄像机在原点,x轴向右,z轴向前(朝向屏幕内或摄像机方向),y轴向上(不是世界的上方,而是摄像机本身的上方)。

注意,其他书中的摄像机坐标系关于轴向的约定可能不同。特别是,许多图形学书中习惯使用右手坐标系,z轴向外,即从屏幕指向读者。

关于屏幕坐标系的典型问题是哪些物体应该在屏幕上绘制出来。

QQ截图20160418225013.png

如:

  • 3D空间中的给定点在摄像机前方吗?

  • 3D空间中的给定点是在屏幕上,还是超出了摄像机平截椎体的左、右、上、下边界?(平截椎体就是摄像机能观察到的金字塔区域)

  • 某个物体是否在屏幕上?它的部分在,或全部不在?

  • 两个物体,谁在前面?(该问题称作可见性检测)

请注意,要绘制任何物体,这些问题都是很关键的。

Unity3D《拾荒者》学习笔记(一):单例模式

最开始看到Unity官方的《拾荒者》教程时,还是初学Unity,很多知识点都不知道,如今使用Unity工作也有半年了,重新再看教程,很多地方也都能看懂了。于是重新做一下笔记,温故而知新!

单例模式

单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

实现单例模式的思路是:一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。

单例模式在多线程的应用场合下必须小心使用。如果当唯一实例尚未创建时,有两个线程同时调用创建方法,那么它们同时没有检测到唯一实例的存在,从而同时各自创建了一个实例,这样就有两个实例被构造出来,从而违反了单例模式中实例唯一的原则。 解决这个问题的办法是为指示类是否已经实例化的变量提供一个互斥锁(虽然这样会降低效率)。

以上的定义,来自维基百科。

单例模式在游戏开发中是很常用的一种设计模式,下面是在Unity中的一种典型案例:

假如我们的游戏有1-N个游戏关卡(Scene),我们需要一个管理器用来对分数进行管理,在Unity中创建一个名为GameManager的GameObject,在关卡1中,我们创建了这个GameObject,并对分数进行了存储,这时,我们成功过了第一关,需要切换到第二关,切换场景时,默认会销毁当前场景的全部GameObject,而我们需要保留分数信息。这种情况下,我们就需要单例模式来实现这个功能。

public static GameManager instance = null;
void Awake()
{
    if (instance == null)
    {
        instance = this;
    }
    else if (instance != this)
    {
        Destroy(gameObject);
    }
    DontDestroyOnLoad(gameObject);
}

上面的代码就是在Unity中单例模式的完整实现。

Static:

微软的解释是:使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员。从他人的博客中我看到这样一句解释:表示此方法为所在类或所在自定义类所有,而不是这个类的实例所有。你可以通过这两句话理解Static。

在Awake中,我们首先判断该静态变量是否为null,如果为null,则将当前的类赋值给静态变量。如果不为null且不是当前类,那么说明我们目前有多个GameManager存在,此时需要销毁其他的,只保留之前使用的。通过这种方法,我们就可以通过单例模式来实现分数的管理。当然,不要忘记加上DontDestroyOnLoad,这个是让实例不在场景切换时销毁。

以上就是我对单例模式的学习与理解,如果有不对的地方,欢迎指正!

Unity3D制作2D魔塔游戏一:准备工作

《魔塔》是一种数值类益智游戏,最早在文曲星上玩过,一直特别喜欢。在开始学用Unity3D做游戏后,考虑做一个RPG游戏,于是准备从魔塔这个游戏入手。之所以选魔塔,是因为魔塔比较简单,涉及的系统相对较少,为RPG做准备,一步一步来。

在最开始制作的时候,使用的是Unity4.6,随后升级到了Unity5。我在蛮牛上看到过制作魔塔的视频教程,制作方法跟我的不一样,个人觉得我的方法也是有很多可取之处的。这次开源的版本是第二版,已经足够稳定,没有发现残余BUG,只是有一些功能并没有加入。在制作的过程中,我使用到了许多插件,我造的轮子不一定有他们的好,又何必自己造呢?另外,我的魔塔是竖屏的,可以在最上面放一条广告(虽然很多人吐槽,不过程序员也需要吃饭啊…Orz)。

首先介绍下需要用到的插件,我这里不提供下载,相信大家能够自己解决的。

  1. HOTWEEN

  2. plyGame中的DiaQ

  3. Rotorz Tile System

  4. EasyTouch

  5. EasySave

使用HOTWEEN来处理主角的移动,DiaQ来处理对话系统,Rotorz来制作格子地图,EasyTouch用来处理触摸操作,EasySave用来处理存档系统。

整个魔塔我主要分为了8个脚本来控制:

  1. 主角操作

  2. 动作管理

  3. 声音管理

  4. 对话管理

  5. 游戏数据管理

  6. 游戏逻辑管理

  7. 任务管理

  8. 地图管理

下一篇博客会从主角的操作开始,逐一介绍魔塔的制作方法。

素材地址:http://pan.baidu.com/s/1c04j8Q0  密码:9ix3