前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Unity2D 赛车小游戏教程

Unity2D 赛车小游戏教程

作者头像
90后小陈老师
发布2024-09-12 18:59:32
1190
发布2024-09-12 18:59:32
举报
文章被收录于专栏:技术杂谈
本教程涉及到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 物体换皮

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-09-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 90后小陈老师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.需求分析
  • 2.代码实现
    • 2.1 创建项目目录
      • 2.2 创建面板、小车、按钮等
        • 2.3 按钮控制红色小车左右移动
          • 2.4 黄色小车自动向下移动
            • 2.5 红色小车与黄色小车碰撞则游戏结束
              • 2.6 更新界面分数
                • 2.7 通过预设随机生成黄色小车
                  • 2.8 添加音频
                    • 2.9 物体换皮
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档