U4S2SL2——复用数据

使用预设体对象可能存在的内存浪费问题

对于只用不变的数据,以面向对象的思想去声明对象类是可能存在内存浪费的问题的

我们以子弹对象为例
在以前,子弹对象挂载子弹脚本,子弹脚本包含子弹诸如移动速度和攻击力等数据,然后通过Resources​等手段来在场景上创建子弹预设体
这样每个子弹都会有自己的子弹类对象,每个对象都会占用自己的内存,然而这些子弹脚本的数据其实都是相同且不变的
因此没有必要让子弹对象都分配多个的内存,我们完全可以让所有子弹对象共享一个子弹数据

1
2
3
4
5
6
7
8
9
10
11
12
using UnityEngine;

public class Bullet : MonoBehaviour
{
public float speed;
public int atk;

void Update()
{
this.transform.Translate(speed * Time.deltaTime * Vector3.forward);
}
}

利用ScriptableObject数据对象更加节约内存

对于不同对象,使用相同数据时,我们可以使用ScriptableObject来节约内存

1
2
3
4
5
6
7
8
using UnityEngine;

[CreateAssetMenu(fileName = "BulletInfo", menuName = "ScriptableObject/BulletInfo")]
public class BulletInfo : ScriptableObject
{
public float speed;
public int atk;
}
1
2
3
4
5
6
7
8
9
10
11
using UnityEngine;

public class Bullet : MonoBehaviour
{
public BulletInfo info;

void Update()
{
this.transform.Translate(info.speed * Time.deltaTime * Vector3.forward);
}
}

再为预设体关联这个BulletInfo​,就可以在生成多个预设体但仍然共同使用一个BulletInfo​对象

我们可以通过下面的代码来观察是否所有的子弹都被加速(都被加速则说明它们共享相同的数据)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using UnityEngine;

public class Lesson6 : MonoBehaviour
{
public BulletInfo info;

void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
info.speed += 1;
}
}
}