コード例 #1
0
    static void MarkCircle(ref List <int>[,] grid, SpawnCircle circle, float cellSize, int mark)
    {
        int cellX      = (int)(circle.center.x / cellSize);
        int cellY      = (int)(circle.center.y / cellSize);
        int offset     = (int)(circle.radius / cellSize);
        int markStartX = Mathf.Max(0, cellX - offset);
        int markEndX   = Mathf.Min(cellX + offset, grid.GetLength(0) - 1);
        int markStartY = Mathf.Max(0, cellY - offset);
        int markEndY   = Mathf.Min(cellY + offset, grid.GetLength(1) - 1);

        for (int x = markStartX; x <= markEndX; x++)
        {
            for (int y = markStartY; y <= markEndY; y++)
            {
                float dist = Vector2.Distance(new Vector2(cellX, cellY), new Vector2(x, y));
                if (dist <= circle.radius / 2 / cellSize)
                {
                    if (grid[x, y] == null)
                    {
                        grid[x, y] = new List <int>()
                        {
                            mark
                        }
                    }
                    ;
                    else
                    {
                        grid[x, y].Add(mark);
                    }
                }
            }
        }
    }
コード例 #2
0
ファイル: GameController.cs プロジェクト: Shiks67/Assets
    // Use this for initialization
    void Start()
    {
        // da = GameObject.FindGameObjectWithTag("EditorOnly").GetComponent<RayCastF>();
        da = Camera.main.GetComponent <CircleData>();
        var spawnCircle = GameObject.Find("Quadri");

        sc = spawnCircle.GetComponent <SpawnCircle>();
        SceneManager.UnloadSceneAsync("CircleTest 1");
    }
コード例 #3
0
ファイル: CircleLife.cs プロジェクト: Shiks67/Assets
    // Use this for initialization
    void Start()
    {
        nbOfSwitch = 0;
        lastSize   = gameObject.transform.localScale;
        var gameC = GameObject.Find("Quadri");

        sc        = gameC.GetComponent <SpawnCircle>();
        isSmaller = true;
        isBigger  = true;
        isTTFF    = true;
    }
コード例 #4
0
    static public void Generate(Vector2 region, float regionHeight, Transform parent, List <MapSetting.ObjectDistribution> objectsDistribution)
    {
        List <MapObjectData> objectDatas = CreateObjectData(parent, objectsDistribution);

        if (objectDatas.Count == 0)
        {
            return;
        }
        float minRadius = objectDatas.Min(a => a.radius);
        float maxRadius = objectDatas.Max(a => a.radius);
        float cellSize  = minRadius / Mathf.Sqrt(2);

        List <int>[,] grid = new List <int> [Mathf.CeilToInt(region.x / cellSize), Mathf.CeilToInt(region.y / cellSize)];
        List <SpawnCircle> circles = new List <SpawnCircle>();

        Vector2 startPoint = new Vector2(Random.Range(0, region.x), Random.Range(0, region.y));

        Physics.Raycast(new Vector3(startPoint.x, regionHeight + 1, startPoint.y), Vector3.down, out RaycastHit startHit);
        List <SpawnCircle> candidates = new List <SpawnCircle>
        {
            new SpawnCircle()
            {
                center = startPoint, radius = FilterObjectDatassRandom(startHit.point.y, minRadius, objectDatas).radius
            }
        };

        while (candidates.Count > 0)
        {
            int         spawnIndex = Random.Range(0, candidates.Count);
            SpawnCircle candidate  = candidates[spawnIndex];
            bool        stop       = false;
            for (int n = 0; n < 10; n++)
            {
                float   angle          = Random.value * Mathf.PI * 2;
                Vector2 dir            = new Vector2(Mathf.Sin(angle), Mathf.Cos(angle));
                Vector2 candidatePoint = candidate.center + dir * Random.Range(candidate.radius / 2 + maxRadius / 2, candidate.radius + maxRadius);
                Physics.Raycast(new Vector3(candidatePoint.x, regionHeight + 1, candidatePoint.y), Vector3.down, out RaycastHit hit);
                MapObjectData objectData = FilterObjectDatassRandom(hit.point.y, minRadius, objectDatas);
                if (IsValid(grid, circles, candidatePoint, objectData.radius, region, cellSize))
                {
                    SpawnCircle spawnCircle = new SpawnCircle()
                    {
                        radius = objectData.radius, center = candidatePoint
                    };
                    circles.Add(spawnCircle);
                    candidates.Add(spawnCircle);
                    MarkCircle(ref grid, spawnCircle, cellSize, circles.Count);
                    stop = true;
                    if (objectData.mapObjects != null)
                    {
                        GenerateObject(objectData, new Vector3(candidatePoint.x, hit.point.y, candidatePoint.y));
                    }
                    break;
                }
            }
            if (!stop)
            {
                candidates.RemoveAt(spawnIndex);
            }
        }
    }
コード例 #5
0
 void Start()
 {
     spawnCircle = gameObject.GetComponent <SpawnCircle>();
 }