Unity3D|-使用ScriptableObject脚本化对象来制作一个简单的对象池
ScriptableObject是一个用于生成单独Asset的结构。同时,它也能被称为是Unity中用于处理序列化的结构。
可以作为我们存储资源数据的有效方案。同时此资源可以作为我们AB包的有效资源!
ScriptableObject的特点:
- 不需要绑定到物体对象。
- 存放于编辑器或者作为一种资源存储。
- 操作方便,可视化动态修改。
- 读取数据方便,ScriptableObject已经是可序列化的数据。
- 可以在项目之间很好的复用而不会丢失数据。
注意的点
- 制作ScriptableObject,为了制作
ScriptableObject,继承ScriptableObject基类是首先要做的事情。这个时候,类名与Asset名必须要一样。另外,ScriptableObject的限制和MonoBehaviour是一样的。 - 实例化,通过
ScriptableObject.CreateInstance来生成ScriptableObject。使用new操作符来生成是不行的。理由和MonoBehaviour是一样的,Unity生成Object的时候必须经过序列化。 - 保存,实例化完成后是将Object作为Asset进行保存。通过
AssetDatabase.CreateAsset就能够生成Asset。 Asset的后缀名必须是.asset。如果是其他后缀名的话,Unity会无法识别。
GameObjectPoolList 继承自ScriptableObject,内容只有一个GameObjectPool类型的List,用于存储所有的池子
using UnityEngine;
using System.Collections;
using System.Collections.Generic; public class GameObjectPoolList : ScriptableObject
{
//继承自ScriptableObject 表示把类GameObjectPoolList变成可以自定义资源配置的文件
public List<GameObjectPool> poolList;
}
GameObjectPool 类是具体的池子,取对象的方法:遍历池子,找到第一个隐藏的对象将其可见并返回使用,找不到隐藏可用的对象时候就首先检查池子的对象数是否超过了最大容量,是的话就删除第一个对象,否则不作操作,接下来再创建一个新的游戏对象使用。
using UnityEngine;
using System.Collections;
using System;
using System.Collections.Generic; /// <summary>
/// 资源池
/// </summary>
[Serializable]
public class GameObjectPool {
[SerializeField]
public string name;
[SerializeField]
private GameObject prefab;
[SerializeField]
private int maxAmount; [NonSerialized]
private List<GameObject> goList = new List<GameObject>(); /// <summary>
/// 表示从资源池中获取一个实例
/// </summary>
public GameObject GetInst()
{
foreach (GameObject go in goList)
{
if (go.activeInHierarchy == false)
{
go.SetActive(true);
return go;
}
} if (goList.Count >= maxAmount)
{
GameObject.Destroy(goList[]);
goList.RemoveAt();
} GameObject temp = GameObject.Instantiate(prefab) as GameObject;
goList.Add(temp);
return temp;
}
}
最后是拓展编辑器的内容以及保存Asset
using UnityEngine;
using System.Collections;
using UnityEditor; public class PoolManagerEditor {
[MenuItem("Manager/Crate GameObjectPoolConfig")]
static void CreateGameObjectPoolList()
{
GameObjectPoolList poolList = ScriptableObject.CreateInstance<GameObjectPoolList>();
string path = PoolManager.PoolConfigPath;
AssetDatabase.CreateAsset(poolList,path);
AssetDatabase.SaveAssets();
}
}


