private void FixedUpdate() { physicsInteractionsCounter = 0; for (int i = 0; i < activeContinuousInteractionResults.Length; i++) { IContinuousInteractionResult c = activeContinuousInteractionResults[i]; if (c == null) { continue; } if (!c.IsAlive) { c.Dispose(); activeContinuousInteractionResults[i] = null; activeContinuousInteractionKeys.Remove(c.Key); currentActiveContinuousInteractionCount = Mathf.Clamp(currentActiveContinuousInteractionCount - 1, 0, _activeContinuousInteractions); } else { c.FixedUpdate(); } } }
/// <summary> /// Adds or updates the given continuous interaction result to the active continuous interaction results, if able. /// </summary> /// <param name="impactObject">The impact object the result is being sent from.</param> /// <param name="result">The new continuous interaction result.</param> public void AddOrUpdateContinuousInteractionResult(IImpactObject impactObject, IContinuousInteractionResult result) { IContinuousInteractionResult existing = findContinuousInteractionResult(result.Key); if (existing != null) { existing.KeepAlive(result); result.Dispose(); } else { addContinuousInteractionResult(impactObject, result); } }
private void addContinuousInteractionResult(IImpactObject impactObject, IContinuousInteractionResult continuousInteractionResult) { for (int i = 0; i < activeContinuousInteractionResults.Length; i++) { if (activeContinuousInteractionResults[i] == null) { activeContinuousInteractionResults[i] = continuousInteractionResult; currentActiveContinuousInteractionCount++; activeContinuousInteractionKeys.Add(continuousInteractionResult.Key); continuousInteractionResult.Process(impactObject); return; } } continuousInteractionResult.Dispose(); }
private void OnDestroy() { //Dispose of any active continuous interactions for (int i = 0; i < activeContinuousInteractionResults.Length; i++) { IContinuousInteractionResult c = activeContinuousInteractionResults[i]; if (c != null) { c.Dispose(); } } //Clear the instance //This won't do anything if the active instance is not this ImpactManagerInstance.ClearInstance(this); }
/// <summary> /// Process a continuous interaction using the interaction data, an Impact Material, and an optional Impact Object that the interaction originated from. /// </summary> /// <param name="interactionData">The interaction data to process.</param> /// <param name="impactMaterial">The Impact Material to get interaction results from.</param> /// <param name="impactObject">An optional Impact Object that the interaction originated from.</param> public void ProcessContinuousInteraction <T>(T interactionData, IImpactMaterial material, IImpactObject impactObject) where T : IInteractionData { int resultCount = material.GetInteractionResultsNonAlloc(interactionData, InteractionResultBuffer); for (int i = 0; i < resultCount; i++) { IContinuousInteractionResult result = InteractionResultBuffer[i] as IContinuousInteractionResult; //result is not a continuous interaction, so simply Process it. if (result == null) { InteractionResultBuffer[i].Process(impactObject); } //Otherwise update an existing continuous interaction or add a new one. else { AddOrUpdateContinuousInteractionResult(impactObject, result); } } }
/// <summary> /// Adds or updates the given continuous interaction result to the active continuous interaction results, if able. /// </summary> /// <param name="impactObject">The impact object the result is being sent from.</param> /// <param name="result">The new continuous interaction result.</param> public static void AddOrUpdateContinuousInteractionResult(IImpactObject impactObject, IContinuousInteractionResult result) { ImpactManager instance = GetInstance(); instance.AddOrUpdateContinuousInteractionResult(impactObject, result); }