/// <summary> /// Based on current state, either deactivates this UnityCurve, activates this UnityCurve, or switches to a curve while already active. /// </summary> /// <param name="curveToChangeTo">The desired curve to change to. If null, deactivates this UnityCurve.</param> public void ChangeToCurve(Curve curveToChangeTo) { // Deactivate this UnityCurve once we hit start index if (curveToChangeTo == null && Active) { Deactivate(); } // Check if this UnityCurve has not been activated yet if (curveToChangeTo != null && !Active) { Activate(curveToChangeTo); } // Normal case: deactivate current curve and activate next if (curveToChangeTo != null && Active) { PreviousCurveValue = Value; CurrentCurve.Deactivate(); CurrentCurve = curveToChangeTo; CurrentCurve.Activate(); CurrentCurveValue = 0; CurrentCurveTime = 0; } }
//met à jour les positions des sliders sur l'interface private void UpdateSliders() { //Nettoyage des sliders foreach (BoxSlider slider in sliders) { Destroy(slider.gameObject); } sliders = new List <BoxSlider>(); List <Vector2> keys = CurrentCurve.GetKeys(); foreach (Vector2 key in keys) { GameObject sliderObj = Instantiate(sliderPref, transform); BoxSliderKey boxSlider = sliderObj.GetComponent <BoxSliderKey>(); sliderObj.SetActive(EditCurve); Vector2 keyScreen = CurveToScreen(key); boxSlider.ValueX = keyScreen.x; boxSlider.ValueY = keyScreen.y; boxSlider.editableCurve = this; sliders.Add(boxSlider); } }
//récupère la position de la souris pour déterminer si il faut afficher la nouvelle clé, et la créer private void ProcessMouseInput() { Vector2 mouseScreenPos = Input.mousePosition; Vector2 mouseLocalPos = Rect.PointToNormalized(rect.rect, rect.InverseTransformPoint(mouseScreenPos)); //la position du marker, dans le repère local Vector2 keyMarkerPos = new Vector2( mouseLocalPos.x, CurveToScreenY(CurrentCurve.Get(mouseLocalPos.x * TimeSpan)) ); bool canAddKey = Mathf.Abs(mouseLocalPos.y - keyMarkerPos.y) < distToAddKey; foreach (Vector2 key in CurrentCurve.GetKeys()) { // canAddKey = canAddKey && (mouseLocalPos - CurveToScreen(key) ).sqrMagnitude > distToAddKey * distToAddKey; canAddKey = canAddKey && Mathf.Abs(mouseLocalPos.x - CurveToScreen(key).x) > distToAddKey; //??? } AddKeyMarker.SetActive(canAddKey); if (canAddKey) { AddKeyMarker.transform.localPosition = Rect.NormalizedToPoint(rect.rect, keyMarkerPos); if (Input.GetMouseButtonDown(0)) { AddKey(ScreenToCurve(keyMarkerPos)); } } }
/// <summary> /// Dectivates this UnityCurve and ends curve modulation. /// Resets all variables. /// </summary> public void Deactivate() { CurrentCurve.Deactivate(); CurrentCurve = null; CurrentCurveTime = 0; TotalCurveTime = 0; PreviousCurveValue = defaultValue; CurrentCurveValue = 0; deactivationEvent.Invoke(); }
//supprime un slider public void RemoveSlider(BoxSlider slider) { int id = sliders.IndexOf(slider); sliders.Remove(slider); Destroy(slider.gameObject); CurrentCurve.RemoveKeyAt(id); UpdateLineRender(); }
//met à jour l'affichage de la courbe private void UpdateLineRender() { if (rend == null) { return; } for (int i = 0; i < rend.Points.Length; i++) { rend.Points[i].y = CurveToScreenY(CurrentCurve.Get(rend.Points[i].x * TimeSpan)); } rend.SetAllDirty(); }
//applique les modifs depuis le slider vers la courbe, et met a jour l'affichage public void UpdateCurveKey(BoxSlider changedSlider) { //tri de la liste des sliders, et conservation des indice avant et après le tri int oldId = sliders.IndexOf(changedSlider); sliders.Sort(CompSliders); int newId = sliders.IndexOf(changedSlider); if (oldId > newId) { int tmp = oldId; oldId = newId; newId = tmp; } for (int id = oldId; id <= newId; id++) { BoxSliderKey currentSlider = sliders[id].GetComponent <BoxSliderKey>(); Vector2 keyPos = ScreenToCurve(new Vector2(currentSlider.ValueX, currentSlider.ValueY)); CurrentCurve.ChangeKeyById(id, keyPos); } UpdateLineRender(); }
//ajoute une clé a la courbe et met a jour l'affichage public void AddKey(Vector2 key) { CurrentCurve.AddKey(key); UpdateSliders(); UpdateLineRender(); }