Unity2D 赛车小游戏教程

2024-09-12 18:59:32 浏览数 (3)

本教程涉及到Unity常用组件、常用方法等核心知识点,掌握本教程相关知识后你基本就算入门Unity了

1.需求分析

  • 玩家通过点击屏幕上的向左、向右移动按钮控制红色小车左右移动避让黄色小车
  • 黄色小车在屏幕最上方随机生成后向下移动
  • 屏幕右上方分数跟随时间变化而变化
  • 红色小车与某一辆黄色小车碰撞则游戏结束,弹出游戏结束界面
  • 游戏结束界面上有本局游戏分数以及重新开始的按钮

2.代码实现

2.1 创建项目目录

  • Imags:静态图片
  • Prefabs:预设物体
  • Resources:动态资源
    • Audio:音频
  • Scenes:场景
  • Scripts:脚本

2.2 创建面板、小车、按钮等

2.3 按钮控制红色小车左右移动

创建游戏管理脚本GameManager.cs

代码语言:javascript复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour
{
    /// <summary>
    /// 游戏管理器实例
    /// </summary>
    public static GameManager insta;

    /// <summary>
    /// 主界面
    /// </summary>
    public MainPanel mainPanel;

    private void Awake()
    {
        insta = this;
    }

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

红色小车挂载脚本RedCar.cs

代码语言:javascript复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RedCar : MonoBehaviour
{
    /// <summary>
    /// 移动速度
    /// </summary>
    private int moveSpeed = 100;

    /// <summary>
    /// 移动方向
    /// </summary>
    public int moveDirection = 0;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        //屏幕范围内左右移动
        if (moveDirection == -1 && transform.localPosition.x <= -490) return;
        if (moveDirection == 1 && transform.localPosition.x >= 490) return;
        transform.localPosition  = new Vector3(moveDirection * moveSpeed * Time.deltaTime, 0, 0);
    }

    /// <summary>
    /// 碰撞显示结束界面
    /// </summary>
    /// <param name="collision"></param>
    private void OnTriggerEnter2D(Collider2D collision)
    {
        GameManager.insta.overPanel.ShowPanel();
    }
}

主界面挂载脚本MainPanel.cs,拖拽相应物体

代码语言:javascript复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class MainPanel : MonoBehaviour
{
    /// <summary>
    /// 红色小车物体
    /// </summary>
    public RedCar redCar;

    /// <summary>
    /// 分数文本
    /// </summary>
    public Text scoreText;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    /// <summary>
    /// 点击按钮向左移动
    /// </summary>
    public void OnLeftMoveClick()
    {
        redCar.moveDirection = -1;
    }
    
    /// <summary>
    /// 点击按钮向右移动
    /// </summary>
    public void OnRightMoveClick()
    {
        redCar.moveDirection = 1;
    }
}

2.4 黄色小车自动向下移动

黄色小车挂载脚本YellowCar.cs

代码语言:javascript复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class YellowCar : MonoBehaviour
{
    /// <summary>
    /// 移动速度
    /// </summary>
    private int moveSpeed = 100;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.localPosition -= new Vector3(0, moveSpeed * Time.deltaTime, 0);//向下移动
        if(transform.localPosition.y <= -1060) Destroy(gameObject);//如果移动到屏幕最底端则自动销毁
    }
}

2.5 红色小车与黄色小车碰撞则游戏结束

红色小车挂载组件Box Collider 2D和Rigidbody 2D

黄色小车挂载组件Box Collider 2D

结束界面挂载脚本OverPanel.cs

代码语言:javascript复制
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class OverPanel : MonoBehaviour
{
    /// <summary>
    /// 分数文本
    /// </summary>
    public Text scoreText;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    /// <summary>
    /// 显示面板
    /// </summary>
    public void ShowPanel()
    {
        Time.timeScale = 0f;//游戏暂停
        gameObject.SetActive(true);
    }

    /// <summary>
    /// 点击按钮重新开始游戏
    /// </summary>
    public void OnRestartClick()
    {
        Time.timeScale = 1f;//游戏恢复
        gameObject.SetActive(false);
        SceneManager.LoadScene(0);
    }
}

GameManager.cs新增结束界面变量

