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

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);
        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();
    } 

猜你喜欢

转载自blog.csdn.net/znwhahaha/article/details/78088621