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;及缩放比例,调整一下。

相关推荐
周杰伦_Jay2 小时前
【JVM深度解析】运行时数据区+类加载+GC+调优实战(附参数示例)
java·jvm·spring boot·分布式·架构·java-ee
松莫莫2 小时前
【Spring Boot 实战】使用 Server-Sent Events (SSE) 实现实时消息推送
java·spring boot·后端
SoleMotive.2 小时前
springai和langchain4j的区别
java
子超兄2 小时前
GC/OOM问题处理思路
java·jvm
麒qiqi2 小时前
【Linux 系统编程核心】进程的本质、管理与核心操作
java·linux·服务器
小坏讲微服务2 小时前
Spring Boot 4.0 整合 Kafka 企业级应用指南
java·spring boot·后端·kafka·linq
Data_agent2 小时前
京东获得京东商品详情API,python请求示例
java·前端·爬虫·python
迈巴赫车主2 小时前
蓝桥杯 20531黑客java
java·开发语言·数据结构·算法·职场和发展·蓝桥杯
ZePingPingZe2 小时前
Spring Boot常见注解
java·spring boot·后端