标签归档:Unity2D

Unity中制作无限循环滚动的背景

在游戏中,经常会用到需要无限循环滚动的背景,例如打飞机游戏、跑酷游戏等。

本篇文章向你介绍两种简单的制作方法。

方法一:使用Material方式来制作。

优点:简单省内存。

图片导入到Unity中之后,Texture Type使用Texture。如果图片是透明的话,那么勾选Alpha Is Transparency,Wrap Mode更改为Repeat。

图片类型设置为Texture

之后创建一个Material,如果图片是透明的,则Shader选为Unlit/Transparent,如果不是的话,使用Mobile/Diffuse即可。

接下来,创建一个Quad,将材质球拖上去,然后再挂个脚本,脚本里的Update里加一句话即可:

MR.material.mainTextureOffset += new Vector2(Time.deltaTime * moveSpeed * 0.02f, 0);

方法二:两个Sprite进行无限循环。

优点:如果你在做2D游戏,而且需要使其他Sprite与背景保持同等速度会很方便。例如一个无限循环的陆地,上面会随机生成树、石头等,而树和石头需要与陆地保持同样的速度移动。

创建两个Sprite,一个默认position为0,另一个则是0加上图片的宽度,一般Pixel Per Unit为100,图片宽度为2048像素,则第二章图片的x为20.48。

两个Sprite都挂上一个Move脚本,脚本里的Update加几行代码即可:

transform.Translate(Vector3.left * Time.deltaTime * speed);
if (transform.position.x < -20.48f)
{
    transform.position += new Vector3(20.48f * 2, 0, 0);
}

两个方式各有优势,方式一只需要创建一张图片,而方式二需要两张,但是方式二在很常用,至于选择哪个,就看项目的具体需求了。

希望本分享对你有所帮助!

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

Unity中的Raycast射线检测函数解析

在使用Unity引擎重新制作魔塔的时候,为了提高游戏性能,启用了新的方法。

其中用到了Raycast射线检测,而在最开始,检测出来总是有问题,有墙的地方检测正常,但是没墙的地方也会检测到碰撞,经过仔细查看,发现是之前太粗心,没有注意到Raycast的参数,于是记下此笔记。

Physics2D.Raycast

参数

origin 射线发射的原点
direction 射线发射的方向
distance 射线发射的距离
layerMask Layer层过滤
minDepth 射线检测Z坐标的最小值
maxDepth 射线检测Z坐标的最大值

之前由于粗心,一直以为参数和DrawLine的差不多,莫名其妙的折腾很长时间。

DrawLine的参数,第一个是起点,第二个是终点。而Raycast,第一个是起点,第二个是方向,第三个是长度。值得注意的是,方向是第二个参数的点的位置相对于起点的方向。当搞清楚这三个参数后,就简单的多了。

public bool checkTile(int x,int y)
{
    Vector2 position = new Vector2(x, y);
    RaycastHit2D hit = Physics2D.Raycast(position, Vector2.zero);
    Debug.DrawLine(new Vector3(x - 0.2f, y, 0), new Vector3(x + 0.2f, y, 0),Color.red);
    if (hit.collider != null)
    {
        print(hit.collider.gameObject.name);
        print("no");
        return false;
    }
    else
    {
        print("ok");
        return true;
    }
}

2DToolkit官方文档中文版打地鼠教程(十二):添加文本

我们的游戏已经可以玩了。地鼠从洞里钻出来,打中他们后,会消失在一朵烟里。但你想知道你游戏玩得怎么样,就需要在屏幕上显示分数。

我们使用2D Toolkit中的一个演示字体,你也可以使用自己喜欢的字体包

