Unity官方实例教程 Roll-a-Ball

一、添加游戏对象——平台(Plane)

  • 第1种:通过菜单GameObject->3D Object->Plane来创建,如下图:

     

    Unity官方实例教程 Roll-a-Ball

     

  • 第2种:通过Hierarchy窗口中Create按钮来创建,如下图:

    Unity官方实例教程 Roll-a-Ball

     

  • 第3种:通过右键菜单创建,我们在Hierarchy窗口中单击右键会弹出菜单,如下图:

    Unity官方实例教程 Roll-a-Ball

二、添加我们的主角——球体(Sphere)

有了平台后,制作Roll-a-Ball游戏我还需要一个球体,我们可以通过方向键来控制球体移动,添加球体的方式,和上面添加平台的方式一样,只不过我们选择的是Sphere对象,如下图:

Unity官方实例教程 Roll-a-Ball

 

三、让球体动起来——添加脚本(Script)和刚体(Rigidbody)

刚体可以给球体添加物理效果,让他可以检测物理碰撞,便于我们后面实现拾取物体和碰撞墙面
给球体添加刚体有2种方法:

  • 第1种:通过Component->Physics->Rigidbody添加,如下图

     

    Unity官方实例教程 Roll-a-Ball

     

  • 第2种:通过Add Component按钮添加,如下图

    Unity官方实例教程 Roll-a-Ball

     

第2步:给球体添加脚本

首先我们要再提一下开始说到的资源管理思想,为了便于我们管理游戏的资源,所以我们会创建一个文件夹,来专门存放所有的脚本文件,如下图:

Unity官方实例教程 Roll-a-Ball

 

要想给球体或者说任何一个GameObject添加一个脚本,我们首先选中GameObject,这里我们选中球体也就是我们的Player,然后在Inspector窗口中点击Add Component按钮,在弹出的菜单中选着New Script

Unity官方实例教程 Roll-a-Ball

 


之后会进入脚本名称和语言类型选择,这里我们将脚本命名为PlayerController,然后语言选择C#(C Sharp)

Unity官方实例教程 Roll-a-Ball

 

点击Create and Add后,我们就成功给球体添加一个脚本组件,然后我们点击脚本组件右上角的小齿轮按钮,在弹出来的菜单中选择Edit Script便可打开脚本编辑器了

Unity官方实例教程 Roll-a-Ball

四、编写脚本

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

public class Player : MonoBehaviour {

    public float Speed = 1;
    private int score = 0;

    private Rigidbody rd;
    public Text text;
    public GameObject win;

	// Use this for initialization
	void Start () {
        rd = GetComponent<Rigidbody>();
	}
	
	// Update is called once per frame
	void Update () {
        if (score >= 6)
            win.SetActive(true);
	}

    private void FixedUpdate()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");

        Vector3 move = new Vector3(h, rd.velocity.y, v);

        rd.AddForce(move * Speed * Time.deltaTime);
    }
}

五、让摄像头跟随球体移动

我们想要的效果只需要摄像机的位置跟随球体移动,角度不需要,所以我们只能用脚本来实现这一效果,首先我们给摄像机添加一个脚本(大家应该还记得如何添加吧,不记得可以回去看第一节的内容,这里就不再重复介绍了),我们给脚本命名为CameraController,脚本语言选择C#。然后我们看看脚本内容:

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

public class FllowTarget : MonoBehaviour {

    public Transform player;

    private Vector3 offset;

	// Use this for initialization
	void Start () {
        offset = transform.position - player.transform.position;
	}
	
	// Update is called once per frame
	void Update () {
        transform.position = player.transform.position + offset;
	}
}

六、添加一个旋转的方块

有了平台,有了球体,接下来我们就需要一个方块,这个方块可以让球体碰撞并拾取,为了让方块变得有吸引力一点,我们让方块可以自动旋转起来,首先我们创建一个cube对象(不要忘记创建GameObject之后的两个标准动作),然后我们将cube命名为PickUp,并把它的Rotation的X、Y、Z值都设置为45,然后将其拖动到一个你觉得合适的位置,比如这样:

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

public class Food : MonoBehaviour {

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        transform.Rotate(new Vector3(0, 0, 1));
	}
}

七、制作一个Prefab和使用Global模式

