using System; using System.Collections; using DG.Tweening; using UnityEngine; using AibisDream.FixSystem; using UnityEngine.UI; using AibisDream.Kit; public class PunchTapeSystem : MonoBehaviour { public RectTransform punchTapeMachine; public RectTransform punchTape; public GameObject blackPanel; public float stepDistance = 0.5f; // Distance moved per step public float[] stepPatterns = { 0.3f, 0.5f, 0.2f, 0.4f, 0.6f }; // Pattern of intervals to simulate rhythmic printing private void Awake() { FixSystemCenter.SystemDic.Register(this); } private void OnDestroy() { FixSystemCenter.SystemDic.Unregister(); } public IEnumerator PrintPunchTapes(int tapeCount) { blackPanel.SetActive(true); Vector3 tapeStartPos = punchTape.anchoredPosition; Color tapeStartColor = punchTape.GetComponent().color; while (tapeCount > 0) { // Move the printer to x = 2 over 1 second yield return punchTapeMachine.DOAnchorPos(new Vector2(-1252f, punchTapeMachine.anchoredPosition.y), 1f) .WaitForCompletion(); AudioManager.Instance.PlaySfx("event:/Scriptal/typing"); // Gradually move the punch tape to x = -3.8 with rhythmic pattern Vector2 targetPosition = new Vector2(796f, punchTape.anchoredPosition.y); int patternIndex = 0; while (Vector2.Distance(punchTape.anchoredPosition, targetPosition) > stepDistance) { punchTape.anchoredPosition = Vector3.MoveTowards(punchTape.anchoredPosition, targetPosition, stepDistance); yield return new WaitForSeconds(stepPatterns[patternIndex % stepPatterns.Length]); patternIndex++; } // Ensure exact final position punchTape.anchoredPosition = targetPosition; // Fade out the punch tape over 1 second yield return punchTape.GetComponent().DOFade(0f, 1f).WaitForCompletion(); // Reset the punch tape position and opacity punchTape.anchoredPosition = tapeStartPos; punchTape.GetComponent().color = tapeStartColor; // Decrement the tape count tapeCount--; } // Move the printer back to x = 0 over 1 second yield return punchTapeMachine.DOAnchorPos(new Vector2(-1428.186f, punchTapeMachine.anchoredPosition.y), 1f) .WaitForCompletion(); blackPanel.SetActive(false); } }