Ejemplo n.º 1
0
    public void UnregisterObject(SaveableBehaviour obj)
    {
        if (_currentObjects.ContainsKey(obj.GlobalId))
        {
            _currentObjects.Remove(obj.GlobalId);
        }

        Debug.Log(obj.name + " was unregistered with id " + obj.GlobalId);
    }
Ejemplo n.º 2
0
    public void RegisterObject(SaveableBehaviour obj)
    {
        obj.Init(_objectCount++);

        if (!_currentObjects.ContainsKey(obj.GlobalId))
        {
            _currentObjects.Add(obj.GlobalId, obj);
        }

        Debug.Log(obj.name + " was registered with id " + obj.GlobalId);
    }
Ejemplo n.º 3
0
    public void OnTimeScrolled(int time)
    {
        // Восстанавливаем состояние на данное время
        if (_timeline.Length < time || _timeline[time] == null || time == _timeTick)
        {
            return;
        }

        Dictionary <int, object> selectedFrame = _timeline[time];

        // Сначала удалим ненужные объекты
        foreach (int key in _currentObjects.Keys.ToList()) // Маленький лайфхак, чтобы не нарваться на эксепшн о попытке изменения коллекции в foreach
        {
            if (!selectedFrame.ContainsKey(key))
            {
                Destroy(_currentObjects[key].gameObject);
                _currentObjects.Remove(key);
            }
        }

        foreach (KeyValuePair <int, object> kvp in selectedFrame)
        {
            if (!_currentObjects.ContainsKey(kvp.Key))
            {
                SaveableBehaviour b = null;

                switch (SaveableBehaviour.DefineType(kvp.Value))
                {
                case ObjectType.Goblin:
                    if (_enemyManager != null)
                    {
                        b = _enemyManager.SpawnEnemy(Vector3.zero);
                    }
                    break;

                case ObjectType.Cannon:
                    // Напомню, пушка в динамике не создаётся.
                    break;

                case ObjectType.Bullet:
                    // На данный момент тут отсутствует что-то типа BulletSpawnera, поэтому приходится создавать вручную
                    // Но в теории можно, например, обращаться к скрипту типа CannonBehaviour и дёргать
                    // у него метод CreateBullet, который вернёт gameObject пули
                    GameObject go = GameObject.Instantiate(_bulletPrefab);
                    b = go.GetComponent <SaveableBehaviour>();
                    break;

                default: Debug.LogError("Saved data for id " + kvp.Key + "can't be defined!");
                    break;
                }

                if (b != null)
                {
                    b.GlobalId = kvp.Key;
                    _currentObjects.Add(kvp.Key, b);
                }
            }
        }

        // Сделаем сначала SetState
        foreach (KeyValuePair <int, SaveableBehaviour> pair in _currentObjects)
        {
            pair.Value.SetState(selectedFrame[pair.Key]);
        }

        // Ииии LateSetState
        foreach (SaveableBehaviour behaviour in _currentObjects.Values)
        {
            behaviour.LateSetState();
        }

        _timeTick = time;
    }