Как я могу сделать круг из сетки игровых объектов?

#c# #unity3d #math #geometry #trigonometry

#c# #unity3d #математика #геометрия #тригонометрия

Вопрос:

Чего я пытаюсь достичь, это что-то вроде этого: введите описание изображения здесь

Пока у меня есть края для кругов.

Ожидаемые результаты

Я знаю, что для этого потребуется вложенный цикл for . Это то, что у меня есть до сих пор:

 public GameObject player;
private GameObject playerGrid;

public int numOfObjects;
private Vector3 centerPos;
public int size = 2;

public Vector2 speed = new Vector2(50, 50);
private float smoothTime = 0.25f;

void Start()
{
    playerGrid = new GameObject();
    centerPos = transform.position;

    for (int i = 0; i < numOfObjects; i  )
    {
        float pointNum = (i * 1.0f) / numOfObjects;
        float angle = pointNum * Mathf.PI * 2;
        float r = size / 2 * (Mathf.PI); 
        float x = Mathf.Sin(angle) * r;
        float y = Mathf.Cos(angle) * r;
        Vector3 pointPos = new Vector3(x, y, 0)   centerPos;
        GameObject obj = Instantiate(player, pointPos, Quaternion.identity);
        obj.transform.SetParent(playerGrid.transform);
    }        
}
 

Я застрял на том, как реализовать условие для вложенного цикла for . Кроме того, у меня проблемы с пониманием вычислений позиций столбцов во вложенном цикле for . Я считаю, что условным значением будет начало и конец I для этого столбца или строки: for(int j = i 1; j < i — 1, j )

Для позиций col я бы подумал, что это увеличит угол настолько, чтобы дать квадрату место для этого столбца: float x = (Mathf.Sin(угол) что-то здесь) * r;

Я просто не уверен, как продвигаться дальше.

Комментарии:

1. На самом деле вы бы предпочли пробежаться по сетке (2 цикла) и проверить, находитесь ли вы внутри круга или нет

2. Справедливое замечание, но как мне получить расположение квадрата, чтобы они не перекрывались? Для моей игры квадраты должны быть динамическими в единицах измерения пикселей. @derHugo

3. Ну, точно так же, как на изображении, которое вы опубликовали: вы просто убедитесь, что размещаете их всегда на расстоянии 1 единицы друг от друга.. итак, если размер вашего квадрата увеличивается, соответственно увеличивается и размер сетки

4. Хорошо, я опубликую решение, как только введу его.

5. Какие значения заданы? Радиус круга? Количество объектов? Размер объекта (для квадратного объекта)?

Ответ №1:

Вот простой способ нарисовать круг:

 public float circleRadius = 5f;
public float objectSize = 1f;

void OnDrawGizmos()
{
    for (var x = -circleRadius; x <= circleRadius; x  )
    {
        for (var y = -circleRadius; y <= circleRadius; y  )
        {
            var pos = new Vector3(x, 0f, y);
            
            if (pos.magnitude >= circleRadius) continue;

            Gizmos.DrawSphere(pos * (objectSize * 2f), objectSize);
        }
    }
}
 

Комментарии:

1. Как мне добавить к этому коллайдер box? @Iggy Мне нужен способ проверить, находятся ли мои квадраты внутри моего круга.

2. @HakeemThomas Это пример gizmo. В вашем проекте вместо рисования gizmos вы бы создали экземпляр игрового объекта, к которому был бы прикреплен box collider. Вы всегда можете просто выполнить простую pos.magnitude < x проверку, чтобы увидеть, находится ли поле внутри круга. Вы также можете использовать Physics.OverlapSphere для более расширенного обнаружения.

3. Большое спасибо. Я близок к завершению. У меня есть окружность для рендеринга линий с столкновением блоков. Я посмотрю о величине.

4. Величина работает, но есть проблема. Кажется, что вычисления идут неправильно для некоторых единиц с одинаковыми значениями (т.Е. Рабочих точек [(-1.5, 0.5), (1.5, -0.5)] Не работает Очки[(-0.5, 1.5), (0.5, 1.5)]).

5. @HakeemThomas извините, я не уверен, что понимаю проблему.