protected override void DoSparkHandler(IEvent e) { base.DoSparkHandler(e); VisionSpark spark = e.data as VisionSpark; if (spark.type == VisionSparkType.Sprinkle) { GameObject quadgo = new GameObject(string.Format("quad_{0}_{1}_sprinkle", data.row, data.column)); quadgo.transform.parent = transform.parent; quadgo.layer = Layer.Effect; QuadView quadView = quadgo.AddComponent <QuadView>(); quadView.data = data.Clone(); quadView.data.localAlpha = data.localAlpha; quadView.data.parentAlpha = data.parentAlpha; quadView.data.localPosition = data.localPosition + new Vector3(0, 0, -0.001f); quadView.data.localEulerAngles = data.localEulerAngles; quadView.data.localScale = data.localScale; quadView.data.touchEnable = false; quadView.data.material = VisionMaterial.Unlit; quadView.data.uvOffsets = new Vector2[] { new Vector2(0, 0.25f), new Vector2(0, 0.25f) }; quadgo.SetActive(false); Tween t1 = DOTween.To(() => quadView.data.localScale, x => quadView.data.localScale = x, quadView.data.localScale * Style.QuadSprinkleScale, Style.QuadSprinkleDuration).SetEase(Ease.OutCubic); Tween t2 = DOTween.To(() => quadView.data.localAlpha, x => quadView.data.localAlpha = x, 0f, Style.QuadSprinkleDuration).SetEase(Ease.OutCubic); Sequence sequence = DOTween.Sequence(); sequence.AppendInterval(spark.delay) .AppendCallback(() => quadgo.SetActive(true)) .Append(t1) .Join(t2) .OnComplete(() => GameObject.Destroy(quadView.gameObject)); } }
public void Spark(VisionSpark spark) { DispatchEvent(new VisionEvent(VisionEvent.DoSpark, spark)); }
private void ResolvePresent(TweenDepot depot, IPuzzle puzzle, IOperation origin, IOperation op, float delay) { IQuad[] rowQuads = puzzle.GetRowQuads(op.row); if ((op.direction & QuadValue.Left) > 0) { for (int i = op.column - 1; i >= 0; i--) { // 左舷依次翻转 IQuad quad = rowQuads[i]; float qdelay = (Mathf.Abs(quad.column - op.column) - 1) * Style.QuadRollDelay; if (quad.value == QuadValue.Block) { DOTween.Sequence().AppendInterval(delay + qdelay) .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(0, Style.QuadShakeAngle, 0), Style.QuadShakeDuration * 0.25f)) .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(0, -Style.QuadShakeAngle, 0), Style.QuadShakeDuration * 0.25f)) .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles, Style.QuadShakeDuration * 0.5f) .SetEase(Ease.OutBack)); break; } else if ((quad.value & (QuadValue.Left | QuadValue.Right | QuadValue.Up | QuadValue.Down)) > 0) { VisionSpark spark = new VisionSpark(VisionSparkType.Sprinkle); spark.delay = delay + qdelay; quad.Spark(spark); ResolvePresent(depot, puzzle, origin, new Operation(OpType.TouchClick, quad.row, quad.column, quad.value), delay + qdelay + Style.QuadRollDuration); break; } else { string tid = Style.QuadUnifiedRotateId + "_" + quad.row + "_" + quad.column; TweenInfo lt = depot.GetFirst(tid); if (lt != null && Mathf.Abs(lt.atPosition - delay - qdelay) < Style.QuadRollDuration) { lt.Kill(); Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(0, 0, Style.QuadConflictAngle), Style.QuadConflictDuration) .SetEase(Ease.OutBack) .SetRelative(); depot.Add(delay + qdelay, t); } else { Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(0, Style.QuadRollAngle, 0), Style.QuadRollDuration) .SetId(tid) .SetEase(Ease.OutBack) .SetRelative(); depot.Add(delay + qdelay, t); } } } } if ((op.direction & QuadValue.Right) > 0) { for (int i = op.column + 1, len = rowQuads.Length; i < len; i++) { // 右舷依次翻转 IQuad quad = rowQuads[i]; float qdelay = (Mathf.Abs(quad.column - op.column) - 1) * Style.QuadRollDelay; if (quad.value == QuadValue.Block) { DOTween.Sequence().AppendInterval(delay + qdelay) .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(0, -Style.QuadShakeAngle, 0), Style.QuadShakeDuration * 0.25f)) .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(0, Style.QuadShakeAngle, 0), Style.QuadShakeDuration * 0.25f)) .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles, Style.QuadShakeDuration * 0.5f) .SetEase(Ease.OutBack)); break; } else if ((quad.value & (QuadValue.Left | QuadValue.Right | QuadValue.Up | QuadValue.Down)) > 0) { VisionSpark spark = new VisionSpark(VisionSparkType.Sprinkle); spark.delay = delay + qdelay; quad.Spark(spark); ResolvePresent(depot, puzzle, origin, new Operation(OpType.TouchClick, quad.row, quad.column, quad.value), delay + qdelay + Style.QuadRollDuration); break; } else { string tid = Style.QuadUnifiedRotateId + "_" + quad.row + "_" + quad.column; TweenInfo lt = depot.GetFirst(tid); if (lt != null && Mathf.Abs(lt.atPosition - delay - qdelay) < Style.QuadRollDuration) { lt.Kill(); Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(0, 0, -Style.QuadConflictAngle), Style.QuadConflictDuration) .SetEase(Ease.OutBack) .SetRelative(); depot.Add(delay + qdelay, t); } else { Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(0, -Style.QuadRollAngle, 0), Style.QuadRollDuration) .SetId(tid) .SetEase(Ease.OutBack) .SetRelative(); depot.Add(delay + qdelay, t); } } } } IQuad[] columnQuads = puzzle.GetColumnQuads(op.column); if ((op.direction & QuadValue.Up) > 0) { for (int i = op.row - 1; i >= 0; i--) { // 上侧依次翻转 IQuad quad = columnQuads[i]; float qdelay = (Mathf.Abs(quad.row - op.row) - 1) * Style.QuadRollDelay; if (quad.value == QuadValue.Block) { DOTween.Sequence().AppendInterval(delay + qdelay) .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(-Style.QuadShakeAngle, 0, 0), Style.QuadShakeDuration * 0.25f)) .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(Style.QuadShakeAngle, 0, 0), Style.QuadShakeDuration * 0.25f)) .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles, Style.QuadShakeDuration * 0.5f) .SetEase(Ease.OutBack)); break; } else if ((quad.value & (QuadValue.Left | QuadValue.Right | QuadValue.Up | QuadValue.Down)) > 0) { VisionSpark spark = new VisionSpark(VisionSparkType.Sprinkle); spark.delay = delay + qdelay; quad.Spark(spark); ResolvePresent(depot, puzzle, origin, new Operation(OpType.TouchClick, quad.row, quad.column, quad.value), delay + qdelay + Style.QuadRollDuration); break; } else { string tid = Style.QuadUnifiedRotateId + "_" + quad.row + "_" + quad.column; TweenInfo lt = depot.GetFirst(tid); if (lt != null && Mathf.Abs(lt.atPosition - delay - qdelay) < Style.QuadRollDuration) { lt.Kill(); Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(0, 0, Style.QuadConflictAngle), Style.QuadConflictDuration) .SetEase(Ease.OutBack) .SetRelative(); depot.Add(delay + qdelay, t); } else { Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(-Style.QuadRollAngle, 0, 0), Style.QuadRollDuration) .SetId(tid) .SetEase(Ease.OutBack) .SetRelative(); depot.Add(delay + qdelay, t); } } } } if ((op.direction & QuadValue.Down) > 0) { for (int i = op.row + 1, len = columnQuads.Length; i < len; i++) { // 下侧依次翻转 IQuad quad = columnQuads[i]; float qdelay = (Mathf.Abs(quad.row - op.row) - 1) * Style.QuadRollDelay; if (quad.value == QuadValue.Block) { DOTween.Sequence().AppendInterval(delay + qdelay) .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(Style.QuadShakeAngle, 0, 0), Style.QuadShakeDuration * 0.25f)) .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles + new Vector3(-Style.QuadShakeAngle, 0, 0), Style.QuadShakeDuration * 0.25f)) .Append(DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, quad.localEulerAngles, Style.QuadShakeDuration * 0.5f) .SetEase(Ease.OutBack)); break; } else if ((quad.value & (QuadValue.Left | QuadValue.Right | QuadValue.Up | QuadValue.Down)) > 0) { VisionSpark spark = new VisionSpark(VisionSparkType.Sprinkle); spark.delay = delay + qdelay; quad.Spark(spark); ResolvePresent(depot, puzzle, origin, new Operation(OpType.TouchClick, quad.row, quad.column, quad.value), delay + qdelay + Style.QuadRollDuration); break; } else { string tid = Style.QuadUnifiedRotateId + "_" + quad.row + "_" + quad.column; TweenInfo lt = depot.GetFirst(tid); if (lt != null && Mathf.Abs(lt.atPosition - delay - qdelay) < Style.QuadRollDuration) { lt.Kill(); Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(0, 0, -Style.QuadConflictAngle), Style.QuadConflictDuration) .SetEase(Ease.OutBack) .SetRelative(); depot.Add(delay + qdelay, t); } else { Tweener t = DOTween.To(() => quad.localEulerAngles, x => quad.localEulerAngles = x, new Vector3(Style.QuadRollAngle, 0, 0), Style.QuadRollDuration) .SetId(tid) .SetEase(Ease.OutBack) .SetRelative(); depot.Add(delay + qdelay, t); } } } } }