7.ScriptableObject应用-复用数据
7.1 知识点
使用预设体对象可能存在的内存浪费问题
- 对于只用不变的数据
- 以面向对象的思想去声明对象类是可能存在内存浪费的问题的
- 我们以子弹对象为例
创建Bullet脚本,声明必要的变量,挂载到一个球上拖到Inspector窗口下作为子弹预设体,以后创建子弹都是动态创建这个预制体
由于每个创建出来的子弹预设体都挂了子弹脚本,每个子弹脚本的成员变量都会占内存空间,会造成内存的浪费。像速度这种配置变量可以共享同一份内存空间的数据。
举例说明 利用ScriptableObject数据对象 更加节约内存
创建子弹信息类,继承ScriptableObject。添加特性,可以在Inspector窗口创建出来子弹信息数据文件。
[CreateAssetMenu()]
public class BulletInfo : ScriptableObject
{
public float speed;
public int atk;
}
在子弹预制体关联子弹信息数据文件,这样创建出来的每个子弹预制体都是共享同一个子弹信息数据文件了。通过控制子弹信息数据文件上的配置整体控制所有子弹。
在主脚本添加子弹信息变量,在外部关联同一个子弹信息数据文件。添加按下空格增加子弹信息数据文件速度的逻辑。由于和子弹预制体关联的是同一个数据文件,可以达到全局控制子弹速度的目的。即使发布也是共享同一份内存空间。
public BulletInfo bulletInfo;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
bulletInfo.speed += 1;
}
总结
- 对于不同对象,使用相同数据时
- 我们可以使用ScriptableObject来节约内存
7.2 知识点代码
Lesson07_ScriptableObject应用_复用数据
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson07_ScriptableObject应用_复用数据 : MonoBehaviour
{
public BulletInfo bulletInfo;
void Start()
{
#region 知识点一 使用预设体对象可能存在的内存浪费问题
//对于只用不变的数据
//以面向对象的思想去声明对象类是可能存在内存浪费的问题的
//我们以子弹对象为例
#endregion
#region 知识点二 举例说明 利用ScriptableObject数据对象 更加节约内存
#endregion
#region 总结
//对于不同对象,使用相同数据时
//我们可以使用ScriptableObject来节约内存
#endregion
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
bulletInfo.speed += 1;
}
}
Bullet
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Bullet : MonoBehaviour
{
public BulletInfo bulletInfo;
void Update()
{
this.transform.Translate(Vector3.forward * bulletInfo.speed * Time.deltaTime);
}
}
BulletInfo
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu()]
public class BulletInfo : ScriptableObject
{
public float speed;
public int atk;
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com