Unity官方实例教程 Roll-a-Ball
一、添加游戏对象——平台(Plane)
-
第1种:通过菜单GameObject->3D Object->Plane来创建,如下图:
-
第2种:通过Hierarchy窗口中Create按钮来创建,如下图:
-
第3种:通过右键菜单创建,我们在Hierarchy窗口中单击右键会弹出菜单,如下图:
二、添加我们的主角——球体(Sphere)
有了平台后,制作Roll-a-Ball游戏我还需要一个球体,我们可以通过方向键来控制球体移动,添加球体的方式,和上面添加平台的方式一样,只不过我们选择的是Sphere对象,如下图:
三、让球体动起来——添加脚本(Script)和刚体(Rigidbody)
刚体可以给球体添加物理效果,让他可以检测物理碰撞,便于我们后面实现拾取物体和碰撞墙面
给球体添加刚体有2种方法:
-
第1种:通过Component->Physics->Rigidbody添加,如下图
-
第2种:通过Add Component按钮添加,如下图
第2步:给球体添加脚本
首先我们要再提一下开始说到的资源管理思想,为了便于我们管理游戏的资源,所以我们会创建一个文件夹,来专门存放所有的脚本文件,如下图:
要想给球体或者说任何一个GameObject添加一个脚本,我们首先选中GameObject,这里我们选中球体也就是我们的Player,然后在Inspector窗口中点击Add Component按钮,在弹出的菜单中选着New Script
之后会进入脚本名称和语言类型选择,这里我们将脚本命名为PlayerController,然后语言选择C#(C Sharp)
点击Create and Add后,我们就成功给球体添加一个脚本组件,然后我们点击脚本组件右上角的小齿轮按钮,在弹出来的菜单中选择Edit Script便可打开脚本编辑器了
四、编写脚本
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就创建好了
然后我们可以复制PickUp对象,并拖拽新的PickUp到合适的位置,此时你会发现拖拽没有办法保持Y轴不变,因此为了方便我们移动PickUp对象的位置,我们先将Scene视图改为Y轴模式
Y轴模式
然后将Local模式改为Global模式
Global模式
八、让球体拾取方块
接下来我们实现球体拾取方块的功能,我们通过查API得知有一个OnTriggerEnter的方法可以用来在球体碰到物体的时候调用,光有这个方法还不够,我们还需判断球体碰到的是什么东西,我们不能碰到任何东西都拾取,所以我们需要给拾取的方块增加一个标记(Tag),增加标记的方法如下:
-
因为我们场景里面一共有8个方块,如果一个个的设置标记,就有点太麻烦了,还记得上面我们提到的Prefab的第2点好处吗?对了,这边我只需要给Prefab标记就可以了
-
首先我们选中PickUp Prefab,然后在Inspector的Tag里面新增一个Tag,我们命名为PickUp
-
然后我将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脚本,如下:
上图第一句红线处,我们定义了一个count变量用来保存分数,然后在Start方法中将Count的值设置为0,即我们在游戏开始时,将分数初始化为0,最后我们在拾取方块的时候,把count的数量加1
这里count++是一种简写,其实它的效果等同于**count = count + 1
现在我们有了变量来记录分数,但是我们还没有显示给玩家,所以我们需要一个UI来显示分数,我们创建一个文本UI(Text UI)
然后我们调整Text的位置至屏幕的左上角
接下来我们再次修改PlayerController,如下:
- 在代码最前面,我们需要引入UnityEngine.UI,只有这样后面代码才会识别Text类型的变量,
- 然后我们在定义countText变量来保存UI Text
- 接着我们在Start方法中调用setCountText方法,来更新countText的内容
- 然后我们在每次球体碰到方块的时候,也需要更新countText的内容
- 最后是我们定义的setCountText方法
然后我们保存代码,回到Unity编辑器里面,将Text拖入到Player里面的Count Text属性
做完这些,我们就可以运行游戏,看到效果了!