[unity] unity学习——滚球游戏

来源:互联网 发布:php代码编写 编辑:程序博客网 时间:2024/05/22 11:55

一、学习内容

滚球游戏是这样的,一个四面有墙的场景,里面有球和小方块,控制球去吃方块,吃完方块就游戏结束。
通过制作滚球游戏进一步熟悉unity的操作以及游戏元素的设计。

二、游戏制作过程

1、创建3D工程——Roll a Ball

2、保存游戏场景

file——save scence,保存游戏场景,保存在工程目录的_scence目录中,命名为minigame

3、创建底板、小球元素

在Hierarchy视图中创建Plane元素作为底板,命名为Ground。

大小和规模选择reset的默认属性就行。



在Hierarchy视图中创建Sphere元素作为小球,命名为Player,同样reset,再把position的Y设为0.5,这样整个球正好在底板上面。
为小球添加Rigidbody组件,质量mass设为1,勾选重力作用use Gravity。

4、为地板着色

在project视图新建一个Material文件夹,并在里面创建一个material元素,命名为background,选择颜色为深色

拖动background到Ground地板上进行染色。

5、移动小球

为Player添加脚本组件new script,命名为PlayeControler。先添加三个内容:
小球移动速度speed   ,  Rigidbody加载Rigidbody组件,  获取输入控制移动input

using UnityEngine;using System.Collections;public class PlayerController : MonoBehaviour {    public float speed;    private Rigidbody rb;    void Start ()    {        rb = GetComponent<Rigidbody>();    }    void FixedUpdate ()    {        float moveHorizontal = Input.GetAxis ("Horizontal");        float moveVertical = Input.GetAxis ("Vertical");        Vector3 movement = new Vector3 (moveHorizontal, 0.0f, moveVertical);        rb.AddForce (movement * speed);    }}
其中上一篇已经用过的Input.GetAxis获取位移量,参数为“Horizontal”为横向,参数为“Vertical”为纵向。
与物理特性相关的操作应该放在函数FixedUpdate中,而不是Update中,Update多用于处理用户输入。
上一篇也已经用过,AddForce移动小球。
在组件属性面板中修改speed的值,运行游戏就可以控制小球移动了。

6、摄像机控制

小知识:将main Camera移动到player下面,摄像机就好跟随小球移动。
上一篇也学会用标准的unity脚本来控制摄像机跟随游戏元素。
这里,我们自己写脚本控制摄像机移动,对main Camera添加C#脚本元素:
using UnityEngine;using System.Collections;public class CameraControler : MonoBehaviour {    public GameObject player;    private Vector3 offset;    void Start()    {        offset = transform.position - player.transform.position;    }    void LateUpdate()    {        transform.position = player.transform.position + offset;    }}


GameObject创建对象存储Player元素(在组件属性面板会有player的属性框,将Player元素拖到这个属性框中,就将player元素与GameObject绑定起来了),计算开始摄像机与player的距离,然后一直保持这个距离。这样就做到了摄像机一直跟随小球了。

7、添加围墙

GameObject菜单栏中,选择Create Empty ,命名为Walls
再创建一个Cube元素,命名为West Wall,将West Wall拖放到Walls中,作为Walls的子元素。
通过Edit菜单的Duplicate或快捷键 Ctrl+D复制出三个West Wall元素,并命名为East Wall、South Wall、North Wall,改变其大小位置,正好放在地板的四面。这里我贴出我的四面墙的transform面板





至此完成围墙元素。运行游戏会发现小球只能在围墙内活动了。

8、添加——被采集的小方块

Hierarchy中添加Cube元素,命名为Pick Up,调整期transform属性,让其悬空立起来。transform面板为


然后,为pick Up添加c#脚本元素,命名为Rotator,让其自动自转起来,
using UnityEngine;using System.Collections;public class Rotator : MonoBehaviour {    void Update()    {        transform.Rotate(new Vector3(15, 30, 45) * Time.deltaTime);    }}


