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

Unity编写冰球对战游戏 2D版

2017-09-25 19:35 393 查看

Unity编写冰球对战游戏 2D版

Unity是一款非常方便、简洁、低成本的一款游戏引擎。在这里,向大家介绍这样用Unity这个引擎编写冰球对战游戏

因为Unity这个引擎可以编写3D游戏 ,同样的也可以编写2D游戏,这里先给大家介绍2D版的编写过程

首先,先创建项目,创建项目的具体过程在上一篇文章中有详细介绍,这里就不多赘述了。



这里可以看到,选择2D版与3D版的编写界面有些不同,摄像机是一个平面视角,而Game视窗显示出二维的游戏场景。

而在2D版的编写中,大多用到Sprite(精灵)组件来构成场景、添加主角人物等等等等。可以说,Sprite在2D游戏开发中相当于基石或者祖师爷的存在。

在进行总体的编写之前,对冰球对战这个游戏进行简单的需求分析

1. 游戏基本要素: 需要游戏背景、游戏中的冰球所对应的圆形、游戏中由玩家控制的长方形反弹壁、限制冰球活动和反弹壁活动的虚拟墙壁。

2. 游戏规则: 游戏开始时小球在随机方向上进行移动,玩家控制反弹壁将小球反弹到对方区域,碰到上、下两侧墙壁时,小球按照相应角度进行反弹。当遇到反弹壁后的墙壁时,游戏结束,对方积分加一。

3. 特殊要求: 对虚拟的碰撞墙壁可进行自适应操作(即可以在分辨率改变的情况下,虚拟墙壁的位置,大小也可以发生改变)。

4. UI:计分板,每次得出胜负后,计分板会出现相应的变化。

对冰球对战这个游戏进行简单的需求分析后开始进行项目的编写。

由上图可以看到,最开始时是一个空的场景,里面的任何东西都需要我们自己去添加。在Hierarchy中右键添加Sprite来创建游戏背景,游戏反弹壁和游戏球(这里要注意,Sprite的外观颜色是不能单独更改的,必须要通过添加材质的方式来对Sprite的外观等进行修改)。并在Project下添加已制作好的Sprite的材质。创建后的界面效果如下:



向Sprite中添加材质的方法: 点击要添加材质的Sprite,这时属性栏会出现这个Sprite的各项参数,将所确定的材质拖入到众多属性中的Sprite中即可。

创建完基本元素后,接下来要编写脚本实现对2个反弹壁的控制,在Project的Script中创建一个C#脚本文件,文件名随意。



在上图的左边显示的是你所创建的脚本的代码内容,当然,现在只包含最基本的主函数,头文件等等,要让反弹壁进行移动还要自己添加代码。双击这个脚本文件,这是系统会启动VS,在VS下进行编写

编写脚本前,要记得对这两个反弹壁添加Rigidbody2D,并取消掉重力这个选项。这样才可以进行一下操作。

因为是控制反弹壁的移动,所以要设置键位,当按下键位是,采取相应的操作,具体代码如下:

public class PlayerController : MonoBehaviour {
public KeyCode up;
public KeyCode down;

Rigidbody2D rig;
public float speed = 5;
// Use this for initialization
void Start () {
rig = GetComponent<Rigidbody2D>();
}

// Update is called once per frame
void Update () {
if (Input.GetKey(up))
{
rig.velocity = new Vector3(0,speed,0);
}
else if(Input.GetKey(down))
{
rig.velocity = new Vector3(0, -speed, 0);
}
else
{
rig.velocity = new Vector3(0, 0, 0);
}
}
}


编写好脚本后,拖到反弹壁的两个Sprite中,并在属性中设置相应的键位(想要在属性中设置各个变量的参数,需要将该变量Public化)。

经过以上操作后以及实现反弹壁的上下移动,但在这里会出现一个bug,就是反弹壁的移动是没有限制的,所以接下来我们要创建4个虚拟墙壁,用GameManager来实现。创建4个GameManager,添加到一个Game Manager中,并赋予不同的名称。

