public static Vector3 GetRandomPosition(SpawnEdge edge, Rect rect)
    {
        float x = 0;
        float y = 0;

        switch (edge)
        {
        case SpawnEdge.TOP:
            x = Random.Range(rect.xMin, rect.xMax);
            y = rect.yMax;
            break;

        case SpawnEdge.BOTTOM:
            x = Random.Range(rect.xMin, rect.xMax);
            y = rect.yMin;
            break;

        case SpawnEdge.LEFT:
            x = rect.xMin;
            y = Random.Range(rect.yMin, rect.yMax);
            break;

        case SpawnEdge.RIGHT:
            x = rect.xMax;
            y = Random.Range(rect.yMin, rect.yMax);
            break;
        }
        return(new Vector3(x, y));
    }
    public static Vector2 GetRandomForceDirection(SpawnEdge edge, Rect rangeRect, Rect clampRect)
    {
        float forceDirectionPointX = 0;
        float forceDirectionPointY = 0;
        float rand = 0;

        switch (edge)
        {
        case SpawnEdge.TOP:
        case SpawnEdge.BOTTOM:
            rand = Random.Range(rangeRect.xMin, rangeRect.xMax);
            forceDirectionPointX = Mathf.Clamp(rand, clampRect.xMin, clampRect.xMax);
            forceDirectionPointY = edge == SpawnEdge.TOP ? clampRect.yMax : clampRect.yMin;
            break;

        case SpawnEdge.LEFT:
        case SpawnEdge.RIGHT:
            rand = Random.Range(rangeRect.yMin, rangeRect.yMax);
            forceDirectionPointX = edge == SpawnEdge.LEFT ? clampRect.xMin : clampRect.xMax;
            forceDirectionPointY = Mathf.Clamp(rand, clampRect.yMin, clampRect.yMax);
            break;
        }

        return(new Vector2(forceDirectionPointX, forceDirectionPointY));
    }
    private void CreateAsteroid()
    {
        Rect worldRect = State.Instance.Get <StateCamera>().WorldRect;

        GameObject prefab = this.GetRandomPrefab();
        GameObject go     = GameObject.Instantiate(prefab);

        Asteroid asteroid = go.GetComponent <Asteroid>();
        float    size     = asteroid.Model.Size;

        SpawnEdge spawnEdge = AsteroidControllerUtils.GetRandomSpawnEdge();

        Rect    spawnRect = RectUtils.Resize(worldRect, size * 0.5f);
        Vector3 position  = AsteroidControllerUtils.GetRandomPosition(spawnEdge, spawnRect);

        asteroid.SetPosition(position);

        Rect    rangeRect      = RectUtils.CreateSquare(position, size);
        Rect    clampRect      = RectUtils.Resize(worldRect, size * -0.5f);
        Vector3 forceDirection = AsteroidControllerUtils.GetRandomForceDirection(spawnEdge, rangeRect, clampRect);

        asteroid.AddForces(forceDirection - position);

        asteroid.Model.OnHit += this.OnHit;
    }