其中transform.Rotate是实现自转的函数,完成后运行游戏发现小方块已经能自动旋转。
因为要使用很多的Pick Up方块,所以在project面板中创建一个文件夹prefabs,把Pick Up拖进prefebs文件夹中,方便以后对所有Pick Up元素进行统一操作。
然后再Hierarchy视图中创建Empty元素,命名为Pick Ups,把Pick Up拖进Pick Ups中,同样Ctrl+D复制Pick Ups元素,总共12个Pick Up元素。然后水平移动这些元素形成一个好看的图案,我这里随意摆了个圆形。

接下来为Pick Up进行染色,和第四步一样,project视图中添加Materia元素,命名为Pick Up,然后选择金黄色(或者你觉得好看的颜色)
然后把Pick Up的Materia元素拖到Prefabs的Pick Up中,这也就是上面红色字体的目的,这样统一为所有pick Up元素进行染色。
至此完成所有采集块的制作。

9、实现小块采集

小球的运动实现了,采集块也制作完成了,下面是当小球碰撞到采集块的时候,采集块消失。
这一部分是在小球的脚本中完成,前面已经建立了PlayerControler脚本,编辑这个脚本,添加碰撞函数(这里用的是OnTriggerEnter函数),
void OnTriggerEnter(Collider other)     {        if (other.gameObject.CompareTag ("Pick Up"))        {            other.gameObject.SetActive (false);        }    }


函数就是当碰撞的元素的Tag是Pick Up时,让这个元素的状态设为false。这个Tag需要进行设置,点击project视图中的Prefabs文件夹下的Pick Up,它的Inspector视图中会有Tag属性,点击add tag,添加Pick Up,并将Tag设为Pick Up即可。


这时运行游戏发现采集块碰撞了不能消失,不急~上图中Inspector视图的Box Collider有个Is Trigger勾选项,将其勾选。再运行游戏,发现一家可以实现小块的采集了。

10、显示分数,及游戏结束

每采集一个元素,就积一分。元素采集完,游戏结束,显示you win!
编辑PlayerControler,添加count元素进行计分。
在Hierarchy视图中添加UI——Text,命名为Count Text,发现视图中多了Canvas,新建的text就在这个目录下。
text的Inspector面板中,有个color选择字体颜色,这里我设为白色。Rect Transform修改text的位置。
同样的方式创建一个Text元素,命名WinText,用来显示游戏获胜时的提示。

接下来就是修改PlayerControler脚本,使分数显示在count text上,脚本要添加using UnityEngine.UI;才能使用text组件。
在脚本中创建Text对象:Public Text CountText;    
   Public Text WinText;    
并在Start函数中进行初始化,每积一分时,CountText内容改变,count大于12时,游戏结束,WinText显示You Win!
PlayerControler的完整代码如下:
using UnityEngine;using UnityEngine.UI;using System.Collections;public class PlayerControler : MonoBehaviour {    private Rigidbody rb;    private int count;    public float speed;    public Text countText;    public Text winText;    void Start()    {        rb = GetComponent<Rigidbody>();        count = 0;        SetCountText();        winText.text = "";    }    void FixedUpdate()    {        float moveHorizontal = Input.GetAxis("Horizontal");        float moveVertical = Input.GetAxis("Vertical");        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);        rb.AddForce(movement *speed);    }    void OnTriggerEnter(Collider other)    {        if (other.gameObject.CompareTag("Pick Up"))        {            other.gameObject.SetActive(false);            count++;            SetCountText();        }    }    void SetCountText()    {        countText.text = "Count: " + count.ToString();        if (count >= 12)            winText.text = "You Win!";    }}

为了方便CountText的显示,写SetCountText方便调用CountText对象。
至此游戏制作结束,积分、获胜显示都有了。

11、导出游戏

file菜单栏的Build Setting选项,把minigame那个scence拖到Scenes In Build,根据你的环境选择平台,直接build即可。


三、总结

这个游戏的制作继续对简单的物体运动进行练习,以及上色练习,摄像机的控制,同样式元素的统一操作,元素直接的碰撞处理,text的初使用。
源码在我的GitHub里:https://github.com/congshenV/RollABall.git

0 0
原创粉丝点击