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