--- id: wiki-2026-0508-triple-match-3d title: Triple Match 3D category: 10_Wiki/Topics status: verified canonical_id: self aliases: [Match 3D, Triple Match, Tile Match, Match Triple 3D] duplicate_of: none source_trust_level: A confidence_score: 0.9 verification_status: applied tags: [game-design, mobile, casual, match-3d, hyper-casual] raw_sources: [] last_reinforced: 2026-05-10 github_commit: pending tech_stack: language: csharp framework: unity6 --- # Triple Match 3D ## 매 한 줄 > **"매 3 개 의 same item 의 collect — 매 satisfying haptic loop"**. 2021 Triple Match 3D (Rollic) → 2022 Match Factory! → 2024 Match Triple 3D 의 evolution. 매 'tile-match' subgenre 의 mobile casual 의 leader — 매 7-slot tray + 3D physics + 매 daily LiveOps 의 핵심. ## 매 핵심 ### 매 core loop - **3D 환경 of items**: pile/scene 의 visible items. - **Tap to pick**: tap → item 의 7-slot tray 의 send. - **Match 3 of same**: tray 의 3 same items → auto-clear. - **Tray full = lose**: 매 7 slots 의 fill → game over. ### 매 progression - **Level structure**: handcrafted scenes (50+ unique) + procedural variations. - **Booster system**: undo, freeze, shuffle, +3 slots — 매 IAP 의 hook. - **Daily challenges**: 매 reward calendar 의 retention engine. - **Meta layer**: collection album, area decoration (Match Factory! style). ### 매 응용 1. Triple Match 3D — Rollic 의 originator (2021, 100M+ downloads). 2. Match Factory! — Peak Games (Zynga) 의 evolution + meta. 3. Tile Busters — Playrix 의 entry. ## 💻 패턴 ### Tray + Match Logic (Unity C#) ```csharp public class MatchTray : MonoBehaviour { [SerializeField] int capacity = 7; List slots = new(); public bool TryAdd(Item item) { if (slots.Count >= capacity) return false; // 매 same-type items 의 그룹화 int insertIdx = slots.FindLastIndex(s => s.type == item.type) + 1; if (insertIdx == 0) insertIdx = slots.Count; slots.Insert(insertIdx, item); item.MoveTo(GetSlotPosition(insertIdx), 0.3f); StartCoroutine(CheckMatchAfterMove()); return true; } IEnumerator CheckMatchAfterMove() { yield return new WaitForSeconds(0.35f); for (int i = 0; i + 2 < slots.Count; i++) { if (slots[i].type == slots[i+1].type && slots[i].type == slots[i+2].type) { ClearMatch(i, i+2); yield break; } } if (slots.Count >= capacity) GameOver(); } void ClearMatch(int start, int end) { for (int i = end; i >= start; i--) { slots[i].PlayMatchVFX(); Destroy(slots[i].gameObject, 0.4f); slots.RemoveAt(i); } Haptics.Light(); ScoreManager.Add(30); } } ``` ### 3D Pickable Item ```csharp public class PickableItem : MonoBehaviour { public ItemType type; Rigidbody rb; Collider col; void OnMouseDown() { if (!IsTopOfPile()) { ShakeNo(); return; } if (!MatchTray.Instance.CanAccept()) { ShakeNo(); return; } rb.isKinematic = true; col.enabled = false; MatchTray.Instance.TryAdd(this); SoundManager.Play("pick_pop"); } bool IsTopOfPile() { // 매 raycast 의 위 → 매 obstruction 의 X return !Physics.Raycast(transform.position, Vector3.up, 0.5f); } } ``` ### Booster: Undo ```csharp public class UndoBooster : Booster { Stack history = new(); public void Record(Item item) => history.Push(item); public override void Activate() { if (history.Count == 0) return; Item last = history.Pop(); MatchTray.Instance.Remove(last); last.ReturnToScene(); Spend(1); } } ``` ### Difficulty Curve ```csharp public static class DifficultyCurve { public static LevelConfig Generate(int level) { return new LevelConfig { uniqueTypes = Mathf.Min(6 + level / 5, 14), totalItems = 30 + level * 3, obstructed = level >= 10, timeLimit = level >= 20 ? 90f - level * 0.5f : 0f, }; } } ``` ### LiveOps Daily Challenge ```csharp [Serializable] public class DailyChallenge { public string id; public DateTime date; public int targetMatches; public ItemType requiredType; public Reward reward; public bool Check(MatchEvent e) { if (DateTime.UtcNow.Date != date) return false; if (requiredType != ItemType.Any && e.type != requiredType) return false; progress++; if (progress >= targetMatches) GrantReward(); return true; } } ``` ## 매 결정 기준 | 상황 | Approach | |---|---| | pure casual, fast loop | 7-slot tray, no time limit | | meta progression 매 retention | collection album + area unlock (Match Factory!) | | difficulty 매 increase | unique types + obstructions, not slot count | | monetization | booster IAP + ad-rewarded continues | **기본값**: 7-slot tray + 50 handcrafted levels + booster IAP — 매 proven Rollic formula. ## 🔗 Graph - 부모: [[Game Design]] - 변형: [[Match Triple 3D]] ## 🤖 LLM 활용 **언제**: 매 level layout brainstorming, theme generation, daily challenge variation. **언제 X**: 매 difficulty tuning 의 final — 매 player data 의 driven. ## ❌ 안티패턴 - **Random pile**: 매 unsolvable layouts → frustration. 매 hand-tested 의 X 매 unsafe. - **Booster paywall**: 매 ad-rewarded option 의 X → churn. - **Slot count 의 increase**: 매 difficulty 의 fake — 매 type variety 의 better lever. - **No haptic**: 매 'satisfying' core feel 의 lost. ## 🧪 검증 / 중복 - Verified (Rollic blog, Sensor Tower 2024 reports, Match Factory! GDC talk 2025). - 신뢰도 A. ## 🕓 Changelog | 날짜 | 변경 | |---|---| | 2026-05-08 | Phase 1 | | 2026-05-10 | Manual cleanup — Triple Match 3D genre analysis + 5 Unity implementation patterns |