internal static SubInstanceLink CreateInstance(int id) { SubInstanceLink link = CreateInstance <SubInstanceLink>(); link.id = id; return(link); }
private bool IsDead() { bool somethingAlive = false; for (int s = 0; s < subInstanceLinks.Length; s++) { SubInstanceLink link = subInstanceLinks[s]; // Test if any particle system is running and alive if (link.particleSystem != null) { if (link.particleSystem.isPlaying) { link.particleSystem.Stop(); } if (subInstanceLinks[s].particleSystem.IsAlive()) { somethingAlive = true; } } // Hide mesh renderer if (link.meshRenderer != null) { link.meshRenderer.enabled = false; } for (int r = 0; r < link.meshRendererAll.Length; r++) { if (link.meshRendererAll[r] != null) { link.meshRendererAll[r].enabled = false; } } } return(!somethingAlive); }
public GameObject CreateRuntimeInstance() { GameObject gameObject = new GameObject(title + " Runtime Instance"); AbilityInstance instance = gameObject.AddComponent <AbilityInstance>(); m_Unlocked = m_DefaultLock; // Clone all phases to the ability instance for runtime use instance.phaseLists = new PhaseList[phaseLists.Length]; for (int p = 0; p < phaseLists.Length; p++) { instance.phaseLists[p] = phaseLists[p].Clone(); } // Copy all sub instance links to the ability instance instance.subInstanceLinks = new SubInstanceLink[subInstanceLinks.Length]; for (int s = 0; s < subInstanceLinks.Length; s++) { SubInstanceLink newLink = Instantiate(subInstanceLinks[s]); // Create subinstance obj GameObject linkObj; if (subInstanceLinks[s].obj == null) { // Create an empty game object linkObj = new GameObject(title + " (Sub Instance: " + subInstanceLinks[s].title + ")"); } else { // Instantiate the prefab given linkObj = Instantiate(subInstanceLinks[s].obj); linkObj.name = title + " (Sub Instance: " + subInstanceLinks[s].title + ")"; } // Set the parent to the ability instance linkObj.transform.SetParent(gameObject.transform); linkObj.transform.localPosition = Vector3.zero; // Give the generated object to the sub instance link newLink.obj = linkObj; newLink.CacheComponents(); // Push the sub instance link into the list of the instance instance.subInstanceLinks[s] = newLink; } // Clone all shared variables for the ability instance instance.sharedVariables = new SharedVariable[sharedVariables.Length]; for (int s = 0; s < sharedVariables.Length; s++) { instance.sharedVariables[s] = Instantiate(sharedVariables[s]); } List <SubInstanceLink> subInstanceLinksList = new List <SubInstanceLink>(subInstanceLinks); List <SharedVariable> sharedVariablesList = new List <SharedVariable>(sharedVariables); for (int l = 0; l < phaseLists.Length; l++) { for (int p = 0; p < phaseLists[l].phases.Length; p++) { // Redirecting sub instance links SubInstanceLink[] addingSubInstanceLinks = new SubInstanceLink[phaseLists[l].phases[p].runForSubInstances.Length]; for (int s = 0; s < addingSubInstanceLinks.Length; s++) { SubInstanceLink link = phaseLists[l].phases[p].runForSubInstances[s]; addingSubInstanceLinks[s] = instance.subInstanceLinks[subInstanceLinksList.IndexOf(link)]; } instance.phaseLists[l].phases[p].runForSubInstances = addingSubInstanceLinks; // Redirecting shared variables System.Type phaseType = phaseLists[l].phases[p].GetType(); FieldInfo[] allFields = phaseType.GetFields(); for (int f = 0; f < allFields.Length; f++) { if (allFields[f].FieldType.IsSubclassOf(typeof(SharedVariable))) { object value = allFields[f].GetValue(phaseLists[l].phases[p]); SharedVariable sharedVariable = value as SharedVariable; if (sharedVariable != null) { int index = sharedVariablesList.IndexOf(sharedVariable); allFields[f].SetValue(instance.phaseLists[l].phases[p], instance.sharedVariables[index]); } } if (allFields[f].FieldType.IsSubclassOf(typeof(SubVariable <>))) { object value = allFields[f].GetValue(phaseLists[l].phases[p]); MethodInfo cloneMethod = value.GetType().GetMethod("Clone", BindingFlags.Instance | BindingFlags.NonPublic); object clone = cloneMethod.Invoke(value, new object[] { }); allFields[f].SetValue(instance.phaseLists[l].phases[p], clone); } } } } instance.Initiate(); return(gameObject); }
internal void Cast(IAbilityUser originator, IAbilityUser target) { m_CachedID = originator.GetInstanceID() + ""; m_Originator = originator; m_Target = target; m_LastList = new Stack <int>(); m_LastList.Push(0); transform.position = Vector3.zero; for (int s = 0; s < subInstanceLinks.Length; s++) { SubInstanceLink link = subInstanceLinks[s]; // Set the correct spawn position switch (link.spawn) { case SubInstanceLink.Spawn.Originator: link.obj.transform.position = originator.GetCenter() + link.spawnOffset; break; case SubInstanceLink.Spawn.Target: link.obj.transform.position = target.GetCenter() + link.spawnOffset; break; case SubInstanceLink.Spawn.Zero: link.obj.transform.position = link.spawnOffset; break; } // Start particle system if (link.particleSystem != null) { link.particleSystem.Play(); } // Show mesh renderer if (link.meshRenderer != null) { link.meshRenderer.enabled = true; } for (int r = 0; r < link.meshRendererAll.Length; r++) { if (link.meshRendererAll[r] != null) { link.meshRendererAll[r].enabled = true; } } if (target != null) { link.direction = (target.GetCenter() - originator.GetCenter()).normalized; } else { link.direction = Vector3.zero; } subInstanceLinks[s].obj.SetActive(true); } for (int v = 0; v < sharedVariables.Length; v++) { sharedVariables[v].RestoreDefault(); } for (int p = 0; p < phaseLists.Length; p++) { DefineContext(phaseLists[p]); phaseLists[p].OnCast(); } isUpdating = true; }
internal void SetValue(SubInstanceLink link, object value) { this[link.id] = (T)value; }
internal object GetValue(SubInstanceLink link) { return(this[link.id]); }
private void DefineContext(SubInstanceLink subInstanceLink) { AbilityContext.subInstanceLink = subInstanceLink; }