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

相关推荐
wangjialelele8 小时前
Linux中的进程管理
java·linux·服务器·c语言·c++·个人开发
历程里程碑8 小时前
普通数组----轮转数组
java·数据结构·c++·算法·spring·leetcode·eclipse
晔子yy8 小时前
如何设计让你的程序同时处理10w条数据
java
Yvonne爱编码8 小时前
链表高频 6 题精讲 | 从入门到熟练掌握链表操作
java·数据结构·链表
lpfasd1238 小时前
物联网后端岗位java面试题
java·物联网·php
毕设源码李师姐8 小时前
计算机毕设 java 基于 java 的图书馆借阅系统 智能图书馆借阅综合管理平台 基于 Java 的图书借阅与信息管理系统
java·开发语言·课程设计
忆~遂愿8 小时前
Runtime 上下文管理:计算实例的生命周期、延迟最小化与上下文切换优化
java·大数据·开发语言·人工智能·docker
powerfulhell8 小时前
寒假python作业5
java·前端·python
1尢晞18 小时前
Java学习
java·开发语言
阿杰真不会敲代码8 小时前
Mybatis-plus入门到精通
java·tomcat·mybatis