Создать систему отмены и повтора в Unity - PullRequest
0 голосов
/ 02 ноября 2019

Мне не терпится построить простую игру в Unity3D, где пользователь может размещать модели на сцене, удалять и перемещать их.

Я построил базовую часть, но теперь я хочу добавить систему отмены и возврата. Отменить движение легко (просто сохраняя предыдущую позицию), но я не уверен, как отменить / повторить создание или удаление объекта.

В настоящее время я удаляю его, используя метод Destroy, и он работает так, как яхотеть. Но как можно было отменить это?

Я думал об отключении GameObject и повторной активации его при отмене, но я не уверен, что это будет полезно для памяти.

Моя игра нацеленадля младших компьютеров только с 4 ГБ оперативной памяти и слабым процессором i3.

Вы знаете способ реализации отмены удаления объектовo

Заранее спасибо

1 Ответ

0 голосов
/ 03 ноября 2019

Как кто-то упомянул в комментариях, 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())

Единственная реальная трудность здесь заключается в том, как вы собираетесь хранить информацию и как вы собираетесь передать ее во вновь созданнуюобъект.

...