欢迎来到我的博客小站。  交流请加我微信好友: studyjava。  也欢迎关注同名公众号:Java学习之道

[转]unity实战之fly bird

  |   0 评论   |   0 浏览

关于flybird

这个游戏想必大家都玩过,今天我们要使用unity来写一个差不多的fly bird,需要unity和vs的配合,这个游戏规则就是控制一个bird通过一个个柱体之间的缝隙。在这里插入图片描述

场景的搭建和素材的导入

打开unity,选择文件路径,因为这个游戏是2D的,选择2D后我们create。素材我们百度asset store就找到unity为我们提供素材的地方,在搜索栏搜索bird就好了,在筛选的位置选择价格免费,很方便的,在里面随便选一个bird就好了,import到你的unity项目里。觉得这个素材质量不太好的,自己可以使用ps在网图上面扣下来自己想要的bird。在这里插入图片描述

使用素材搭建game和scene

在你的素材包选择你喜欢的bird拖入scene中,我们要完成一个fly的bird,我们需要借用unity中的刚体,就是给bird在右侧的inspector加上脚本Rigidbody 2D。

这样这个bird就具有我们想让他有的自然下落等一系列物理条件
运行一下可以看到bird的自然下落,就ok了

我们的bird在游戏里不可能是一直下落的,这样需要我们给这个场景加上一个边界。
我是直接使用ps弄了一个白色柱体(你还可以使用unity自带的素材,也可以按上面导入),游戏边界我们让他有什么条件呢,让他是个类似实体平面,可以让bird停留在上面这时候使用collider2D这个属性(当然我们的bird上也必须有这个collider,里面有个polygon collider2D这个很适合这种不规则形状的物体),先对一个柱体完成上面的操作 剩下的复制(ctrl+d就可以直接复制)就好了 (横竖不一样,调节z的角度为90就OK了),将边框完成。
运行一下发现bird会落在白色边界上,这样场景就搭建好了。

制作柱体

我们还是使用上面的白色柱体(不喜欢的可以自己随便导入柱体,没有影响的),对柱体加上collider(我们游戏规则,bird必须在两个柱体之间的缝隙通过,两个柱体是不可以穿过),ok后复制一个,调整二者的位置,形成我们想得到的样子,然后我们右键建一个gameobject并命名为column,将上面建好的两个柱体拖到这个column里面,在column上(注意不要点在那两个柱体上)增加一个box collider2D并使用edit collider,然后对这个的is trigger进行勾选(这个的意思让bird可以在这个之间的collider通过,方便我们后面编写script进行计分),让column成为这样并拖入assets中即可成为我们的素材(毕竟以后我们要不断的生成column):
在这里插入图片描述

bird的script

现在开始我们快乐的edit script环节,在assets右键生成一个文件夹,命名为code,在code里面create一个c# script命名为birdcontrol(这几步最好一次完成,否则到时候加脚本到bird上会出现找不到脚本的bug,真的莫名其妙),打开这个birdcontrol,我们会看到自动生成的代码里面有两个函数(可以使用的函数有4个,每一个的具体含义自己百度,我就不赘述了)
将下面的代码拖到bird的inspector中,对speed赋值,通过空格键,操作bird的移动。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class birdcontrol : MonoBehaviour
{

    Rigidbody2D bird;

    public float speed;                                         //使用speed方便在项目里面选择一个合适的倍数

    // Use this for initialization
    void Start()                                                //游戏一开始就会调用的函数
    {
        bird = GetComponent<Rigidbody2D>();                     //将游戏里面的bird引入
    }
    // Update is called once per frame
    void Update()                                               //游戏每一帧都会调用的函数
    {
        if (Input.GetKeyDown("space"))
        {
            bird.AddForce(new Vector2(0, 2 * speed));           //vector2相当于一个有xy的矢量
        }
    }
}

column的sprite

我们完成了bird在竖直方向的移动控制,接下来要完成在水平方向的移动,总所周知运动是相对的,我们可以通过让column的移动,来完成水平方向的移动,让他以一个均匀的速度自动向右移动translation。
还有当bird通过column时会加一分,这时候使用ontriggerexit2D这个函数来判断。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class columncontrol : MonoBehaviour {
    public float speed;
	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        this.transform.Translate(new Vector2(-speed,0));
	}

    private void OnTriggerExit2D(Collider2D collision)
    {
        if (collision.gameObject.tag == "player")
        {
            Debug.Log("1");
        }
    }
}

column的生成

游戏中不可能只有一个柱体,而且也需要他的上下变动,这时候我们需要在游戏的最右端的一个位置不断地生成位置随机的column,这时候我们需要给他一个生成点spawnpoint,右键一个empty,命名为spawnpoint,然后我们为他添加脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class spawn : MonoBehaviour {

    public GameObject column;
    public float colddown = 2f;
    public float NextSpawn;
	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        if (Time.time > NextSpawn)
        {
            NextSpawn = Time.time + colddown;

            Vector3 spawnP = transform.position;
            spawnP.y += Random.Range(3.0f, -3.0f);
            Instantiate(column, spawnP,transform.rotation);
        }
	}
}

最后别忘记将column应用上去
在这里插入图片描述

游戏判定

我们都知道当这个bird碰到墙壁,柱体上,游戏都是失败,这时候就会停止游戏,所以我们给他一个hitted和GM的脚本进行判断(hitted是要添加到ground和column上)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//GM.cs
public class GM : MonoBehaviour {

    public static int score = 0;

    public static bool Active = true;

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//hitted.cs
public class Hitted : MonoBehaviour {

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "Player")
        {
            GM.Active = false;
        }
    }
}

一旦bird与其碰上就会立刻停止column的运动和生成,所以我们在上面的也要相应的修改

if (GM.Active)		//columncontrol.cs
        {
            this.transform.Translate(new Vector2(-speed, 0));
        }
1234
if (Time.time > NextSpawn&&GM.Active)	//spawn.cs
        {
            NextSpawn = Time.time + colddown;

            Vector3 spawnP = transform.position;
            spawnP.y += Random.Range(3.0f, -3.0f);
            Instantiate(column, spawnP,transform.rotation);
        }

游戏结束画面

右键在UI里面选择text,并把其命名为score(用于显示分数)再canvas里面再新建一个text,命名为gameover(显示Game Over!),并在上面的active位置把勾取消(不显示文本,当游戏结束时才会出现),下面是UI.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class UI : MonoBehaviour {
    public GameObject gameover;
    public Text score;
	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {

        score.text = "Score" + GM.score;

        if (!GM.Active)
        {
            gameover.SetActive(true);		//这里会让gameover显示	
        }
	}
}

UI.cs要添加到canvas上并在相应的位置把score和gameover应用上去。在这里插入图片描述

结语

这个flybird较为简单,但是动手实践的时候会让你受益颇多,也是方便你入门的一个程序,我是用的unity和vs的组合比较方便,至于怎么配置的环境和他们之间的关系,百度一下就好了。


标题:[转]unity实战之fly bird
作者:shirln
地址:https://mmzsblog.cn/articles/2020/09/29/1601370402489.html
-----------------------------
如未加特殊说明,此网站文章均为原创。
转载须在文章起始位置标注作者及原文连接,否则保留追究法律责任的权利。

个人微信公众号 ↓↓↓                 

微信搜一搜爱上游戏开发