Escrevendo Flappy Bird
introdução do jogo
No jogo "FlappyBird", o jogador clica na tela com o mouse, e o pássaro voa para cima, e o clique contínuo continua voando para lugares mais altos. Se você não clicar, ele cairá rapidamente. Portanto, o jogador deve controlar o pássaro para voar para frente e, em seguida, prestar atenção para evitar os canos irregulares no caminho.
efeito de jogo
A ideia do design do jogo
usa o processo de movimento da cena em relação ao pássaro para realizar indiretamente o deslocamento horizontal do pássaro. O pássaro na verdade só muda de posição na direção vertical, aumentando a gravidade do pássaro. Quando o jogador clica no mouse botão ou pressiona o espaço O pássaro recebe uma força para cima. Quando o pássaro estiver no meio de um cano de água, julgue se o pássaro colidiu com o lado superior ou inferior do cano de água ou com o solo. Se houver uma colisão, o jogo é considerado encerrado e o jogo começa de novo.
A implementação específica do jogo
1. A construção da cena
Use os materiais para construir de acordo com os padrões do jogo.
(1) Coloque os canos de água superiores e inferiores como um todo em um novo modelo (GameObject) e coloque esta classe e a cena do solo na cena de fundo.
(2) Coloque a cena de fundo no prefab, ctrl+D para copiar.
(3) Anime o material do pássaro (selecione e arraste todas as imagens do pássaro para a Hierarquia) e coloque-o na cena.
2. Adicione componentes aos objetos do jogo
Adicione corpos rígidos e corpos de colisão para o pássaro e adicione corpos de colisão ao solo e canos de água.
Escrever código
Código do pássaro
Ao escrever o código do pássaro, deve-se notar que a detecção de colisão é usada quando colide com o solo e canos de água, e a detecção de gatilho é usada quando colide com moedas de ouro. As moedas de ouro aqui também podem ser alteradas para adicionar um gatilho entre os dois canos de água e, quando o pássaro passar pelos canos de água, um ponto será marcado.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class Bird : MonoBehaviour
{
public int score = 0;//分数
public Rigidbody2D rigidbodybird;
public GameObject isDefentUI;
public Text text;
public SpriteRenderer sr;
public Sprite birds;
// Start is called before the first frame update
private void Awake()
{
sr = GetComponent<SpriteRenderer>();
}
void Start()
{
rigidbodybird = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update()
{
Up();
}
void Up()
{
if (Input.GetKeyDown(KeyCode.Space)||Input.GetMouseButton(0))
{
rigidbodybird.AddForce(new Vector2(0, 250f));
}
}
public void OnTriggerEnter2D(Collider2D other)
{
//触发检测食物
if (other.tag == "Food")
{
Destroy(other.gameObject);//销毁食物
score++;
text.text = "分数:" + score;
}
}
public void OnCollisionEnter2D(Collision2D collision)
{
//检测是否碰撞水管和地面
if (collision.gameObject.tag == "Pipe" || collision.gameObject.tag == "Grass")
{
sr.sprite = birds;
isDefentUI.SetActive(true);
Invoke("ReturnMenu", 3);//如果游戏结束返回主界面
}
}
private void ReturnMenu()
{
SceneManager.LoadScene(1);
}
}
O código do plano de fundo
O plano de fundo move-se para a esquerda com o tempo
Observe aqui que todo o plano de fundo deve se mover.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class backgrad : MonoBehaviour
{
public float speed = 2f;//移动速度
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
transform.Translate(Vector3.left * speed * Time.deltaTime);
}
}
O loop do plano de fundo
Quando o campo de visão da câmera se move para fora do plano de fundo, aciona o gatilho no segundo plano de fundo e o primeiro plano de fundo se move atrás do terceiro plano de fundo.
//背景的循环
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Pipe : MonoBehaviour
{
void Update()
{
}
public void PipeMove()
{
float move_y = Random.Range(1,8);
this.transform.localPosition = new Vector2(this.transform.localPosition.x, move_y);
}
}
//触发检测
using System.Collections.Generic;
using UnityEngine;
public class trige : MonoBehaviour
{
public Transform GetTransform;
public void OnTriggerEnter2D(Collider2D other)
{
if(other.tag=="Bird")
{
Transform tf = Newcamer.newcamera.tf;
GetTransform.position = new Vector2(GetTransform.position.x+71, GetTransform.position.y);
Newcamer.newcamera.tf = GetTransform;
}
}
}
Implementação do menu principal
Interface do menu principal (versão simplificada)
Código de imagem
para seleção e confirmação
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Image : MonoBehaviour
{
public Transform poseone;
public Transform posetwo;
private float h = 1;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.W))
{
h = 1;
transform.position = poseone.position;
}
else if (Input.GetKeyDown(KeyCode.S))
{
h = 2;
transform.position = posetwo.position;
}
if (Input.GetKeyDown(KeyCode.Space) && h == 1)
{
SceneManager.LoadScene(0);//跳到游戏界面
}
}
}