[转]unity实战之fly bird
关于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://www.mmzsblog.cn/articles/2020/09/29/1601370402489.html
如未加特殊说明,文章均为原创,转载必须注明出处。均采用CC BY-SA 4.0 协议!
本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。若本站转载文章遗漏了原文链接,请及时告知,我们将做删除处理!文章观点不代表本网站立场,如需处理请联系首页客服。• 网站转载须在文章起始位置标注作者及原文连接,否则保留追究法律责任的权利。
• 公众号转载请联系网站首页的微信号申请白名单!
