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

相关推荐
JAVA面经实录9174 小时前
图解23种设计模式完整知识体系(Java后端面试完整版)
java·架构
会飞的大鱼人4 小时前
一文搞懂 Java HashSet:把它想成游乐园里只允许一次入场的盖章名单
java·开发语言·windows
AI_小站4 小时前
Loop Engineering又是啥?一文讲清企业Agent落地的四层工程进化论
java·人工智能·架构·prompt·大模型开发·智能体·大模型应用
jiay24 小时前
【.net10】顶级程序语句
java·开发语言
玖玥拾5 小时前
Unity 3D 笔记(十四)Unity/C# Socket 网络笔记3
服务器·网络·unity·c#
2601_953824615 小时前
【计算机毕业设计】基于Spring Boot的画师接稿平台设计与实现
java·spring boot·后端
小宋10216 小时前
不用学算法也能玩转 AI?普通 Java 程序员转 AI 应用开发路线
java·人工智能·重构
我是唐青枫6 小时前
Java Jetty 实战详解:从嵌入式 HTTP 服务到 Spring Boot 容器替换
java
带刺的坐椅6 小时前
当所有人都在用 TS/Python 写 Agent,我们为什么坚持 Java
java·ai·solon·codex·opencode·soloncode
Python私教6 小时前
Godot图片怎么导入?PNG、压缩、Mipmap与Reimport一次讲清
游戏引擎·godot