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>))); }
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); }
/// <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);
/// <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);
/// <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);
/// <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);
/// <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);
public void unregisterMe(AtomBaseVariable me) { unregisterMe((AtomVariable <T, P, E1, E2, F>)me); }