根据之前的需求说明可以知道,要实现这个虚拟墙壁GameManager的自适应化,就要使用代码来获取当前分辨率的各种参数,并按照参数进行调整并赋值到GameManager的各个属性中。

具体代码如下:

BoxCollider2D left;
BoxCollider2D top;
BoxCollider2D right;
BoxCollider2D down;
private void RestWall()
{
left = transform.Find("left").GetComponent<BoxCollider2D>();
top = transform.Find("top").GetComponent<BoxCollider2D>();
right = transform.Find("right").GetComponent<BoxCollider2D>();
down = transform.Find("down").GetComponent<BoxCollider2D>();

Vector3 tempPosition = Camera.main.ScreenToWorldPoint(new Vector3(Screen.width, Screen.height));
top.transform.position = new Vector3(0, tempPosition.y + 0.5f, 0);
left.transform.position = new Vector3(-tempPosition.x - 0.5f, 0, 0);
right.transform.position = new Vector3(tempPosition.x + 0.5f, 0, 0);
down.transform.position = new Vector3(0, -tempPosition.y - 0.5f, 0);

top.size = new Vector3(tempPosition.x*2,1,1);
down.size = new Vector3(tempPosition.x * 2, 1, 1);
left.size = new Vector3(1, tempPosition.y * 2, 1);

add3
right.size = new Vector3(1, tempPosition.y * 2, 1);
}


算法较简单,我在这里也不过多赘述了。

当各种基础条件都搭建好后,就可以对操作冰球的脚本文件进行编写了,在之前取消了中了的选项,但是,因为要做出碰撞的效果,所以这里还要添加一个弹力的材质。



在编写小球脚本时需要注意几个问题,怎样让小球一直保持一定速度。游戏开始时小球应该怎样移动。具体实现代码如下:

Rigidbody2D rig;
public GameObject gameStart;
// Use this for initialization
void Start()
{
//GameStart();

}

public void GameStart()
{
gameStart.SetActive(false);
rig = GetComponent<Rigidbody2D>();
int num = Random.Range(0, 2);//获取随机数0或者1
if (num == 0)
{

rig.AddForce(new Vector3(-300, 0, 0));
}
else
{
rig.AddForce(new Vector3(300, 0, 0));
}
}

// Update is called once per frame
void Update()
{

if (rig)
{
//解决小球速度越来越慢
Vector3 velocity2 = rig.velocity;
//print(velocity2);
if (Mathf.Abs(velocity2.x) < 9 && velocity2.x != 0)
{
if (velocity2.x > 0)
{
velocity2.x = 10;
}
else
{
velocity2.x = -10;
}
rig.velocity = velocity2;
}
}
}

void OnCollisionEnter2D(Collision2D collision)
{
Vector3 velocity1 = rig.velocity;
if (collision.gameObject.tag == "Player")
{
velocity1.y = velocity1.y / 2 + collision.rigidbody.velocity.y / 2;

}

if (collision.gameObject.tag == "Left")
{
print("ss");
GameManager.instance.ScoreChanged("left");
}
if (collision.gameObject.tag == "Right")
{
print("ss");
GameManager.instance.ScoreChanged("right");
}
rig.velocity = velocity1;
}


这样一个冰球对战的Unity2D版就已经完成了,如果想加入UI的话,与添加Sprite的方法相同,并在GameManger的脚本中对UI积分板的变化进行代码编写,具体代码如下:

int score1 = 0;
int score2 = 0;

public Text txtScore1;
public Text txtScore2;
public void ScoreChanged(string wallName)
{
print("aa");
if (wallName=="left")
{
score2++;
}
if (wallName=="right")
{
score1++;
}
txtScore1.text = score1.ToString();
txtScore2.text = score2.ToString();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity 游戏