Я пытаюсь написать сценарий в Unity, который создает тип кругового меню вокруг объекта, с которым игрок смотрит прямо, но количество кнопок в меню является переменной.
Я сгенерировал углы главного меню, в которых объекты должны появляться достаточно легко ...
// int buttonCount = number of buttons
float buttonWidth = 360 / buttonCount;
for (int i = 1; i <= buttonCount; i++)
{
float maxAngle = buttonWidth * i;
float minAngle;
if (i == 0)
{
minAngle = 0f;
}
else if (i == buttonCount)
{
minAngle = 360 - buttonWidth;
}
else
{
minAngle = buttonWidth * (i - 1);
}
float buttonAngle = (minAngle + maxAngle) / 2;
}
... но теперь я пытаюсь расположить объекты кнопок под соответствующими углами вокруг объекта центрального меню, и я не знаю, как?
Сначала определите исходную точку и расстояние для каждой кнопки от нее. Поскольку у вас есть углы, вы можете применить тригонометрию, которая должна позволить вам найти координату точки с учетом угла, расстояния и исходной точки. Точка будет определяться с помощью cos () и sin () угла.
Эта функция принимает в качестве параметров объект, вокруг которого должны перемещаться кнопки, игровой объект игрока, чтобы вы могли ориентировать новые кнопки на игрока, угол, под которым должна располагаться кнопка, и радиус (расстояние, от которого будет находиться кнопка. кнопку Центр). Его вывод - позиция кнопки в мировом пространстве. Вы можете вызвать его для каждой кнопки, которую хотите добавить.
Vector3 positionButton(GameObject buttonCenter, GameObject player, float angle, float radius) {
//get the up and right vectors from the player object so we can orient the buttons
Vector3 up = player.transform.up;
Vector3 right = player.transform.right;
angle = Mathf.Deg2Rad * angle; //convert degrees to radians. radians=degrees * 2pi / 360
//cos(angle) give an x coordinate, on a unit circle centered around 0
//sin(angle) is the y coordinate on the unit circle
//take those values, multiply them by the up and right vectors to orient them to the player,
//multiply by the radius to move them the correct distance from the buttoncenter,
//and add the buttoncenter position so they circle around the correct point
Vector3 buttonPos =buttonCenter.transform.position + (radius * right * Mathf.Cos(angle)) + (radius* up * Mathf.Sin(angle));
return buttonPos;
}
Спасибо, нужно освежить мою тригонометрию
Кстати, вы используете Mathf.Deg2Rad вот так ... angle = angle * Mathf.Deg2Rad;
Совет: есть константа
Mathf.Deg2Rad
(и наоборот).