Суббота, 23 Ноября 2024, 22:02

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Поворат объекта + Поворот объекта перпендикулярно другому
NoozДата: Суббота, 24 Октября 2015, 16:20 | Сообщение # 1
был не раз
Сейчас нет на сайте
Добрый день!
Я пытаюсь написать скрипт, который позволит игроку стоять вертикально на поворачивающейся платформе. Это получилось, но при этом увы теряется возможность поворачивать игрока в стороны. Подскажите, пожалуйста, как в таком случае заставить игрока поворачиваться вокруг вертикальной оси

Код

    //Platform - платформа на которой стоит игрок
    //rigibody - переменная равна GetComponent<Rigidbody>();
    void FixedUpdate()
    {               
        RaycastHit hit;
        Physics.Raycast(new Ray(transform.position, -transform.up),out hit);        
        var rot = Quaternion.FromToRotation(Vector3.up, hit.normal);     
        rigibody.rotation = rot;

        rigibody.AddForce(-Platform.up * Gravity);
         
        //Вот этот код работает неверно. И лучше бы поворачивать без физики       
        rigibody.AddTorque(transform.up * Input.GetAxis("Horizontal") * 100);
    }
shizofrenДата: Воскресенье, 25 Октября 2015, 10:05 | Сообщение # 2
Starting MS-DOS...
Сейчас нет на сайте
Цитата Nooz ()
позволит игроку стоять вертикально на поворачивающейся платформе

А что ему до этого мешало стоять вертикально на платформе? И по какой оси поворачивается платформа?


Моя команда
NoozДата: Воскресенье, 25 Октября 2015, 12:46 | Сообщение # 3
был не раз
Сейчас нет на сайте
Цитата

А что ему до этого мешало стоять вертикально на платформе?

Когда платформа наклоняется, игрок падает из-за наклона. а если запретить ему наклоняться (заморозить ось) то он стоит не перпендикулярно платформе.

Цитата
И по какой оси поворачивается платформа?

Платформа вращается хаотично. (точнее платформой управляет игрок, и может задать ей любую скорость или вращение. По сути платформа в итоге будет мостиком космического корабля).
shizofrenДата: Воскресенье, 25 Октября 2015, 13:43 | Сообщение # 4
Starting MS-DOS...
Сейчас нет на сайте
Цитата Nooz ()
Когда платформа наклоняется, игрок падает из-за наклона. а если запретить ему наклоняться (заморозить ось) то он стоит не перпендикулярно платформе.

Лично я думаю, что можно сделать так: На платформу поставить триггер, находясь в котором у игрока отключается гравитация (ибо из-за нее он падает вниз). Если игрок нажимает клавиши управления (wasd), тогда гравитация включается. Если же игрок больше ничего не нажимает - гравитация снова отключается.


Моя команда
NoozДата: Воскресенье, 25 Октября 2015, 14:11 | Сообщение # 5
был не раз
Сейчас нет на сайте
Но при этом же если платформу повернуть то игрок будет под наклоном к платформе, а не перпендикулярно?

К тому же мой код (тот что выше) уже держит игрока ровно на платформе в любом ее положении. Но.. Я не могу его поворачивать в стороны направо и налево. Т.к. думаю поворот конфликтует с тем поворотом, что я делаю для выравнивания игрока перпендикулярно платформе.

Я думаю, что вот после этих строк нужно rigibody.rotation умножить на, что то что даст мне нужный поворот но пока я не догадался что именно нужно сделать.

Код
var rot = Quaternion.FromToRotation(Vector3.up, hit.normal);     
rigibody.rotation = rot;
berilДата: Воскресенье, 25 Октября 2015, 17:56 | Сообщение # 6
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
Посмотри этот топик Думаю он твою проблему решит



Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
NoozДата: Воскресенье, 25 Октября 2015, 18:30 | Сообщение # 7
был не раз
Сейчас нет на сайте
Да, Да!! Топик помог! Большое спасибо!!

В итоге код получился примерно таким:
Код

   //Platform - платформа на которой стоит игрок
    //rigibody - переменная равна GetComponent<Rigidbody>();    
    //Gravity - моя переменная.
    float curDir = 0f; // compass indicating direction
    void FixedUpdate()
    {
        float turn = Input.GetAxis("Horizontal");
        curDir = (curDir + turn) % 360;
        RaycastHit hit;
        Physics.Raycast(new Ray(transform.position, -transform.up),out hit);                
        var rot = Quaternion.FromToRotation(Vector3.up, hit.normal);
        var oldrot = rigibody.rotation;
        rigibody.rotation = rot*Quaternion.Euler(0, curDir, 0);        
        rigibody.AddForce(-Platform.up * Gravity);
        rigibody.AddForce(transform.forward * Input.GetAxis("Vertical") * 10 * Speed);
    }
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг