首页 > 其他分享 >⭐ Unity 对象池的应用 Cube流星落

⭐ Unity 对象池的应用 Cube流星落

时间:2024-09-25 11:52:09浏览次数:11  
标签:Cube obj 对象 GameObject void Unity public 流星

此次Demo里生成一些 Cube 从天上往下掉,并且当它们掉到特定高度(例如 y 轴小于 0)时销毁。为了优化性能,避免频繁创建和销毁物体,使用 对象池(Object Pooling) 技术来复用这些 Cube。

先看一下效果 观察Cube的生成

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="FHWhgk0c-1727236017739" src="https://live.csdn.net/v/embed/426570"></iframe>

Cube对象池

 对象池管理器脚本

using System.Collections.Generic;
using UnityEngine;

public class ObjectPool : MonoBehaviour
{
    // Cube 预制体
    public GameObject cubePrefab;
    // 对象池大小
    public int poolSize = 10;
    // 用于存储 Cube 对象的列表
    private List<GameObject> pool;
    
    void Start()
    {
        // 初始化对象池
        pool = new List<GameObject>();

        for (int i = 0; i < poolSize; i++)
        {
            GameObject obj = Instantiate(cubePrefab);
            obj.SetActive(false);  // 初始化时设置为不活跃状态
            pool.Add(obj);
        }
    }

    // 从对象池中获取对象
    public GameObject GetObject()
    {
        foreach (var obj in pool)
        {
            if (!obj.activeInHierarchy)
            {
                obj.SetActive(true);  // 激活对象
                return obj;
            }
        }

        // 如果没有可用对象,可以选择扩展对象池
        GameObject newObj = Instantiate(cubePrefab);
        newObj.SetActive(true);
        pool.Add(newObj);
        return newObj;
    }

    // 将对象返回池中(实际上是禁用它)
    public void ReturnObject(GameObject obj)
    {
        obj.SetActive(false);  // 禁用对象
    }
}

 

Cube 下落逻辑

using UnityEngine;

public class FallingCube : MonoBehaviour
{
    public float fallSpeed = 2f;  // 下落速度
    public float minHeight = -1f; // 当 Cube 掉落到这个高度时消失

    private ObjectPool objectPool;

    void Start()
    {
        // 获取对象池的引用
        objectPool = FindObjectOfType<ObjectPool>();
    }

    void Update()
    {
        // 让物体下落
        transform.Translate(Vector3.down * fallSpeed * Time.deltaTime);

        // 如果物体高度小于 minHeight,将其返回对象池
        if (transform.position.y < minHeight)
        {
            objectPool.ReturnObject(gameObject);
        }
    }
}

 

创建控制器生成 Cube

using UnityEngine;

public class CubeSpawner : MonoBehaviour
{
    public ObjectPool objectPool;  // 对象池引用
    public float spawnInterval = 1f;  // Cube 生成的时间间隔
    public float spawnHeight = 5f;    // Cube 掉落的高度
    public Vector2 spawnArea = new Vector2(-5f, 5f);  // 生成的范围

    private float timeSinceLastSpawn;

    void Update()
    {
        timeSinceLastSpawn += Time.deltaTime;

        // 如果时间超过生成间隔,生成一个新的 Cube
        if (timeSinceLastSpawn >= spawnInterval)
        {
            SpawnCube();
            timeSinceLastSpawn = 0f;
        }
    }

    void SpawnCube()
    {
        // 从对象池中获取一个 Cube
        GameObject cube = objectPool.GetObject();

        // 随机设置生成位置
        float randomX = Random.Range(spawnArea.x, spawnArea.y);
        cube.transform.position = new Vector3(randomX, spawnHeight, 0f);
    }
}

设置场景步骤

  1. 创建空的 GameObject:Hierarchy 中创建一个空的 GameObject,命名为ObjectPoolManager。将 ObjectPool 脚本挂载到 ObjectPoolManager,并将 cubePrefab 设置为你的 Cube 预制体。

  2. 创建 CubeSpawner: 创建另一个空的 GameObject,命名为 CubeSpawner将 CubeSpawner 脚本挂载到 CubeSpawner。将 ObjectPoolManager 中的 ObjectPool 组件拖入 CubeSpawner 的 ObjectPool 引用槽中。

  3. Cube 预制体配置: 打开你的 Cube 预制体,将 FallingCube 脚本挂载到 Cube 上,并配置下落速度和销毁高度。

