Пример #1
0
        public void SpawnItem(AtomBaseVariable itemData)
        {
            var itemDataCollection = (AtomCollection)itemData;
            var spawnedObject      = Instantiate(_prefabToSpawn, transform);
            var proxies            = spawnedObject.GetComponents <IVariableProxy>();

            void VarAddedHandler(AtomBaseVariable baseVar)
            {
                foreach (var proxy in proxies)
                {
                    if (proxy.key() == baseVar.Id)
                    {
                        proxy.registerMe(baseVar);
                    }
                }
            }

            void VarRemovedHandler(AtomBaseVariable baseVar)
            {
                foreach (var proxy in proxies)
                {
                    if (proxy.key() == baseVar.Id)
                    {
                        proxy.unregisterMe(baseVar);
                    }
                }
            }

            itemDataCollection.Added.Register(VarAddedHandler);
            itemDataCollection.Removed.Register(VarRemovedHandler);

            Action <AtomBaseVariable> itemDataRemovedHandler = default;

            itemDataRemovedHandler = (itemDataToBeRemoved) =>
            {
                if (itemDataToBeRemoved == itemData)
                {
                    itemDataCollection.Added.Unregister(VarAddedHandler);
                    itemDataCollection.Removed.Unregister(VarRemovedHandler);
                    _items.Removed.Unregister(itemDataRemovedHandler);

                    if (spawnedObject != null && spawnedObject.gameObject != null)
                    {
                        Destroy(spawnedObject.gameObject);
                    }
                }
            };
            _items.Removed.Register(itemDataRemovedHandler);
        }
        private void CreateFunction(AtomBaseVariable atomVariable)
        {
            var atomType   = atomVariable.BaseValue.GetType();
            var atomGetter = atomVariable.GetType().GetProperty("Value").GetMethod;

            var parameters = new Type[] { typeof(AtomBaseVariable) };
            var method     = new DynamicMethod($"GetAtomValue.{GetInstanceID()}", typeof(object), parameters);
            var generator  = method.GetILGenerator();

            generator.Emit(OpCodes.Ldarg_0);
            generator.Emit(OpCodes.Callvirt, atomGetter);
            generator.Emit(OpCodes.Box, atomType);
            generator.Emit(OpCodes.Ret);

            functions.Add((Func <AtomBaseVariable, object>)method.CreateDelegate(typeof(Func <AtomBaseVariable, object>)));
        }
Пример #3
0
        public void SetupHealthBar(AtomBaseVariable enemyData)
        {
            var enemyDataCollection = (AtomCollection)enemyData;
            var healthBar           = Instantiate(_healthBarPrefab).GetComponent <HealthBar>();

            healthBar.transform.SetParent(transform);

            IntVariable               health   = default;
            Vector3Variable           position = default;
            Action <Vector3>          positionChangedHandler = default;
            Action <AtomBaseVariable> varAddedHandler        = (AtomBaseVariable baseVar) =>
            {
                switch (baseVar.Id)
                {
                case "Health":
                    var healthVar = (IntVariable)baseVar;
                    health = healthVar;
                    healthBar.InitialHealth.Value = healthVar.InitialValue;
                    healthVar.Changed.Register(healthBar.HealthChanged);
                    break;

                case "Position":
                    var positionVar = (Vector3Variable)baseVar;
                    position = positionVar;
                    positionChangedHandler = (pos) =>
                    {
                        Vector2 viewportPos  = Camera.main.WorldToViewportPoint(pos);
                        Vector2 healthBarPos = new Vector2(
                            (viewportPos.x * _canvasRectTransform.sizeDelta.x) - (_canvasRectTransform.sizeDelta.x * 0.5f),
                            (viewportPos.y * _canvasRectTransform.sizeDelta.y) - (_canvasRectTransform.sizeDelta.y * 0.5f) + 38f
                            );
                        healthBar.GetComponent <RectTransform>().anchoredPosition = healthBarPos;
                    };
                    positionVar.Changed.Register(positionChangedHandler);
                    break;
                }
            };

            Action <AtomBaseVariable> varRemovedHandler = (AtomBaseVariable baseVar) =>
            {
                switch (baseVar.Id)
                {
                case "Health":
                    var healthVar = (IntVariable)baseVar;
                    healthVar.Changed.Unregister(healthBar.HealthChanged);
                    break;

                case "Position":
                    var positionVar = (Vector3Variable)baseVar;
                    positionVar.Changed.Unregister(positionChangedHandler);
                    break;
                }
            };

            enemyDataCollection.Added.Register(varAddedHandler);
            enemyDataCollection.Removed.Register(varRemovedHandler);

            Action <AtomBaseVariable> enemyDataRemovedHandler = default;

            enemyDataRemovedHandler = (enemyDataToBeRemoved) =>
            {
                if (enemyDataToBeRemoved == enemyData)
                {
                    enemyDataCollection.Added.Unregister(varAddedHandler);
                    enemyDataCollection.Removed.Unregister(varRemovedHandler);
                    _enemies.Removed.Unregister(enemyDataRemovedHandler);

                    if (healthBar != null && healthBar.gameObject != null)
                    {
                        if (health != null)
                        {
                            health.Changed.Unregister(healthBar.HealthChanged);
                        }
                        else if (position != null)
                        {
                            position.Changed.Unregister(positionChangedHandler);
                        }

                        Destroy(healthBar.gameObject);
                    }
                }
            };
            _enemies.Removed.Register(enemyDataRemovedHandler);
        }
Пример #4
0
 /// <summary>
 /// Divide Variable by Variable value.
 /// </summary>
 /// <param name="variable">Variable value to divide by.</param>
 public void DivideBy(AtomBaseVariable <int> variable) => DivideBy(variable.Value);
Пример #5
0
 /// <summary>
 /// Multiply variable by Variable value.
 /// </summary>
 /// <param name="variable">Variable with value to multiple by.</param>
 public void MultiplyBy(AtomBaseVariable <int> variable) => MultiplyBy(variable.Value);
Пример #6
0
 /// <summary>
 /// Subtract variable value from Variable.
 /// </summary>
 /// <param name="variable">Variable with value to subtract.</param>
 public void Subtract(AtomBaseVariable <int> variable) => Subtract(variable.Value);
Пример #7
0
 /// <summary>
 /// Add variable value to Variable.
 /// </summary>
 /// <param name="variable">Variable with value to add.</param>
 public void Add(AtomBaseVariable <int> variable) => Add(variable.Value);
Пример #8
0
 /// <summary>
 /// Set Alpha of Color by Variable value.
 /// </summary>
 /// <param name="variable">New alpha Variable value.</param>
 public void SetAlpha(AtomBaseVariable <float> variable) => SetAlpha(variable.Value);
Пример #9
0
 public void unregisterMe(AtomBaseVariable me)
 {
     unregisterMe((AtomVariable <T, P, E1, E2, F>)me);
 }