代码语言:javascript复制
public class GameManager : MonoBehaviour
{
    /// <summary>
    /// 游戏管理器实例
    /// </summary>
    public static GameManager insta;

    /// <summary>
    /// 主界面
    /// </summary>
    public MainPanel mainPanel;

    /// <summary>
    /// 结束界面
    /// </summary>
    public OverPanel overPanel;

    ...

2.6 更新界面分数

主界面

代码语言:javascript复制
...
    
public class MainPanel : MonoBehaviour
{
    /// <summary>
    /// 红色小车物体
    /// </summary>
    public RedCar redCar;

    /// <summary>
    /// 分数文本
    /// </summary>
    public Text scoreText;

    /// <summary>
    /// 分数数值
    /// </summary>
    public int score;

    /// <summary>
    /// 开始时间
    /// </summary>
    private float startTime;

    // Start is called before the first frame update
    void Start()
    {
        startTime = Time.time;
    }

    // Update is called once per frame
    void Update()
    {
        //更新分数
        score = (int)(Time.time - startTime);
        scoreText.text = "分数:"   score;
    }

    ...

结束界面

代码语言:javascript复制
...

public class OverPanel : MonoBehaviour
{
    /// <summary>
    /// 分数文本
    /// </summary>
    public Text scoreText;

    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        scoreText.text = "分数:"   GameManager.insta.mainPanel.score;
    }

...

2.7 通过预设随机生成黄色小车

创建黄色小车根目录

代码语言:javascript复制
...

    /// <summary>
    /// 创建黄色小车上一次时间
    /// </summary>
    private float lastTime;

    /// <summary>
    /// 黄色小车物体预设
    /// </summary>
    public GameObject preYellowCarGo;

    /// <summary>
    /// 黄色小车根目录
    /// </summary>
    public GameObject yellowCarRootGo;

    // Start is called before the first frame update
    void Start()
    {
        startTime = Time.time;
        lastTime = Time.time;
    }

    // Update is called once per frame
    void Update()
    {
        //更新分数
        score = (int)(Time.time - startTime);
        scoreText.text = "分数:"   score;
        
        //每过3秒生成一辆黄色小车
        if(Time.time - lastTime >= 3f)
        {
            CreateYellowCar();
            lastTime = Time.time;
        }
    }

    /// <summary>
    /// 点击按钮向左移动
    /// </summary>
    public void OnLeftMoveClick()
    {
        redCar.moveDirection = -1;
    }
    
    /// <summary>
    /// 点击按钮向右移动
    /// </summary>
    public void OnRightMoveClick()
    {
        redCar.moveDirection = 1;
    }

    /// <summary>
    /// 创建黄色小车
    /// </summary>
    private void CreateYellowCar()
    {
        //在x坐标为-490到490之间随机生成黄色小车
        GameObject yellowCarGo = Instantiate(preYellowCarGo, yellowCarRootGo.transform);
        int randomInt = Random.Range(-490, 490);
        yellowCarGo.transform.localPosition = new Vector3(randomInt, 1060, 0);
    }
}

2.8 添加音频

创建游戏中音频物体

代码语言:javascript复制
...

    /// <summary>
    /// 黄色小车根目录
    /// </summary>
    public GameObject yellowCarRootGo;

    /// <summary>
    /// 游戏进行中音频
    /// </summary>
    public AudioSource gameInAudioSource;

    // Start is called before the first frame update
    void Start()
    {
        startTime = Time.time;// 开始时间赋值
        lastTime = Time.time;// 创建黄色小车上一次时间赋值

        gameInAudioSource.Play();//播放游戏进行音乐
    }

...

创建游戏结束音频物体

代码语言:javascript复制
...

    /// <summary>
    /// 游戏技术音频
    /// </summary>
    public AudioSource gameOverAudioSource;

...

    /// <summary>
    /// 显示面板
    /// </summary>
    public void ShowPanel()
    {
        Time.timeScale = 0f;//游戏暂停
        gameObject.SetActive(true);

        //停止游戏进行音频,播放游戏结束音频
        if (GameManager.insta.mainPanel.gameInAudioSource.isPlaying)
        {
            GameManager.insta.mainPanel.gameInAudioSource.Stop();
        }
        gameOverAudioSource.Play();
    }

...

2.9 物体换皮

0 人点赞