您的位置:首页 > 移动开发 > Unity3D

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

2016-07-01 19:46 836 查看

一、学习内容

滚球游戏是这样的,一个四面有墙的场景,里面有球和小方块,控制球去吃方块,吃完方块就游戏结束。
通过制作滚球游戏进一步熟悉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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity c#