Unity3d小游戏--打砖块

1,833 阅读3分钟

这是我参与8月更文挑战的第30天,活动详情查看:8月更文挑战

之前已经写过几篇用unity写的小游戏博客,感觉还不错,那么我就继续写下去。 今天写的打砖块初级版的小游戏。

其实这个游戏就是模仿传统的打砖块游戏。不过游戏的主题设计是在海底。一只乌龟作为挡板接住小球,并且通过反弹小球而打到浮在上游的其他海底生物。游戏界面如下图所示。

image.png

为了丰富游戏内容,让游戏元素更加多。此小游戏采用了关卡制。打完一关会到下一关。并且每一关卡的难度不一样,怪物不一样,怪物数量不一样,并且怪物的血量不一样。

image.png

虽然创造的是一个小游戏,但是它也是五脏六腑俱全的。下面我们一起来看看它的设计过程。

1首先介绍的是场景中的物体。

image.png

场景中的物体有上面几部分过程,分别是摄像机,日关灯,背景图,小球,乌龟,gameover图标。摄像头就像是眼睛一样,是必须的,没有了摄像头也就看不到场景发生了什么。还有日关灯是平行光,像太阳照射一样,如果场景中没有了的话,就会一片黯淡无光。我做的是2d游戏,所以这里只需要导入背景图片,然后设置成为精灵类型,在场景中选择中间的位置,把它放大就行。还有在game窗口我用了自己写的比例,让它看起来像手机游戏的窗口显示。

void Start()
    {

        Random.InitState((int)System.DateTime.Now.Ticks);
        x = Random.Range(3.0f, 9.0f);
        y = Mathf.Sqrt(vec * vec - x * x);
        rigid = gameObject.GetComponent<Rigidbody2D>();
        rigid.velocity = new Vector2(x, y);
    }

    // Update is called once per frame
    void Update()
    {
        if (this.transform.localPosition.x > 2.8f && x > 0 || this.transform.localPosition.x < -2.8f && x < 0)
        {
            x = -x;
            rigid.velocity = new Vector2(x, y);
        }
        if (this.transform.localPosition.y < -3.31f &&y<0 )
        {
            Time.timeScale = 0;
            gameover.transform.localPosition = new Vector2(-0.1f, 2.0f);
        }
        if (this.transform.localPosition.y > 6.5f &&y>0)
        {
            y = -y;
            rigid.velocity = new Vector2(x, y);
        }

    }

上面这一段是小球的关键代码。这里面写的主要是小球碰到了墙体,然后反弹,这需要改变速度的方向。

void Update()

    {

 

        //获取鼠标在相机中(世界中)的位置,转换为屏幕坐标;

        screenPosition = Camera.main.WorldToScreenPoint(transform.position);

        //获取鼠标在场景中坐标

        mousePositionOnScreen = Input.mousePosition;

        //让场景中的Z=鼠标坐标的Z

        mousePositionOnScreen.z = screenPosition.z;

        //将相机中的坐标转化为世界坐标

        mousePositionInWorld = Camera.main.ScreenToWorldPoint(mousePositionOnScreen);

        //物体跟随鼠标移动

        //transform.position = mousePositionInWorld;

        //物体跟随鼠标X轴移动

        transform.position = new Vector3(mousePositionInWorld.x, transform.position.y, transform.position.z);

 

}

上面这一段就是乌龟挡板的关键代码。主要是让乌龟随着随表移动。

void OnTriggerEnter2D(Collider2D collider)

    {

        if (collider.gameObject.tag == "spark" && Time.frameCount - timelast > 15)

        {

            timelast =Time.frameCount;

            collider.gameObject.GetComponent<spark>().lift -= 1;

               y = -y;

   

               rigid.velocity = new Vector2(x, y);

        }

        else if (y <0)

        {

            y = -y;

            rigid.velocity = new Vector2(x, y);

        }

  }

我们看看这个小球中的碰撞检测函数。碰撞的对象的tag是spark,这里的spark是指怪物。让碰撞到的话就会血量减少。这个血量是怪物身上的全局属性。当怪物血量为0的话,怪物就会销毁。当场景中没有了怪物,那就算一个关卡的结束。

这个小游戏也不算太难。当时如果是新手学unity的话,可以了解一下。之后对于物理系统和碰撞检测都有一定的认识。如果你有兴趣学unity的话,也可以关注公众号:诗一样的代码,找我一起学习。