public void Flip(List <GameObject> chips, Transform stackTransform) { if (IsFlipping) //Can't start a new flip during a flip { return; } float sumLocalYPos = 0f; foreach (GameObject chip in chips) { sumLocalYPos += chip.transform.localPosition.y; } transform.parent = stackTransform; transform.localPosition = new Vector3(0f, sumLocalYPos / chips.Count, 0f); rotator.StartRotation(); translator.StartTranslation(); foreach (GameObject chip in chips) { chip.transform.parent = transform; } isFlipping = true; targetTransform = stackTransform; observable.NotifyListeners(FCEvent.BEGIN, gameObject); }
// Update is called once per frame void Update() { if (isRotating) { elapsedTime += Time.deltaTime; float progress = elapsedTime / rotationTime; Vector3 rotationProgress = Vector3.Lerp(startEuler, endEuler, progress); Quaternion lerp = Quaternion.Euler(rotationProgress); transform.rotation = lerp; if (!hasNotifiedHalfWay && progress >= 0.5f) { hasNotifiedHalfWay = true; observable.NotifyListeners(FCEvent.MIDDLE, gameObject); } else if (progress >= 1f) { isRotating = false; transform.rotation = Quaternion.Euler(endEuler); observable.NotifyListeners(FCEvent.END, gameObject); } } }
// Update is called once per frame void Update() { if (isTranslating) { elapsedTime += Time.deltaTime; float y = startY + a * elapsedTime * elapsedTime + b * elapsedTime; if (y < startY) //has finished the rotation { isTranslating = false; transform.localPosition = new Vector3(transform.localPosition.x, startY, transform.localPosition.z); observable.NotifyListeners(FCEvent.END, gameObject); } else { transform.localPosition = new Vector3(transform.localPosition.x, y, transform.localPosition.z); if (!hasNotifiedHalfWay && elapsedTime > halfTranslateTime) { hasNotifiedHalfWay = true; observable.NotifyListeners(FCEvent.MIDDLE, gameObject); } } } }
// Update is called once per frame void Update() { if (isMoving) { elapsedTime += Time.deltaTime; if (elapsedTime >= moveTime) { isMoving = false; transform.localPosition = endPosition; observable.NotifyListeners(FCEvent.END, gameObject); } else { Vector3 currentDiff = totalDiff * MJMath.LerpExp(elapsedTime / moveTime); transform.localPosition = startPosition + currentDiff; } } }
// Update is called once per frame void Update() { if (isScaling) { elapsedTime += Time.deltaTime; if (elapsedTime > scaleTime) { isScaling = false; transform.localScale = initalScale; observable.NotifyListeners(FCEvent.END, gameObject); } else { float timeAmount = (scaleTime - elapsedTime) / scaleTime; float sinTime = timeAmount * maxtime; //sin(ax), where a = nScalingPoints, x= timeAmount * maxTime Vector3 scale = scaleDiff * timeAmount * Mathf.Sin(sinTime); Vector3 finalScale = initalScale + scale; transform.localScale = finalScale; } } }
public void OnEvent(FCEvent fcEvent, GameObject gameObject) { if (fcEvent == FCEvent.END) { nFinishedMovements++; if (gameObject.GetComponent <Scaler>() != null) { observable.NotifyListeners(FCEvent.END, gameObject); isFalling = false; ClearMovers(); List <Chip> childChips = GetAllChips(); foreach (Chip chip in childChips) { chip.transform.parent = targetTransform; } transform.parent = null; } else if (movers.Count == nFinishedMovements) { List <Chip> chips = GetChipsForMovers(); foreach (Chip chip in chips) { chip.transform.parent = targetTransform; } Transform lowest = GetLowestChip(chips); Vector3 lowestAsFallerLocal = transform.InverseTransformPoint(lowest.position); scaler.transform.localPosition = new Vector3(lowestAsFallerLocal.x, lowestAsFallerLocal.y - chips [0].chipMeta.Height / 2, lowestAsFallerLocal.z); foreach (Chip chip in chips) { chip.transform.parent = scaler.transform; } scaler.StartScaling(); } } }