为了让游戏丰富起来,我们只有一个方块是不够的,因此我们需要多创建几个方块,在这之前呢,我们需要先制作一个Prefab(预制件),制作一个预制件有以下好处:

  • 一次制作,重复使用:可以在任何项目中使用Prefab
  • 一次修改,全部变化:我们修改Prefab的属性后,所有使用该Prefab的对象属性都会跟着发生变化
    而制作Prefab的方法也非常简单,我们为了资源管理方便,先在Assets文件夹下面创建一个Prefabs文件夹来存放Prefab文件,然后拖动Pickup对象到Prefabs,一个Prefab就创建好了

Unity官方实例教程 Roll-a-Ball

 

Unity官方实例教程 Roll-a-Ball

 

然后我们可以复制PickUp对象,并拖拽新的PickUp到合适的位置,此时你会发现拖拽没有办法保持Y轴不变,因此为了方便我们移动PickUp对象的位置,我们先将Scene视图改为Y轴模式

 

Unity官方实例教程 Roll-a-Ball

Y轴模式

然后将Local模式改为Global模式

 

Unity官方实例教程 Roll-a-Ball

Global模式

八、让球体拾取方块

接下来我们实现球体拾取方块的功能,我们通过查API得知有一个OnTriggerEnter的方法可以用来在球体碰到物体的时候调用,光有这个方法还不够,我们还需判断球体碰到的是什么东西,我们不能碰到任何东西都拾取,所以我们需要给拾取的方块增加一个标记(Tag),增加标记的方法如下:

  • 因为我们场景里面一共有8个方块,如果一个个的设置标记,就有点太麻烦了,还记得上面我们提到的Prefab的第2点好处吗?对了,这边我只需要给Prefab标记就可以了

  • 首先我们选中PickUp Prefab,然后在Inspector的Tag里面新增一个Tag,我们命名为PickUp

    Unity官方实例教程 Roll-a-Ball

     

     

    Unity官方实例教程 Roll-a-Ball

     

     

  • 然后我将PickUp Prefab的Tag设置为“PickUp”

接下来我们就可以进行脚本编写了,我们打开球体的PlayerController脚本,然后新增下面的代码

private void OnTriggerEnter(Collider other)
    {
        if(other.tag=="Food")
        {
            Destroy(other.gameObject);
            score++;
            text.text = "Score:"+score.ToString();
        }
    }

首先这里other变量代表球体碰到的对象,在这个方法里面,我先用if语句判断碰到的对象的Tag是否等于“PickUp”,如果等于,我就将碰到的对象设置为不**(不显示)

九、制作一个计分板

好了,我们的游戏基本可以玩了,但是我们还需给玩家增加一点刺激,做一个计分板来鼓励玩家多拾取方块,那么实现一个计分板我们需要以下元素

  • 用一个变量保存玩家的分数
  • 然后将分数显示在UI上面

首先我们修改PlayerController脚本,如下:

 

Unity官方实例教程 Roll-a-Ball

 

上图第一句红线处,我们定义了一个count变量用来保存分数,然后在Start方法中将Count的值设置为0,即我们在游戏开始时,将分数初始化为0,最后我们在拾取方块的时候,把count的数量加1

这里count++是一种简写,其实它的效果等同于**count = count + 1

现在我们有了变量来记录分数,但是我们还没有显示给玩家,所以我们需要一个UI来显示分数,我们创建一个文本UI(Text UI)

Unity官方实例教程 Roll-a-Ball

然后我们调整Text的位置至屏幕的左上角

Unity官方实例教程 Roll-a-Ball

 

接下来我们再次修改PlayerController,如下:

Unity官方实例教程 Roll-a-Ball

  • 在代码最前面,我们需要引入UnityEngine.UI,只有这样后面代码才会识别Text类型的变量,
  • 然后我们在定义countText变量来保存UI Text
  • 接着我们在Start方法中调用setCountText方法,来更新countText的内容
  • 然后我们在每次球体碰到方块的时候,也需要更新countText的内容
  • 最后是我们定义的setCountText方法

然后我们保存代码,回到Unity编辑器里面,将Text拖入到Player里面的Count Text属性

Unity官方实例教程 Roll-a-Ball

做完这些,我们就可以运行游戏,看到效果了!