在我们添加分数文本之前,我们需要确保他能正确显示在屏幕上。我们添加一个anchor在我们的摄像机中,让分数文本能够更简单的定位。

  1. 在Hierarchy窗口,选中摄像机对象,并点击Create > tk2d > Camera Anchor。
  2. 在Hierarchy窗口中,一个Anchor对象被添加为摄像机的子对象。

  3. 我将把分数文本显示在游戏窗口的右上角,所以让场景的anchor到右上角。因此在Inspector窗口中的Tk 2d Camera Anchor(Script)的下面,点击Anchor下拉列表并选中UpperRight。注意设置完之后anchior的x和y会被设置为摄像机的宽和高,那就是屏幕的右上角。

  4. 我们的分数文本的位置将会相对于anchor,在Hierarchy窗口中选中Anchor,然后点击Create > tk2d > TextMesh。

  5. 在Hierarchy窗口中选中TextMesh,在Inspector窗口中你可以改变它的各种设置,这里需要修改的仍然是Anchor锚点。由于文本默认从左到右显示,如果我们选择TopRight,那么文本在屏幕上的位置将会改变。在分数变得更大时,为了容纳更多文本,它会变得更大。所以为了使分数显示在同一个地方,我们选择Upper Left作为Anchor设置。

     

    从字体下拉列表中选择GradientFont,并设置它的Max Chars值,这里设置为11,这包括了Score这个词和后面的分数。注意,MaxChars值设置过大会浪费内存,设置过小会导致文本被裁剪。在文本框中输入一些文本,我们预览文本的显示效果,随后我们会在脚本中控制文本内容。

    在TextureGradient中选择一个你喜欢的效果,我这里选择desert-horizon。

    默认字体很小,所以我们需要对文本进行缩放以显示在屏幕上适合的大小,我们这里选择 600 * 500。

  6. 现在,我们有了显示分数的文本,我们需要能够改变分数文本。在Project窗口中,创建一个C#脚本命名为ScoreScript,并将这里的代码粘贴进去。ScoreScript让我们能够很简单的获取及修改current score分数值。
  7. 在Project窗口中,选中ScoreScript并将它拖动到Hierarchy窗口中的ScoreText对象上。脚本将会被到添加到score文本对象中。
  8. 当打中一个地鼠后,增加10分,但没有打中时,扣去5分。变量和函数我们已经写在了脚本中,ScoreScript类使用它时并不需要创建实例,我们可以简单的使用:

    ScoreScript.Score += 10;

    来更新分数。 因此当打中地鼠后( if(mole.sprite.gameObject.activeSelf && mole.ColliderTransform == hit.transform) ),我们通过在MainGameScript增加下面的代码来控制分数。我们将使用的方法的核心代码是:

    ScoreScript.Score += mole.Whacked ? 0 : 10;

    如果洞中的地鼠已被打中过,则0分。

 

2DToolkit官方文档中文版打地鼠教程(十三):为游戏添加声音

现在我们为游戏添加一些音效。当地鼠被打中、从洞里钻出以及钻回洞中时会播放。我们在Projects > Mole > Sounds中已经有了这些音效。关于可用和不可用的音效格式,你可以查看这里

将声音片段添加到游戏中很容易!

  1. 取消每一个音效的3D Sound选项。
  2. 为beat_mole音效在MainGameScript添加一个AudioClip变量:

    public AudioClip moleHit;

     

     

  3. 然后在打中地鼠的代码中,也就是分数增加的代码,增加如下代码:

    AudioSource.PlayClipAtPoint(moleHit, new Vector3());

     

    此函数接受一个AudioClip和Vector3作为参数。Vector3对3D音效有效果,但我们这里使用的2D声音,所以我们只新建一个空的Vector3。

  4. 现在在Hierarchy窗口中选中MainGameScript,将会出现一个MoleHit音效字段,我们可以将音效拖到上面。
    img/gamescript_audio_clip.png
  5. 添加mole_down和mole_up音效,在MoleScript脚本下声明变量。

     

    public AudioClip moleUp;

    public AudioClip moleDown;

  6. 在MoveUp函数的最开始,循环之前,添加以下代码:

    AudioSource.PlayClipAtPoint(moleUp, new Vector3());

    在MoveDown函数最结尾,循环之后,添加以下代码:

    AudioSource.PlayClipAtPoint(moleDown, new Vector3());

  7. 同样,如果我们选中MoleUnit,在Inspector窗口中的MoleScript下面将会可以添加mole_up和mole_down音效。为每一个MoleUnit重复上述步骤。
  8. tk2dCamera应该已经带有Listener,没有Listener,我们将无法听到任何声音。如果您使用的是旧版本的tk2dcamera没有附带Listener,或正在使用Unity相机,需要添加Listener:在Hierarchy窗口中,选中tk2dcamera对象,然后在Inspector窗口点击AddComponent按钮,然后选择Audio > Audio Listener,Listener将被添加到相机,这就是所有你需要完成的事。
    img/add_listener.png

现在我们已经做完开发一个游戏的所有工作了。好吧,虽然它不是Halo 4这样的游戏,但我们已经覆盖了创建游戏的所有要点:添加一个相机、添加精灵、添加文本、添加声音和脚本。如果你没有游戏美工和游戏音乐师,不用担心,网上有很多的资源你可以下载下来用到后续的游戏制作中。