Как кто-то упомянул в комментариях, Premature optimization is the root of all evil.
.
Сначала используйте более простой метод и посмотрите, может ли он работать без нареканий, как задумано.
Если нужно, протестируйтеи используйте Profiler , чтобы определить, что подходит вам лучше всего.
Также, несколько хороших источников для чтения:
TLDR ;Если вы сосредоточитесь на оптимизации использования памяти, у вас могут возникнуть проблемы с производительностью. И наоборот.
Отмена вызова Destroy ()
Для отмены вызова Destroy()
простого решения для этого не существует.
Что вы можете сделать, этосохранить, какой тип объекта вы уничтожили, и информацию об объекте до того, как вы его уничтожили.
Например, у меня есть пуля, у которой есть несколько свойств, и я хочу, чтобы она сохранялась после отмены уничтожения.
Bullet.cs
public class Bullet : MonoBehaviour {
public BulletInfo BulletInfo { get; private set; }
private void Update() {
// Fly, etc.
}
public void InitalizeBullet(BulletInfo bulletInfo) {
BulletInfo = bulletInfo;
}
// ...
public void DisposeBullet() {
BulletUndoManager.Instance.AddDeletedBulletInfo(BulletInfo, transform.position);
Destroy(gameObject);
}
}
BulletInfo.cs
public class BulletInfo {
public float Speed { get; set; }
public float Damage { get; set; }
// Etc...
}
BulletUndoManager.cs
public class BulletUndoManager : MonoBehaviour {
#region Singleton
private static BulletUndoManager instance;
public static BulletUndoManager Instance {
get => instance;
}
#endregion
private struct DeletedBulletInfo {
public BulletInfo BulletInfo { get; private set; }
public Vector3 LastPosition { get; private set; }
public DeletedBulletInfo(BulletInfo bulletInfo, Vector3 lastPosition) {
BulletInfo = bulletInfo;
LastPosition = lastPosition;
}
}
Stack<DeletedBulletInfo> lastDeletedBullet;
[SerializeField, Tooltip("The prefab of the bullet")]
private Bullet bulletPrefab;
private void Awake() {
instance = this;
}
public void UndoBulletDeletion() {
if (lastDeletedBullet.Count > 0) {
DeletedBulletInfo lastDeletedBulletInfo = lastDeletedBullet.Pop();
var newBullet = Instantiate(bulletPrefab);
newBullet.InitalizeBullet(lastDeletedBulletInfo.BulletInfo);
newBullet.transform.position = lastDeletedBulletInfo.LastPosition;
}
}
public void AddDeletedBulletInfo(BulletInfo bulletInfo, Vector3 bulletLastPosition) {
lastDeletedBullet.Push(new DeletedBulletInfo(bulletInfo, bulletLastPosition));
}
}
Обратите внимание, что концепция примерно такая же, как отмена или повторение движения объекта.
Единственное существенное отличие состоит в том, что:
- Я храню что-то другое, кроме позиции. (В основном информация до уничтожения)
- Я передаю все данные, которые были сохранены, вновь созданному объекту. (Создано при отмене
Destroy()
)
Единственная реальная трудность здесь заключается в том, как вы собираетесь хранить информацию и как вы собираетесь передать ее во вновь созданнуюобъект.