Unity入门学习之Roll A Ball小游戏

这个是一个比较简单的入门小项目,简单记录一下步骤和知识点。

整体概览

1.游戏界面
Unity入门学习之Roll A Ball小游戏
2.游戏玩法:目标小球吃掉所有的小方块,则游戏胜利

创建工程

在Assets目录下新建Materials、Prefabs、Scenes、Scripts文件夹,用于分别存放材质、模型、场景和脚本文件

添加素材

使用UI中的Plane作为整个地面板,3D Object中的Sphere作为玩家控制的小球,3D Object中的Cube作为围墙、被捕食的小方块

1.材质 Material
类似于包装或者说是喷漆,作为在目标物体外层样式。
最简单的使用方法是右击、Create一个Material,修改Main Maps下的Albedo属性,更换颜色。
将材质拖放到对于物体下,即可生效。

2.素材 Prefab
相当于一个模板,需要用的时候之间拖放到场景当中。好处是,修改模板物体的属性,由该模板生成的所有物体的属性就统一修改了,比较方便。

3.场景 Scene
一个游戏可能由多个不同的场景组成,按需要在各场景切换。

4.视角
每个游戏物体都有一个自己的视角(Local)和全局视角(Global),在界面左上角可以进行切换。Unity入门学习之Roll A Ball小游戏

添加功能

1.控制小球运动
首先给球(Player)添加一个Component:RigidBody(刚体)。RigidBody的作用是可以模拟物理的特性,例如运动、重力等。

创建C#脚本Player.cs,挂到小球Player下,在脚本中获取这个RigidBody组件,并控制其运动。

// 作用力的大小(设置为public可以显示在组件属性栏中)
public float force = 5;   

// Use this for initialization
void Start () {
    rd = GetComponent<Rigidbody>();     // 得到绑定脚本的当前物体上的刚体组件
}
// Update is called once per frame
void Update () {
    float h = Input.GetAxis("Horizontal");  // 获取键盘输入,范围[-1,1],A左D右
    float v = Input.GetAxis("Vertical");
    rd.AddForce(new Vector3(h,0,v) * force);  // 给刚体施加外力,控制移动
}

然后可以再Unity中,给小球自定义外力大小。
Unity入门学习之Roll A Ball小游戏
2.检测小球与方块的碰撞
此处有两种方法:碰撞检测、触发检测。
碰撞检测具有物理效果,物理无法进入触发器内部;出发检测反之。

首先,小球和方块都必须有collider组件,如图
Unity入门学习之Roll A Ball小游戏Unity入门学习之Roll A Ball小游戏
其中的Is Trigger属性,勾选表示使用触发检测,不勾选则使用碰撞检测。

然后再C#脚本Player.cs种添加代码:

// 碰撞检测
void OnCollisionEnter(Collision collision)
{
    // collision.collider 可以获取碰撞到当前目标的游戏物体的Collider组件
    //string name = collision.collider.name;
    //print(name);    // 控制台输出游戏物体名称
    if (collision.collider.tag == "Pickup")
    {
        Destroy(collision.collider.gameObject);     // 销毁目标物体
    }
}

// 触发检测 (区别:无物理效果,物体可以进入触发器内部;例如人物进入到某一块地区后,门自动打开)
void OnTriggerEnter(Collider collider)
{
    if (collider.tag == "Pickup")
    {
        Destroy(collider.gameObject);   // 销毁被碰撞的物体
    }        
}

3.统计分数
新建UI->Text,用于显示分数;再建一个显示You Win。

在脚本Player.cs中动态控制该文本物体。

// 只需要控制该Text物体的Text组件
public Text scoreText;  
 // 需要控制整个游戏物体
public GameObject winText; 
// 修改触发检测部分的代码
void OnTriggerEnter(Collider collider)
{
     if (collider.tag == "Pickup")
     {
         score++;
         scoreText.text = score.ToString();   // 显示分数
         Destroy(collider.gameObject);   // 销毁被碰撞的物体
         if (score == 8)
        {
             winText.SetActive(true);  // **物体,使之显示出来
        }
   }       
}

在Unity中Player物体下,关联一下代码变量和Unity物体:
Unity入门学习之Roll A Ball小游戏
4.给小方块添加自转效果
新建C#脚本PickUp.cs并挂到Pickup小方块模板下。

// transform返回挂载此组件的物体的位置
void Update () {
    transform.Rotate(new Vector3(0, 1, 0));     // 旋转当前组件,绕y轴
}

5.设置游戏视角跟随小球
原理:设置相机和小球之间的相对位置不变。
新建C#脚本FollowTarget并挂到Camera物体下。

public Transform playerTransform;   // 用来获取主角位置
private Vector3 offset; // 偏移量

void Start () {
	// transform.position 获取调用脚本的当前游戏组件位置,此处camera使用了脚本,返回camera位置
    offset = transform.position - playerTransform.position;
}
	
void Update () {
    // 设置相机位置,与主体组件相对位置保持不变
    transform.position = playerTransform.position + offset;  
}

打包发布游戏

在Unity中选择File->Build Settings,拖入要发布的Scene,选择发布的平台:
Unity入门学习之Roll A Ball小游戏
点击Build完成游戏发布,发布后的文件目录如下:
Unity入门学习之Roll A Ball小游戏