Unity 游戏开发之方块随机生成(三)

上接(二)今天实现,方块随机加载

一、导入资源

将方块资源放入项目目录

二、实现预加载方块资源(与方块背景不同的操作逻辑)

前文操作方块背景 直接拖入方块对象

新建空游戏对象 FruitSpawner,与方块背景同一层级

预加载对象 分两步 先拖入 游戏对象 变成游戏对象 再拖回 项目目录 变成预加载资源 颜色也会变(如果直接在项目目录下来回拖动 实现的是 资源的路径修改 未改变其抽象对象属性)

1、

拖回项目资源 新建一个目录 GameRes 放置 游戏预加载对象 两次转换

层级目录下 展现的是 游戏对象 (可以理解为抽象的)

项目目录下 展现的是 资源对象 (可以理解为实体的)

方块背景作为可重用对象,利用脚本后台遍历输出最佳。

那么方块作为要随机生成的资源,可能存在多样性,在多个资源的加载上采用转换游戏对象 在项目资源中预加载能节省很多时间。

三、编写随机脚本。

先定义方块属性,FruitItem.cs

复制代码
using UnityEngine;

/// <summary>
/// 水果脚本
/// </summary>
public class FruitItem : MonoBehaviour
{
    /// <summary>
    /// 行号
    /// </summary>
    public int rowIndex;
    /// <summary>
    /// 列号
    /// </summary>
    public int columIndex;
    /// <summary>
    /// 水果类型
    /// </summary>
    public int fruitType;

    /// <summary>
    /// 水果图片
    /// </summary>
    public GameObject fruitSpriteObj; 
    
    private Transform m_selfTransform;

    private void Awake()
    {
        m_selfTransform = transform;
    }

    /// <summary>
    /// 创建水果图片
    /// </summary>
    /// <param name="fruitType">水果类型</param>
    /// <param name="prefab">水果图片预设</param>
    public void CreateFruitBg(int fruitType, GameObject prefab)
    {
        if (null != fruitSpriteObj) return;
        this.fruitType = fruitType;
        fruitSpriteObj = Instantiate(prefab);
        fruitSpriteObj.transform.localScale = Vector3.one * GlobalDef.CELL_SIZE;
        fruitSpriteObj.transform.SetParent(m_selfTransform, false);
    }

    /// <summary>
    /// 设置坐标
    /// </summary>
    public void UpdatePosition(int rowIndex, int columIndex)
    {
        this.rowIndex = rowIndex;
        this.columIndex = columIndex;
        var targetPos = new Vector3((columIndex - GlobalDef.COLUM_COUNT / 2f) *     GlobalDef.CELL_SIZE + GlobalDef.CELL_SIZE / 2f, (rowIndex - GlobalDef.ROW_COUNT / 2f) * GlobalDef.CELL_SIZE + GlobalDef.CELL_SIZE / 2f, 0);
        m_selfTransform.localPosition = targetPos;
    } 
}

2、编写 FruitSpawner.cs 脚本 实现随机生成

复制代码
// FruitSpawner.cs

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

public class FruitSpawner : MonoBehaviour
{
    /// <summary>
    /// 水果预设
    /// </summary>
    public GameObject[] fruitPrefabs;

    /// <summary>
    /// 生成出来的水果二维数组
    /// </summary>
    public ArrayList fruitList;


    /// <summary>
    /// 水果的根节点
    /// </summary>
    private Transform m_fruitRoot;

    private void Awake()
    {
        m_fruitRoot = transform;
    }

    private void Start()
    {
        SpawnFruitArrayList();
    }

    /// <summary>
    /// 生成多行多列水果
    /// </summary>
    private void SpawnFruitArrayList()
    {
        fruitList = new ArrayList();
        for (int rowIndex = 0; rowIndex < GlobalDef.ROW_COUNT; ++rowIndex)
        {
            ArrayList temp = new ArrayList();
            for (int columIndex = 0; columIndex < GlobalDef.COLUM_COUNT; ++columIndex)
            {
                var item = AddRandomFruitItem(rowIndex, columIndex);
                temp.Add(item);
            }
            // 存到数组中
            fruitList.Add(temp);
        }
    }

    /// <summary>
    /// 随机一个水果
    /// </summary>
    private FruitItem AddRandomFruitItem(int rowIndex, int columIndex)
    {
        // 随机一个水果类型
        var fruitType = Random.Range(0, fruitPrefabs.Length);
        var item = new GameObject("item");
        item.transform.SetParent(m_fruitRoot, false);
        item.AddComponent<BoxCollider2D>().size = Vector2.one * GlobalDef.CELL_SIZE;
        var bhv = item.AddComponent<FruitItem>();
        bhv.UpdatePosition(rowIndex, columIndex);
        bhv.CreateFruitBg(fruitType, fruitPrefabs[fruitType]);
        return bhv;
    }
}

四、绑定函数到游戏对象,同时将预加载对象也绑定在函数对象下。

最后调试对象: 如果方块和方块背景 存在显示差异,可以观察定位坐标,XYZ;及缩放比例,调整一下。

相关推荐
程序员黑豆2 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
风流 少年2 小时前
Spring AI 2.0:Memory
java·后端·spring
码匠许师傅3 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
小席是个热心肠3 小时前
AI相关的自我学习
java·人工智能·学习
数智化管理手记6 小时前
海量数据如何沉淀有效数据资产?数据标准化治理方案如何搭建?
java·大数据·人工智能
cfm_29146 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
鲸采云SRM采购管理系统7 小时前
采购管理系统哪家好?2026最新测评对比
java·服务器·数据库
0x538 小时前
Java网络编程(二)
java·服务器·网络
Flittly8 小时前
【雕虫大技】Agent 动态 Skill 供应链安全加固(三):输出校验与治理闭环实战
java·spring boot·spring
Poo_Chai8 小时前
QT emit信号后完整处理流程,包括槽函数响应流程
java·开发语言·数据库