感谢大家的观看,您的点赞和关注是我最大的动力

不定时更新知识点和干货呦~

标签:Cube,obj,对象,GameObject,void,Unity,public,流星
From: https://blog.csdn.net/weixin_53501436/article/details/142519447

相关文章

  • 【Unity】绘制折线图和柱状图
    绘制折线图和柱状图,主要包括如下效果:背景网格的绘制;折线和拐点的绘制;长方形柱的绘制(柱宽可以修改);X/Y轴的标签绘制(标签的单位可以修改、X轴的间距可以修改);鼠标移动到折线拐点/长方形柱是显示对应数值Tooltip;成果展示Scene部分脚本部分定义折线图和柱状图的接口//折线......
  • 【unity进阶知识1】最详细的单例模式的设计和应用,继承和不继承MonoBehaviour的单例模
    文章目录前言一、不使用单例二、普通单例模式1、单例模式介绍实现步骤:单例模式分为饿汉式和懒汉式两种。2、不继承MonoBehaviour的单例模式2.1、基本实现2.2、防止外部实例化对象2.3、最终代码3、继承MonoBehaviour的单例模式3.1、基本实现3.2、自动创建和挂载单例脚本......
  • 【Unity】 HTFramework框架(五十六)MarkdownText:支持运行时解析并显示Markdown文本
    更新日期:2024年9月15日。Github源码:[点我获取源码]Gitee源码:[点我获取源码]索引MarkdownText支持的Markdown语法标题强调文本表格嵌入图像超链接使用MarkdownText设置项运行时属性解析使用ID模式嵌入图像MarkdownTextMarkdownText为UGUIText的扩展加强版,支持在运行时解析并显......
  • [干货] [非基础警告] Unity 发布-订阅模式下的事件中心设计
    本文师承于唐老师,但是修改了一些代码,采用更加方便理解的方式设计 1.什么是事件中心2.可以比喻成冒险者工会的任务板子 任务板子上面有发布任务和任务完成两种基础情况2.1发布任务来个冒险者发布一个任务,就执行Pulishtask方法这个方法中包含了任务名字和完成后的需要......
  • 【Unity精品源码】JU TPS 3 – 完整的第三人称射击游戏模板
    ......
  • 【Unity】CinemachineVirtualCamera:实现第一人称视角控制
    相机视角的控制,利用CinemachineVirtualCamera插件(在packageManager中下载)实现键盘和鼠标控制第一人称视角。WASD前进后退向左向右,QE左右旋转;鼠标滚轮控制远近、俯仰和升降。另外还支持鼠标靠近边缘移动、鼠标拖拽等控制方式。成果展示Scene部分主相机增加CinemachineBrain组......
  • 14.STM32F103C8T6+CUBEMX+循迹模块(定时器计数、测速)
        学习完b站keysking老师的视频后写了这篇笔记,主要是学习定时器外部时钟。    用的是TIM2(有ETR,TIM3和TIM4都没有)一、cubemx配置(没加无上限计数)1、开TIM2    选了外部时钟模式1,借助从模式ETR1;        下面改数值15是输入滤波器,因为抖动......
  • 10.STM32F103C8T6+CUBEMX+AHT20
            记录学习过程,看的是b站keysking的视频一、配置cubemx1、打开I2C1,设置模式2、打开串口23、生成文件二、写代码1、新建.c.h文件,注意要在对应的文件夹下2、对照AHT20手册进行写        把文字对应的注释在后面了,注意HAL_I2C_Master_Transmit......
  • 【unity开发】以OPPO手机为例,如何连接安卓设备并调试unity程序
    1.有线调试下面全程以oppo手机为例:1.打开手机开发者模式设置->关于手机->版本信息->狂点版本号直到弹出提示打开开发者模式即可2.打开USB调试打开开发者模式之后在设置->其他设置->开发者选项->USB调试打开即可3.USB数据线连接使用USB数据线连接你的手机和电脑,并确保USB......
  • Android平台Unity3D下如何同时播放多路RTMP|RTSP流?
    技术背景好多开发者,提到希望在Unity的Android头显终端,播放2路以上RTMP或RTSP流,在设备性能一般的情况下,对Unity下的RTMP|RTSP播放器提出了更高的要求。实际上,我们在前几年发布Unity下直播播放模块的时候,就已经支持了Android多实例播放RTMP|RTSP,随着大家对这块的技术诉求和性能要求越......