AgentStack
SKILL verified MIT Self-run

Hyper Casual

skill-xeldaralz-everything-claude-unity-hyper-casual · by XeldarAlz

Hyper-casual mobile game architecture — one-tap/swipe controls, instant onboarding, short sessions, ad monetization, minimalist visuals, level progression, score systems.

No reviews yet
0 installs
12 views
0.0% view→install

Install

$ agentstack add skill-xeldaralz-everything-claude-unity-hyper-casual

✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

Are you the author of Hyper Casual? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

Hyper-Casual Mobile Patterns

Core Design Principles

  • One mechanic, perfected — the entire game is one interaction
  • Instant onboarding — player understands in 3 seconds, no tutorial screen
  • Short sessions — 30-60 second rounds
  • Satisfying feedback — haptics, screen shake, particle bursts, sound on every action
  • Endless or level-based — simple progression keeps players coming back

One-Tap Controller

public sealed class TapController : MonoBehaviour
{
    [Header("Input")]
    [SerializeField] private float _tapForce = 10f;
    [SerializeField] private float _holdForceMultiplier = 0.5f;

    private Rigidbody _rb;
    private bool _isTouching;

    private void Awake()
    {
        _rb = GetComponent();
    }

    private void Update()
    {
        if (UnityEngine.InputSystem.Touchscreen.current == null) return;

        UnityEngine.InputSystem.Controls.TouchControl touch =
            UnityEngine.InputSystem.Touchscreen.current.primaryTouch;

        if (touch.press.wasPressedThisFrame)
        {
            OnTap();
        }

        _isTouching = touch.press.isPressed;
    }

    private void FixedUpdate()
    {
        if (_isTouching)
        {
            _rb.AddForce(Vector3.up * _holdForceMultiplier, ForceMode.Acceleration);
        }
    }

    private void OnTap()
    {
        _rb.linearVelocity = Vector3.zero;
        _rb.AddForce(Vector3.up * _tapForce, ForceMode.Impulse);
    }
}

Swipe Controller

public sealed class SwipeController : MonoBehaviour
{
    [SerializeField] private float _swipeThreshold = 50f;
    [SerializeField] private float _moveSpeed = 10f;
    [SerializeField] private float _laneSwitchDuration = 0.15f;

    private Vector2 _touchStartPos;
    private bool _isSwiping;

    private void Update()
    {
        if (UnityEngine.InputSystem.Touchscreen.current == null) return;

        UnityEngine.InputSystem.Controls.TouchControl touch =
            UnityEngine.InputSystem.Touchscreen.current.primaryTouch;

        if (touch.press.wasPressedThisFrame)
        {
            _touchStartPos = touch.position.ReadValue();
            _isSwiping = true;
        }

        if (touch.press.wasReleasedThisFrame && _isSwiping)
        {
            Vector2 delta = touch.position.ReadValue() - _touchStartPos;
            _isSwiping = false;

            if (delta.magnitude > _swipeThreshold)
            {
                if (Mathf.Abs(delta.x) > Mathf.Abs(delta.y))
                {
                    OnSwipeHorizontal(delta.x > 0f ? 1 : -1);
                }
                else
                {
                    OnSwipeVertical(delta.y > 0f ? 1 : -1);
                }
            }
            else
            {
                OnTap();
            }
        }
    }

    private void OnSwipeHorizontal(int direction) { /* lane switch or steer */ }
    private void OnSwipeVertical(int direction) { /* jump or duck */ }
    private void OnTap() { /* primary action */ }
}

Level Progression System

[CreateAssetMenu(menuName = "HyperCasual/Level Config")]
public sealed class LevelConfig : ScriptableObject
{
    [SerializeField] private int _levelNumber;
    [SerializeField] private float _speed = 5f;
    [SerializeField] private float _obstacleFrequency = 0.5f;
    [SerializeField] private Color _themeColor = Color.white;
    [SerializeField] private int _targetScore;

    public int LevelNumber => _levelNumber;
    public float Speed => _speed;
    public float ObstacleFrequency => _obstacleFrequency;
    public Color ThemeColor => _themeColor;
    public int TargetScore => _targetScore;
}

public sealed class LevelManager : MonoBehaviour
{
    [SerializeField] private LevelConfig[] _levels;

    private int _currentLevelIndex;
    private const string LEVEL_KEY = "CurrentLevel";

    private void Awake()
    {
        _currentLevelIndex = PlayerPrefs.GetInt(LEVEL_KEY, 0);
    }

    public LevelConfig GetCurrentLevel()
    {
        int index = _currentLevelIndex % _levels.Length;
        return _levels[index];
    }

    public void CompleteLevel()
    {
        _currentLevelIndex++;
        PlayerPrefs.SetInt(LEVEL_KEY, _currentLevelIndex);
        PlayerPrefs.Save();
    }
}

Game Loop (Hyper-Casual)

Splash → Menu (one big PLAY button)
    → Playing (auto-forward, player reacts)
        → Game Over (score, best, retry/home)
            → Rewarded Ad (continue?) → resume or Menu
  • No loading screens — instant transitions
  • No settings menus — sound toggle only
  • Retry = instant — no delays, no confirmation

Monetization Hooks

  • Interstitial: show after every 3rd game over (not on first play)
  • Rewarded: offer continue/2x score at game over
  • Banner: bottom of menu screen only (never during gameplay)
public interface IAdService
{
    void ShowInterstitial(System.Action onComplete);
    void ShowRewarded(System.Action onResult);
    void ShowBanner();
    void HideBanner();
}

Visual Style

  • Solid colors, no textures (smallest build size)
  • Primitives: cubes, spheres, cylinders
  • Color palette: 3-4 colors max per level
  • Camera: fixed angle or auto-follow, never player-controlled

Performance Budget

  • < 30 draw calls — hyper-casual games should be trivially simple to render
  • < 50MB build size — critical for ad network installs
  • 30fps — saves battery, users don't notice for casual games
  • Zero allocations in gameplay loop

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet — be the first.

Versions

  • v0.1.0 Imported from the upstream source.