参考博客:https://blog.csdn.net/xdestiny110/article/details/79678922
Unity3D|-使用ScriptableObject脚本化对象来制作一个简单的对象池的更多相关文章
- Unity3D游戏开发从零单排(四) - 制作一个iOS游戏
提要 此篇是一个国外教程的翻译,尽管有点老,可是适合新手入门. 自己去写代码.debug,布置场景,能够收获到非常多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一 ...
- PureMVC和Unity3D的UGUI制作一个简单的员工管理系统实例
前言: 1.关于PureMVC: MVC框架在很多项目当中拥有广泛的应用,很多时候做项目前人开坑开了一半就消失了,后人为了填补各种的坑就遭殃的不得了.嘛,程序猿大家都不喜欢像文案策划一样组织文字写东西 ...
- 实例学习SSIS(一)--制作一个简单的ETL包
原文:实例学习SSIS(一)--制作一个简单的ETL包 导读: 实例学习SSIS(一)--制作一个简单的ETL包 实例学习SSIS(二)--使用迭代 实例学习SSIS(三)--使用包配置 实例学习SS ...
- TensorFlow练习13: 制作一个简单的聊天机器人
现在很多卖货公司都使用聊天机器人充当客服人员,许多科技巨头也纷纷推出各自的聊天助手,如苹果Siri.Google Now.Amazon Alexa.微软小冰等等.前不久有一个视频比较了Google N ...
- 手把手制作一个简单的IDEA插件(环境搭建Demo篇)
新建IDEA插件File --> new --> Project--> Intellij PlatForm Plugin-->Next-->填好项目名OK 编写插件新建工 ...
- 如何使用AEditor制作一个简单的H5交互页demo
转载自:http://www.alloyteam.com/2015/06/h5-jiao-hu-ye-bian-ji-qi-aeditor-jie-shao/ 本教程演示如何使用AEditor制作一个 ...
- Java网络与多线程系列之1:实现一个简单的对象池
前言 为什么要从对象池开始呢,先从一个网络IO操作的demo说起 比如下面这段代码,显而易见已经在代码中使用了一个固定大小的线程池,所以现在的重点在实现Runnble接口的匿名对象上,这个对象每次创建 ...
- 制作一个简单的WPF图片浏览器
原文:制作一个简单的WPF图片浏览器 注:本例选自MSDN样例,并略有改动.先看效果: 这里实现了以下几个功能:1. 对指定文件夹下所有JPG文件进行预览2. 对选定图片进行旋转3. 对选定图片 ...
- 自己制作一个简单的操作系统二[CherryOS]
自己制作一个简单的操作系统二[CherryOS] 我的上一篇博客 自己制作一个简单的操作系统一[环境搭建], 详细介绍了制作所需的前期准备工作 一. 一点说明 这个操作系统只是第一步, 仅仅是开机显示 ...
随机推荐
- 使用jEnv在Mac/Linux环境配置多版本Java
jEnv 是什么? 先来看一下官方介绍 jEnv is a command line tool to help you forget how to set the JAVA_HOME environm ...
- js 获取鼠标的手势方向角度
需要获取鼠标的移动角度 1.mousedown 确定起始点 2.mousemove 确立相关点 3.先计算两点的斜率,然后根据三角函数和反三角函数.转换为角度 <!DOCTYPE html> ...
- windows 下面make的使用示例
---恢复内容开始--- 前面已经安装了windows下面的编译器g++和mingw32-make,下面就make做个示例说明 1.文档结构 |--src |--comm ...
- Oracle中对XMLType的简单操作(extract、extractvalue...)
Oracle中对XMLType的简单操作(extract.extractvalue...) 1.下面先创建一个名未test.xml的配置文件. <?xml version="1. ...
- C++ 赋值构造函数的返回值到底有什么用?且返回值是否为引用类型有什么区别吗?
首先定义类Person class Person{ public: string name; Person()=default; //默认构造函数 Person(string nam):name(na ...
- Grunt搭建自动化web前端开发环境--完整流程
Grunt搭建自动化web前端开发环境-完整流程 jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前 ...
- C# Unity的使用
Unity是微软推出的IOC框架, 使用这个框架,可以实现AOP面向切面编程,便于代码的后期维护,此外,这套框架还自带单例模式,可以提高程序的运行效率. 下面是我自己的案例,以供日后参考: 使用VS2 ...
- [转载来之雨松:NGUI研究院之为什么打开界面太慢(十三)]
本文固定链接: http://www.xuanyusong.com/archives/2799
- Ubuntu16.04安装Redis
前言 Redis是常用基于内存的Key-Value数据库,比Memcache更先进,支持多种数据结构,高效,快速.用Redis可以很轻松解决高并发的数据访问问题:作为实时监控信号处理也非常不错. 环境 ...
- 【kafka学习之一】 kafka初识
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4一.kafka是什么? (1)kafka是一个高吞吐的分部式消息系统.( ...