Unity3D 5小时入门感受

​ 前两天逛Win10商店时被一个叫做Alto’s Adventure的游戏吸引了,画质美的让人陶醉,我就喜欢这种风格的游戏,同样风格的还有《纪念碑谷》,这个游戏应该大家都玩过。

​ 之前也玩过一段时间Cocos2dx, 就想知道这个游戏是怎么做的,一查还真查到了作者的博文,介绍了这个游戏的开发历程。果然,和《纪念碑谷》一样,这个游戏使用Unity3D开发,同时作者说到开始也尝试了用Cocos2dx,但觉得Cocos2dx达不到他想要的效果,最终选择了用Unity3D。作者本来是一个WEB Developer & Designer,这是他做的第一款游戏,不愧是设计师的作品!

​ 出于对Unity3D的新奇,决定用这个下午来尝尝鲜。

环境准备

下载了最新的Unity5.5 Personal版,个人版免费,功能完备。其次,之前就已经安装过了VS2013, 也有Android SDK。安装完就可以用了!

教程选择

既然是尝鲜就免不了一个有趣的,完整的,有质量的教程。我直接选择了Unity3D官方的教程,2D UFO Tutorial,制作一款完整的飞船小游戏。视频全程都是放在YouTube的,虽然是英文,但是既然是视频就没多大问题了。整个教程分九节,每一节10-20分钟,自己边试边做,一个下午足够了。下面是教程的内容大纲:

过程

从教程库下载游戏资源

打开Unity, 新建项目,选择2D, 因为这个游戏是2D的。

使用Ctrl+9打开Asset Store, 在右侧的Unity Essentials分类下找到Simple Projects, 找到2D UFO Tutorial, Download->Import。

游戏场景创建

将File -> New Scene , 命名为Main.

从Asset中找到Sprites的Backgroud,拖入到Main下。

Main是游戏的一个场景,场景下有多个物体,Background也是一个物体,它对应一张图,每个单独的物体都对应多个属性。在右边的面板中显示了当前物体关联的所有东西。使用右边的Add Component可以添加与该物体有关的一切,包括给该物体创建刚体,添加控制脚本。

让一个物体称为刚体

刚体的概念,用过物理引擎的都知道,它代表物理世界的可以受力的物体。选择飞船,选择Add Component -> Physics 2D -> 各种形状的刚体。在Rigidbody 2D面板下可以修改刚体属性,包括是动态还是静态。

当一个物体成为动态刚体时它将收到重力,Gravity Scale控制重力大小,由于在这个游戏中物体不能收到重力,所以将其设置为0.

为物体添加控制脚本

物体的控制脚本可以用C#或JS, 我选择了C#, 创建方式还是一样,Add Component, 可以直接在搜索框输入script, 可以快速查找到,脚本初始是这样的。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour {

	// 游戏开始时执行
	void Start () {
		// 使用该方法进行初始化
	}
	
	// 每一帧执行一次
	void Update () {
		
	}
}

MonoBehaviour是所有控制的基类,在这个游戏中不会使用到其它的控制类。

Start()方法是初始化方法,可以想象成构造函数。一般在这里进行初始化操作,比如赋初始值等。

Update()是每一帧都要执行的。

LateUpdate()是在每一个Update()后执行的。

FixedUpdate()是以固定间隔执行的方法,一般在这里处理用户输入,物理物体控制等。

飞船控制

现在我们要控制物体Player, 即游戏中的飞船,首先要给其创建刚体,即Rigidbody 2D

然后创建要给C# script, 插入以下代码:

public class PlayerController : MonoBehaviour {

    public Rigidbody2D player;  // 刚体
    public float speed;  // 速度(向刚体施加的力度)

    void Start()
    {
    }

    void FixedUpdate()
    {
        float moveH = Input.GetAxis("Horizontal"); // 获取水平输入(方向键← →或a d)
        float moveV = Input.GetAxis("Vertical");  // 获取垂直方向输入(方向键上、下或w s)
        Vector2 vec2 = new Vector2(moveH, moveV);
        player.AddForce(vec2 * speed);  // 在刚体上施加力度
    }
}

脚本保存后回到Unity编辑器,会发现Script面板下多了两个变量,即和脚本对应的player和speed, speed的值默认为0,可以在这里修改。重要的是player, 这个需要传入一个Rigidbody2D实体,相当于对脚本中的player进行初始化,这个是Unity比较强大的地方,变量可以通过图形化就搞定了,我们需要在Scene面板下,选择我们的player, 按住左键并拖入到script面板下的player赋值框中,这样就完成了这个实体的绑定了,非常方便。但是要注意的是,在脚本中定义的变量一定要是public才能在脚本面板中看到,否则是看不到的!

此时运行,就可以用方向键控制飞船了,但是由于speed的初始值为0,或者设置太小,看不出效果,将speed的值设置为10看一下,就会有效果了!

给飞船设置碰撞边界 (Collider)

还是选中Scene下的player, 右侧添加 Circle Collider 2D, 这是一个圆形的碰撞边界,还有矩形的多边形的,飞船是一个圆,于是我选择了圆。创建之后调整Radius, Unity 支持鼠标拖动调整值的大小,只需先选中输入框,按住左键然后上下或者左右拖动鼠标,同时鼠标可以穿透屏幕然后又从屏幕的另一边出来,这些小小的feature非常贴心。

创建其它碰撞边界

只有一个可碰撞的物体,它永远也不会发生碰撞,同时在力的作用下会飞出屏幕,所以还要添加一个屏幕边界,也是一个Collider, 创建在Background上,直接创建的Collider将背景图片当成要给实心物体,而飞船应该实在它内部移动的,所以应该是使用四个矩形组成一个盒子来构建这个“空心的物体”。

添加撞击触发事件

编辑飞船的控制脚本,添加触发事件

void OnTriggerEnter2D(Collider2D other)
{
    // 判断自己是否与标签为“PickUp”的碰撞体相撞
    if (other.gameObject.CompareTag("PickUp"))
    {
        // 如果碰撞,那么将被碰撞的物体从场景中隐藏
        other.gameObject.SetActive(false);
    }
}

现在,移动飞船去捡宝石,发现宝石像墙一样,由于宝石设置了Collider, 两者碰撞,宝石不会和飞船发生重叠,因此无法触发该事件,只需要在宝石Collider属性上勾选is Trigger即可。

至此,开动飞船吧,去捡宝石!