#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 извините, я не уверен, что понимаю проблему.