Unity3d Android вращение одного объект вокруг другого с помощью джойстика

178
30 декабря 2021, 01:20

хочу сделать игру на unity android, есть сфера вокруг которой должен крутиться объект firePoint c помощью джойстика, но объект который крутится вокруг сферы не сохраняет радиус, вот что я пробую:

 void MoveCircle()
    {
        float x, z;
            x = variableJoystick.Horizontal;
            z = variableJoystick.Vertical;
        transform.position = Vector3.MoveTowards(transform.position, new Vector3((Center.transform.position.x + x * radius), Center.transform.position.y, ((Center.transform.position.z +z * radius))), 0.35f);
        transform.Rotate(new Vector3(rotationAngles.x * rotationSpeed * Time.deltaTime, rotationAngles.y * rotationSpeed * Time.deltaTime, rotationAngles.z * rotationSpeed * Time.deltaTime));
    }

Выглядит это так, левый джойстик отвечает за передвижение сферы, а правый за передвижение оружия вокруг этой сферы, проблема в том, что оружие не сохраняет радиус вращения а полностью копирует поведение джостика, когда джостик в исходном положении орудие то же перемещается во внутрь сферы.

Как должно быть при джойстике в начальном положении:

А вот как работает это сейчас:

Само вращение работает корректно но как только я начинаю двигать правый джостик, пушка то же начинает вылазить из сферы, она не сохранила орбитальное положение. можно ли это как-то исправить и чтоб это всё работало при движении сферы желательно с примерами, заранее спасибо.

Answer 1

Чему ты удивляешься? Тебе нужен только угол аналога. А ты используешь оси x и y.

float Radius = 1f;
Vector3 GunPos;
public Transform SphereTransform;
void Start () {
    // Стартовый поворот
    UpdateGunAngle(90);
}
void MoveCircle () {
    Vector2 AnalogAxis = new Vector2(variableJoystick.Horizontal, variableJoystick.Vertical);
    if (AnalogAxis.magnitude > 0.1f) { // Что-бы не обрабатывать аналог на нейтралке
        // Находим угол (в радианах)
        UpdateGunRotation(Mathf.Atan2(AnalogAxis.y, AnalogAxis.x));
    )
    transform.localPosition = GunPos+SphereTransform.localPosition;
}
void UpdateGunAngle (float angle) {
    UpdateGunRotation(angle/180f*Mathf.PI);
}
void UpdateGunRotation (float rad) {
    // Находим позицию с неким Radius
    GunPos = new Vector3(Mathf.Cos(rad), 0, Mathf.Sin(rad))*Radius;
    // И поворот ствола в градусвх (базовый поворот на 0 градусов (в право, а не вперёд/вверх на 90))
    transform.localEulerAngles = new Vector3(0, -rad/Mathf.PI*180f, 0);
}
READ ALSO
Ошибка преобразования

Ошибка преобразования

Почему высвечивается ошибка CS0029(не получается преобразовать одно в другое)и как мне это сделать?

101
Кодирование Хэмминга

Кодирование Хэмминга

Срочно нужна помощьАлгоритм кодирования (он несложный) доступен по ссылкам:

108
Все аудео дорожки MediaElement - mp4

Все аудео дорожки MediaElement - mp4

Может кто подсказать? Как в WPF заставить MediaElement воспроизводить все аудио дорожки из видеоЯ открываю видео (кусок моего геймплея) но из звука...

83
Распарсить таблицу excel через C#

Распарсить таблицу excel через C#

У меня есть файл, из которого необходимо заполнить базу данныхСтруктура файла сложная(например, значение ячейки С6 зависит от Company name1, Type1,...

223