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脚本化对象来制作一个简单的对象池的更多相关文章

  1. Unity3D游戏开发从零单排(四) - 制作一个iOS游戏

    提要 此篇是一个国外教程的翻译,尽管有点老,可是适合新手入门. 自己去写代码.debug,布置场景,能够收获到非常多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一 ...

  2. PureMVC和Unity3D的UGUI制作一个简单的员工管理系统实例

    前言: 1.关于PureMVC: MVC框架在很多项目当中拥有广泛的应用,很多时候做项目前人开坑开了一半就消失了,后人为了填补各种的坑就遭殃的不得了.嘛,程序猿大家都不喜欢像文案策划一样组织文字写东西 ...

  3. 实例学习SSIS(一)--制作一个简单的ETL包

    原文:实例学习SSIS(一)--制作一个简单的ETL包 导读: 实例学习SSIS(一)--制作一个简单的ETL包 实例学习SSIS(二)--使用迭代 实例学习SSIS(三)--使用包配置 实例学习SS ...

  4. TensorFlow练习13: 制作一个简单的聊天机器人

    现在很多卖货公司都使用聊天机器人充当客服人员,许多科技巨头也纷纷推出各自的聊天助手,如苹果Siri.Google Now.Amazon Alexa.微软小冰等等.前不久有一个视频比较了Google N ...

  5. 手把手制作一个简单的IDEA插件(环境搭建Demo篇)

    新建IDEA插件File --> new --> Project--> Intellij PlatForm Plugin-->Next-->填好项目名OK 编写插件新建工 ...

  6. 如何使用AEditor制作一个简单的H5交互页demo

    转载自:http://www.alloyteam.com/2015/06/h5-jiao-hu-ye-bian-ji-qi-aeditor-jie-shao/ 本教程演示如何使用AEditor制作一个 ...

  7. Java网络与多线程系列之1:实现一个简单的对象池

    前言 为什么要从对象池开始呢,先从一个网络IO操作的demo说起 比如下面这段代码,显而易见已经在代码中使用了一个固定大小的线程池,所以现在的重点在实现Runnble接口的匿名对象上,这个对象每次创建 ...

  8. 制作一个简单的WPF图片浏览器

    原文:制作一个简单的WPF图片浏览器 注:本例选自MSDN样例,并略有改动.先看效果: 这里实现了以下几个功能:1.  对指定文件夹下所有JPG文件进行预览2.  对选定图片进行旋转3.  对选定图片 ...

  9. 自己制作一个简单的操作系统二[CherryOS]

    自己制作一个简单的操作系统二[CherryOS] 我的上一篇博客 自己制作一个简单的操作系统一[环境搭建], 详细介绍了制作所需的前期准备工作 一. 一点说明 这个操作系统只是第一步, 仅仅是开机显示 ...

随机推荐

  1. 原生js标识当前导航位置(给当前导航一个className=active)

    导航html结构为: <div class="header2-nav"> <a href="index.html">首页</a&g ...

  2. Ch07 包和引入 - 练习

    1. 编写示例程序,展示为什么  package com.horstmann.impatient  不同于 package com package horstmann package impatien ...

  3. NABCD分析---校园服务

    N(需求): 大学生活中,很多琐碎的小事浪费同学时间精力.我们的APP本着为同学服务的宗旨,解决生活中各方面的问题,同学们可以在APP上发布各种信息,例如兼职,二手买卖等等. A(做法): 用户打开A ...

  4. /etc/resolv.conf

    /etc/resolv.conf它是DNS客户机配置文件,用于设置DNS服务器的IP地址及DNS域名,还包含了主机的域名搜索顺序.该文件是由域名解析 器(resolver,一个根据主机名解析IP地址的 ...

  5. git反悔

    Checkout checkout命令用于从历史提交(或者暂存区域)中拷贝文件到工作目录,也可用于切换分支. ![](./_image/2016-07-14 21-26-37.jpg?r=49) ![ ...

  6. mac & ip

    mac 解决本地网络机器的通信 ip 解决不同网络间主机的通信

  7. qemu创建vm和vcpu进入kvm的流程

    kvm是一个内核模块,它实现了一个/dev/kvm的字符设备来与用户进行交互,通过调用一系列ioctl函数可以实现qemu和kvm之间的切换. 1.qemu发起KVM_CREATE_VM的ioctl创 ...

  8. Python汉罗塔

    第一步代码: import turtle class Stack: def __init__(self): self.items = [] def isEmpty(self): return len( ...

  9. etcd v3 备份恢复

    备份数据: # ETCDCTL_API=3 etcdctl --endpoints localhost:2379 snapshot save snapshot.db 恢复数据: # ETCDCTL_A ...

  10. js encode方法

    js对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent 1 ...