public void MoveLower(ArchBlock block, float lower, float time) { if (lower > block.Ratio) { StartCoroutine(MoveLowerRoutine(block, lower, time)); } }
private IEnumerator ApperNextBlockRoutine(ArchBlock archBlock, Color color, float time) { var ratio = 0f; var controller = archBlock.ArchController; float endArchDeg = controller.ArcDegree; float endArchMax = controller.MaxRadius; float beginArchMax = controller.MaxRadius + 2.0f; float endArchBet = controller.BetweenMaskRadius; for (float i = 0f; ratio < 1f; i += Time.deltaTime) { ratio = Mathf.Min(1f, i / time); float value = _ArchFillingCurve.Evaluate(ratio); controller.ArcDegree = Mathf.Lerp(0, endArchDeg, value); controller.MaxRadius = Mathf.Lerp(beginArchMax, endArchMax, value); controller.BetweenMaskRadius = Mathf.Lerp(0, endArchBet, value); yield return(null); archBlock.ArchBuilder.color = color; } }
private IEnumerator MoveLowerRoutine(ArchBlock block, float lower, float time) { float start = block.Ratio; for (float i = 0f; i < time; i += Time.deltaTime * ShootSpeed) { float ratio = Mathf.Clamp(i / time, 0f, 1f); block.Ratio = Mathf.Lerp(start, lower, _MoveLowerCurve.Evaluate(ratio)); yield return(null); } block.Ratio = lower; MoveLowerEndEvent?.Invoke(block); }
private IEnumerator FittingRoutine(ArchBlock archBlock, float axisAngle, float time) { float start = archBlock.RotationZ; float ratio; for (float i = 0f; i < time; i += Time.deltaTime * Time.timeScale) { ratio = Mathf.Clamp(i / time, 0f, 1f); archBlock.RotationZ = Mathf.Lerp(start, axisAngle, _FittingCurve.Evaluate(ratio)); yield return(null); } archBlock.RotationZ = axisAngle; }
private bool CheckLowerTheBlock(ArchBlock block) { if (block.Ratio < 1f) { double blockRatio = Math.Truncate(block.Ratio * 10) * 0.1d; double maxRatio = blockRatio; bool hasRotationEqualBlock = false; foreach (ArchBlock other in _StackingArchBlocks) { if (Mathf.Abs(other.RotationZ - block.RotationZ) < 1f) { hasRotationEqualBlock = true; double ratio = Math.Truncate(other.Ratio * 10) * 0.1d; if (blockRatio < maxRatio) { maxRatio = Math.Min(ratio - ArchBlock.BlockThicknessD, maxRatio); } else { maxRatio = Math.Max(ratio - ArchBlock.BlockThicknessD, maxRatio); } } } if (hasRotationEqualBlock) { maxRatio = Math.Truncate(maxRatio * 10) * 0.1d; return(maxRatio > blockRatio); } else { return(true); } } return(false); }
private IEnumerator CheckBlockClear() { var blockThickness = ArchBlock.BlockThicknessF * 1.5f; var blockCleared = false; for (float i = 1f; i > 0f; i -= ArchBlock.BlockThicknessF) { if (CanBlockCler(i, out var list)) { _TwinkleCircle.gameObject.SetActive(true); ScoreSystem.Instance.ScoreUp(1); foreach (var clearBlock in list) { clearBlock.Release(BlockReleaseTime); _StackingArchBlocks.Remove(clearBlock); blockCleared = true; } if (blockCleared) { var movedBlocks = _StackingArchBlocks.ToList(); for (float w = 0f; w < BlockClearTime; w += Time.deltaTime * Time.timeScale) { yield return(null); } for (float ratio = i; ratio > 0f; ratio -= ArchBlock.BlockThicknessF) { for (int index = 0; index < movedBlocks.Count; index++) { ArchBlock block = movedBlocks[index]; if (block.Ratio < ratio) { if (Mathf.Abs(block.Ratio - ratio) < blockThickness) { ArchBlockShooter.Instance.MoveLower(block, Mathf.Floor(ratio * 10) * 0.1f, Clear_BlockLowerTime); movedBlocks.RemoveAt(index--); } } } if (movedBlocks.Any(o => o.Ratio < ratio)) { for (float w = 0f; w < Clear_OtherLowerTime; w += Time.deltaTime * Time.timeScale) { yield return(null); } } } } break; } } for (float w = 0f; w < TimeToThinkPrepareNextBlock; w += Time.deltaTime * Time.timeScale) { yield return(null); } ArchBlockShooter.Instance.TargetPack = null; ArchBlockShooter.Instance.PrepareNextBlock(); }
private void LateUpdate() { var shootingPack = ArchBlockShooter.Instance.TargetPack; if (ContactBlock == null && _StackingBlocks.Count > 0) { ContactBlock = _StackingBlocks[_StackingBlocks.Count - 1]; } for (int i = 0; i < _StackingBlocks.Count; i++) { var block = _StackingBlocks[i]; if (AllBlockDestroy) { block.Destroy(); _StackingBlocks.RemoveAt(i--); continue; } if (AllBlockRelease) { block.Release(); continue; } block.ArchUpdate(); if (shootingPack) { for (int j = 0; j < shootingPack.Length; j++) { if (Mathf.Abs(shootingPack[j].Ratio - block.Ratio) > ArchBlock.BlockThicknessF) { continue; } var shootingBlock = shootingPack[j]; float blockAngle = block.RotationZ > 180f ? block.RotationZ - 360f : block.RotationZ; float shootingBlockAngle = shootingBlock.RotationZ > 180f ? shootingBlock.RotationZ - 360f : shootingBlock.RotationZ; if (Mathf.Abs(shootingBlockAngle - blockAngle) <= ArchBlock.DefaultBlockDegree) { ContactBlock = block; ArchBlockShooter.Instance.ShootingStop = true; break; } } } } if (AllBlockDestroy) { AllBlockDestroy = false; InGameSceneSystem.Instance.GameOver(); _TwinkleCircles.gameObject.SetActive(true); } else if (AllBlockRelease) { AllBlockRelease = false; if (shootingPack != null) { for (int i = 0; i < shootingPack.Length; i++) { shootingPack[i].Release(); } } var nextPack = ArchBlockShooter.Instance.NextArchPack; if (nextPack != null) { for (int i = 0; i < nextPack.Length; i++) { nextPack[i].Release(); } } } }
public void Add(ArchBlock block) { _ArchBlockPool.Enqueue(block); block.gameObject.SetActive(false); }