private void DestroyDistortionInstance(DistortionInstance delInstance) { delInstance.OnUpdate = null; // Clear reference delInstance.OnGetCenter = null; ResetSlot(delInstance.slotIndex); // Hide effect distortionSlot[delInstance.slotIndex] = null; // Reset record }
public void StartEffect(Func <Vector2> onGetCenter) { DistortionInstance instance = new DistortionInstance(); instance.timeLimited = 0.5f; instance.distance = 200; instance.Force = 0.1f; instance.Radius = 50f; instance.OnUpdate = OnUpdate; instance.OnGetCenter = onGetCenter; heatDistortion.TaskEnqueue(instance); }
void OnUpdate(DistortionInstance instance) { float progress = instance.timeElapsed / instance.timeLimited; float distance = instance.distance * distanceCurve.Evaluate(progress); float Force = instance.Force * forceCurve.Evaluate(progress); float Radius = instance.Radius * RradiusCurve.Evaluate(progress); heatDistortion.SetCenter(instance.slotIndex, instance.OnGetCenter()); heatDistortion.SetDistance(instance.slotIndex, distance); heatDistortion.SetForce(instance.slotIndex, Force); heatDistortion.SetRadius(instance.slotIndex, Radius); }
public void TaskEnqueue(DistortionInstance distotion) { foreach (int i in distortionSlot.Keys) { if (distortionSlot[i] == null) { // Assign data distotion.slotIndex = i; distortionSlot[i] = distotion; return; } } #if UNITY_EDITOR Debug.Log("HeatDistortion:: no Slots, cancel task"); #endif }