Поворат объекта + Поворот объекта перпендикулярно другому
|
|
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); }
|
|
| |