Unity百游修炼(2)——Brick_Breaker详细制作全流程

一、项目简介

        Brick Breaker 是一款经典的打砖块游戏,本次案例将使用 Unity 引擎来实现该游戏的核心功能。

游戏画面如下:

Brick_ breaker


二、项目结构概览和前期准备

(1)在 Unity 项目视图中,我们可以看到几个重要的文件夹:

  • Audio存放音频文件,如子弹发射音效背景音乐
  • Picture:理论上存放游戏所需图片资源(比如地板图片材质砖块的图片材质)。
  • Prefab:预制体文件夹,包含 BulletWall 预制体方便在场景中实例化
  • Scenes:场景文件夹,当前仅有 SampleScene。
  • Scripts:脚本文件夹,存放控制游戏逻辑的 C# 脚本,如 Camera_FollowShoot

(2)导入资源操作:先在Project创建文件夹(便于管理不同资源),这里以Audio(音频)文件夹为例子,Import new asset,把需要的音频文件导入进来即可。其他的资源,比如导入图片也是一样

(3)导入预制体:bullet(子弹)和brick(砖块)是需要很多的,而且进行操作基本相同,所以他们作为预制体,便于实例化操作,或者统一操作。(这里我以子弹(球体)为例)直接把创建的球体,拖入到你在Project视图中你创建的Prefab文件夹中,即可出现子弹具有浅蓝色的图标

步骤一:在Hierarchy中创建相应的物体(Wall和Bullet)

步骤二:拖入到Project视图中创建的Prefab文件夹中,即可出现子弹具有浅蓝色的图标


三、核心脚本

(一)Shoot 脚本:该脚本主要负责子弹发射和音频控制。

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

public class Shoot : MonoBehaviour
{
    public GameObject bulletPrefab;
    public int bullect_Speed=50;
    public AudioSource bgmAudio;
    public AudioSource shootAudio;
    // Start is called before the first frame update
    void Start()
    {
        // 这里可以设置背景音乐循环播放
        bgmAudio.loop = true;
        // 开始播放背景音乐
        bgmAudio.Play();
    }

    // Update is called once per frame
    void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            shootAudio.Play();
            GameObject bullect=GameObject.Instantiate(bulletPrefab, transform.position, transform.rotation);
            Rigidbody rd= bullect.GetComponent<Rigidbody>();
            rd.velocity = new Vector3(0,0,-1)*bullect_Speed;
            // 播放发射声音

        }
        
    }
}

(二)Camera_Follow 脚本:该脚本用于控制相机跟随。

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

public class Camera_Follow : MonoBehaviour
{
    public float Move_Speed = 2;
    // Start is called before the first frame update
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        float f1= Time.deltaTime;
        float f2= Input.GetAxisRaw("Horizontal");
        float f3 = Input.GetAxisRaw("Vertical");
        transform.Translate(new Vector3(f2,f3,0)*f1* Move_Speed);
    }
}

四、制作步骤详细(核心)

1.导入资源:将音频文件、预制体等资源导入到对应的文件夹中。(在上方已说)

2.创建项目和场景:在场景中添加 基本对象。

步骤一:创建地面,Create——3D Object——Plane(创建完成记得修改名字,便于管理)


步骤二:设置地面大小以及个性化地面

步骤三:设置砖块(Brick)以及个性化砖块(利用复制和步移)

(1)Ctrl和shift先选中若干砖块(便于更快的形成砖墙)

(2)步移(Ctrl+移动):一次移动0.25个单位

(3)搭建好之后,将所有的砖块,统一放到一个空父类里面,便于管理

(4)将导入的图片直接拖放到prefab文件夹的Wall中即可,直接对砖块墙进行个性化。


3.编写脚本:创建 Shoot 和 Camera_Follow 脚本,实现功能。

(1)相机移动的原理:相机的transform组件中有translate方法可以控制位置变化,通过按键wasd会传入一个变化的值[-1,1],再将这个值*一定的倍数,那么就可以形成一个合适的速度,也就可以控制相机移动了。

(2)Shoot脚本实现鼠标左键发射原理:
        (1)检测鼠标左键被按下:

        Input.GetMouseButtonDown(0):会返回一个bool值(true或者false),如果为真,代表被按下。(0代表鼠标左键,1代表鼠标右键)

        (2)按下的瞬间要产生一个子弹:

        GameObject.Instantiate(bulletPrefab, transform.position, transform.rotation);

        Gameobject中有Instantiate()方法可以在指定位置,生成预制体实例

        (3)子弹还有以一定的速度发射到正前方

         我们创建一个物体接受(2)中每次创建的实例,然后选中这个物体的刚体组件,调用其属性velocity(速度),并给他一个速度即可。


4.挂载脚本和设置参数:将脚本挂载到相应的游戏对象上,并设置好脚本中的参数,如预制体引用、音频源等
(1)把脚本拖放到 Main Camera上即可

(2)设置音频

步骤一:在Main Camera中添加Audio source组件,然后在组件中添加导入的 射击音效

步骤二:然后创建一个空物体,和上面一样的操作添加Audio source组件,然后在组件中添加导入的 背景音效

步骤三:然后再选中Main Camera ,进行如图操作即可成功导入音频资源到物体上

步骤四:利用代码,在恰当的时间,启动音频的开关即可。


五、后续扩展

        目前该案例只是一个简单的雏形,后续可以添加砖块对象、碰撞检测、得分系统等功能,进一步完善 Brick Breaker 游戏。希望通过这篇博客,能帮助大家了解使用 Unity 制作 Brick Breaker 游戏的基本流程和核心逻辑

Unity中,如果你想将 `Transform` 数组中的位置信息添加到 `List<Vector3>` 列表中,你需要遍历 `Transform` 数组,并将其每个元素的位置(即 `.position` 属性)转换为 `Vector3` 类型并添加到列表里。 下面是一个简单的示例代码片段来展示如何完成这个操作: ```csharp using System.Collections.Generic; using UnityEngine; public class Example : MonoBehaviour { // 假设我们已经有一个 Transform[] 数组名为 transformsArray 和一个 List<Vector3> private void AddPositionsToList(Transform[] transformsArray, List<Vector3> vectorList) { foreach (var transform in transformsArray) { if(transform != null){ vectorList.Add(transform.position); } } } // 示例用法 void Start() { List<Vector3> positionVectors = new List<Vector3>(); Transform[] myTransformsArray = GetComponentsInChildren<Transform>(); // 获取子物体的 Transforms AddPositionsToList(myTransformsArray, positionVectors); Debug.Log("Position vectors count:" + positionVectors.Count); foreach(var pos in positionVectors) { Debug.Log(pos.ToString()); } } } ``` 此段代码首先定义了一个函数 `AddPositionsToList` 来处理从 `Transform` 数组向 `vectorList` 中添加位置数据的过程;然后通过调用该函数,在 Unity 的 `Start()` 方法里面实现了具体的使用场景。 请注意,这里假设所有 `Transform` 对象都有效并且具有合理的位置属性值。实际应用时可以根据需要增加额外检查逻辑以提高鲁棒性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值