Нужно чтобы поворачивались колеса.

Программирование на Юнити.

Нужно чтобы поворачивались колеса.

Сообщение BANNERTM 09 мар 2012, 22:44

Нужно доделать моему скрипту функцию поворота модели колеса. То есть при нажатии A или D , или -1<steer<1, модели WFR, WFL поворачивались.



Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class MynewCarScript : MonoBehaviour {
       
public bool go = false;
        public bool stop = true;
       
        public WheelCollider WheelBL; //коллайдеры
       
        public WheelCollider WheelBR;
       
        public WheelCollider WheelFL;
       
        public WheelCollider WheelFR;
       
        public Transform COM;//центр тяжести
       
        public Camera MCamera;
       
        public GameObject Body;//корпус авто
       
        public Rigidbody car; //объект кар
       
        public float fwdSpeed;//скорость
       
        public GameObject WFR; //модели колес
        public GameObject WBR;
        public GameObject WFL;
        public GameObject WBL;
       
       
       


        // Use this for initialization
        void Start () {
       
        rigidbody.centerOfMass=COM.localPosition;
       
               
       
        }
       
        // Update is called once per frame
        void Update () {
               
       
                       
               
               
                fwdSpeed = Vector3.Dot(car.velocity,car.transform.forward);    
               
               
               
               
                WBR.transform.Rotate(0,-3*Time.fixedDeltaTime*WheelBR.rpm,0);//кручение модели колеса в зависимости от скорости авто
                WBL.transform.Rotate(0,-3*Time.fixedDeltaTime*WheelBL.rpm,0);
               
                 WFL.transform.Rotate(0,-3*Time.fixedDeltaTime*WheelFL.rpm,0);
                WFR.transform.Rotate(0,-3*Time.fixedDeltaTime*WheelFR.rpm,0);
               
       
                float steer = 0;
               
                float  speed = 0;
               
                 steer = Input.GetAxis("Horizontal");  
                speed = Input.GetAxis("Vertical");
               
               
               
               
               
               
               
               
               
               
               
                WheelFL.steerAngle=30*steer;   //поворот коллайдеров
                        WheelFR.steerAngle=30*steer;
               
       
               
               
               
               
               
       
               
               
       
               
               
                WheelBR.motorTorque=0;
        WheelBL.motorTorque=0;
               
                WheelBL.brakeTorque=0;
                        WheelBR.brakeTorque=0;
               
                if(Input.GetKey(KeyCode.W)){
                       
                        WheelBL.motorTorque=10*speed;
                        WheelBR.motorTorque=10*speed;
                }
                if(Input.GetKey(KeyCode.S)){
                        WheelBL.motorTorque=-10;
                        WheelBR.motorTorque=-10;
                }
               
                if(Input.GetKey(KeyCode.D)){
                        WheelFL.steerAngle=30*steer;
                        WheelFR.steerAngle=30*steer;
                       
                       
                       
                       
                }
       
                if(Input.GetKey(KeyCode.A)){
                        WheelFL.steerAngle=30*steer;
                        WheelFR.steerAngle=30*steer;
                       
                }
               
               
               
        }
       
       
       
}

 
BANNERTM
UNITрон
 
Сообщения: 241
Зарегистрирован: 26 фев 2012, 00:13

Re: Нужно чтобы поворачивались колеса.

Сообщение DeHHu 09 мар 2012, 23:31

у тебя есть steerAngle, вот это значение передавай по нужно оси на передниее колеса)

p.s.Условия со считыванием клавиш WASD лишние
Просто написать
Синтаксис:
Используется csharp
                        WheelBL.motorTorque=10*speed;
                        WheelBR.motorTorque=10*speed;
                        WheelFL.steerAngle=30*steer;  
                         WheelFR.steerAngle=30*steer;
 


это как очень простой пример) и еще, лучше расчет физики делать в FixedUpdate, а считывание клавиш в Update
DeHHu
UNец
 
Сообщения: 41
Зарегистрирован: 22 янв 2012, 11:32
Skype: dehhhu

Re: Нужно чтобы поворачивались колеса.

Сообщение BANNERTM 10 мар 2012, 08:03

DeHHu писал(а):у тебя есть steerAngle, вот это значение передавай по нужно оси на передниее колеса)

p.s.Условия со считыванием клавиш WASD лишние
Просто написать
Синтаксис:
Используется csharp
                        WheelBL.motorTorque=10*speed;
                        WheelBR.motorTorque=10*speed;
                        WheelFL.steerAngle=30*steer;  
                         WheelFR.steerAngle=30*steer;
 


это как очень простой пример) и еще, лучше расчет физики делать в FixedUpdate, а считывание клавиш в Update


А как осуществить локальное вращение? То есть чтобы колесо не ходило восьмеркой при повороте и вращении колеса?
BANNERTM
UNITрон
 
Сообщения: 241
Зарегистрирован: 26 фев 2012, 00:13

Re: Нужно чтобы поворачивались колеса.

Сообщение BANNERTM 10 мар 2012, 09:07

Осуществил поворот через:

Синтаксис:
Используется csharp
WFL.transform.localRotation=Quaternion.Euler(0,steer*30,90);   

 



НО! При повороте колеса прекращают свое вращение!

Все еще нужна помощь!!!!

P.s Попробовал Сделать вращение через WFL.transform.localRotation=Quaternion.Euler(WheelFL.rpm*10,0,90);

НО! Колеса вращаются только если нажата кнопка!
BANNERTM
UNITрон
 
Сообщения: 241
Зарегистрирован: 26 фев 2012, 00:13

Re: Нужно чтобы поворачивались колеса.

Сообщение BANNERTM 10 мар 2012, 10:22

Кажется нашел как нормально повернуть колеса:
Синтаксис:
Используется csharp
Vector3 NSR = WFR.transform.InverseTransformDirection(0,Time.fixedDeltaTime*steer*30,0);
Vector3 NSL = WFL.transform.InverseTransformDirection(0,Time.fixedDeltaTime*steer*30,0);        
       
       
               
        WFR.transform.Rotate(NSR);
        WFL.transform.Rotate(NSL);
 


Теперь другой вопрос: как ограничить поворот до 30 градусов? А то они бесконечно крутятся

Если у кого есть другой вариант поворота колес, который работает с моим скриптом , то выкладывайте.
BANNERTM
UNITрон
 
Сообщения: 241
Зарегистрирован: 26 фев 2012, 00:13

Re: Нужно чтобы поворачивались колеса.

Сообщение GIGABAR 10 мар 2012, 11:29

BANNERTM писал(а):Кажется нашел как нормально повернуть колеса:
Синтаксис:
Используется csharp
Vector3 NSR = WFR.transform.InverseTransformDirection(0,Time.fixedDeltaTime*steer*30,0);
Vector3 NSL = WFL.transform.InverseTransformDirection(0,Time.fixedDeltaTime*steer*30,0);        
       
       
               
        WFR.transform.Rotate(NSR);
        WFL.transform.Rotate(NSL);
 


Теперь другой вопрос: как ограничить поворот до 30 градусов? А то они бесконечно крутятся

Если у кого есть другой вариант поворота колес, который работает с моим скриптом , то выкладывайте.


Думаю вот это подойдет.
Синтаксис:
Используется javascript
public float steeringAngle;     // здесь короче в инспекторе вобьеш на сколько должны поворачиваться колеса...
public Transform wheelFL;
public Transform wheelFL;    // или GameObject;

function FixedUpdate(){  //тут дальше сам подкрути к c#, лень переписывать...)
steeringInput = Input.GetAxis("Horizontal"); // т.е. это клавиши a, d, стрелка влево и стрелка вправо...  
wheelFL.localRotation = wheelFR.localRotation = Quaternion.LookRotation(Vector3(steeringInput * (steeringAngle / 90), 0, 1 + (-1 * Mathf.Abs(steeringInput * (steeringAngle / 90))) ));
}
 

еще можешь прикрутить угол поворота колеса в зависимости от скорости steeringAngle = Mathf.Lerp(макс угол, мин угол, ригидбоди.велосити.магнитуде / на скорость твоего авто);
удачи))
_https://www.youtube.com/watch?v=Pjl54PuULQw - дрифт гоночки поделываю:))
Аватара пользователя
GIGABAR
UNITрон
 
Сообщения: 266
Зарегистрирован: 11 май 2011, 16:05
Откуда: Алматы

Re: Нужно чтобы поворачивались колеса.

Сообщение BANNERTM 10 мар 2012, 11:44

GIGABAR писал(а):
BANNERTM писал(а):Кажется нашел как нормально повернуть колеса:
Синтаксис:
Используется csharp
Vector3 NSR = WFR.transform.InverseTransformDirection(0,Time.fixedDeltaTime*steer*30,0);
Vector3 NSL = WFL.transform.InverseTransformDirection(0,Time.fixedDeltaTime*steer*30,0);        
       
       
               
        WFR.transform.Rotate(NSR);
        WFL.transform.Rotate(NSL);
 


Теперь другой вопрос: как ограничить поворот до 30 градусов? А то они бесконечно крутятся

Если у кого есть другой вариант поворота колес, который работает с моим скриптом , то выкладывайте.


Думаю вот это подойдет.
Синтаксис:
Используется javascript
public float steeringAngle;     // здесь короче в инспекторе вобьеш на сколько должны поворачиваться колеса...
public Transform wheelFL;
public Transform wheelFL;    // или GameObject;

function FixedUpdate(){  //тут дальше сам подкрути к c#, лень переписывать...)
steeringInput = Input.GetAxis("Horizontal"); // т.е. это клавиши a, d, стрелка влево и стрелка вправо...  
wheelFL.localRotation = wheelFR.localRotation = Quaternion.LookRotation(Vector3(steeringInput * (steeringAngle / 90), 0, 1 + (-1 * Mathf.Abs(steeringInput * (steeringAngle / 90))) ));
}
 

еще можешь прикрутить угол поворота колеса в зависимости от скорости steeringAngle = Mathf.Lerp(макс угол, мин угол, ригидбоди.велосити.магнитуде / на скорость твоего авто);
удачи))


Хм. Вставил в свой скрипт но компилится не хочет , пишет: Expression denotes a 'type' , where 'varible', 'value' or 'method group' was expected
BANNERTM
UNITрон
 
Сообщения: 241
Зарегистрирован: 26 фев 2012, 00:13

Re: Нужно чтобы поворачивались колеса.

Сообщение AndreyMust19 10 мар 2012, 12:12

Очевидно один wheelFL требуется заменить на wheelFR.
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами
AndreyMust19
Адепт
 
Сообщения: 1119
Зарегистрирован: 07 июн 2011, 13:19

Re: Нужно чтобы поворачивались колеса.

Сообщение BANNERTM 10 мар 2012, 12:41

GIGABAR писал(а):
BANNERTM писал(а):Кажется нашел как нормально повернуть колеса:
Синтаксис:
Используется csharp
Vector3 NSR = WFR.transform.InverseTransformDirection(0,Time.fixedDeltaTime*steer*30,0);
Vector3 NSL = WFL.transform.InverseTransformDirection(0,Time.fixedDeltaTime*steer*30,0);        
       
       
               
        WFR.transform.Rotate(NSR);
        WFL.transform.Rotate(NSL);
 


Теперь другой вопрос: как ограничить поворот до 30 градусов? А то они бесконечно крутятся

Если у кого есть другой вариант поворота колес, который работает с моим скриптом , то выкладывайте.


Думаю вот это подойдет.
Синтаксис:
Используется javascript
public float steeringAngle;     // здесь короче в инспекторе вобьеш на сколько должны поворачиваться колеса...
public Transform wheelFL;
public Transform wheelFL;    // или GameObject;

function FixedUpdate(){  //тут дальше сам подкрути к c#, лень переписывать...)
steeringInput = Input.GetAxis("Horizontal"); // т.е. это клавиши a, d, стрелка влево и стрелка вправо...  
wheelFL.localRotation = wheelFR.localRotation = Quaternion.LookRotation(Vector3(steeringInput * (steeringAngle / 90), 0, 1 + (-1 * Mathf.Abs(steeringInput * (steeringAngle / 90))) ));
}
 

еще можешь прикрутить угол поворота колеса в зависимости от скорости steeringAngle = Mathf.Lerp(макс угол, мин угол, ригидбоди.велосити.магнитуде / на скорость твоего авто);
удачи))


Теперь эти колеса не вращаются!
BANNERTM
UNITрон
 
Сообщения: 241
Зарегистрирован: 26 фев 2012, 00:13

Re: Нужно чтобы поворачивались колеса.

Сообщение BANNERTM 10 мар 2012, 12:47

AndreyMust19 писал(а):Очевидно один wheelFL требуется заменить на wheelFR.

Это понятно, я все сделал так как сказал мне товарищ выше, но теперь эти передние колеса не вращаются и стоят боком.
BANNERTM
UNITрон
 
Сообщения: 241
Зарегистрирован: 26 фев 2012, 00:13

Re: Нужно чтобы поворачивались колеса.

Сообщение BANNERTM 10 мар 2012, 13:16

Вообщем вот такой код получается, теперь добавил функцию поворота передним колесам , но передние колеса омертвели и больше не крутсятся!
ПОмогите! :((

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class MynewCarScript : MonoBehaviour {
       
public bool go = false;
        public bool stop = true;
       
        public WheelCollider WheelBL; //коллайдеры
       
        public WheelCollider WheelBR;
       
        public WheelCollider WheelFL;
       
        public WheelCollider WheelFR;
       
        public Transform COM;//центр тяжести
       
        public Camera MCamera;
       
        public GameObject Body;//корпус авто
       
        public Rigidbody car; //объект кар
       
        public float fwdSpeed;//скорость
       
        public GameObject WFR; //модели колес
        public GameObject WBR;
        public GameObject WFL;
        public GameObject WBL;
       
        public float maxsteer = 30;

public float steeringAngle=30;

        // Use this for initialization
        void Start () {
       
        rigidbody.centerOfMass=COM.localPosition;
       
         
       
        }
       
        // Update is called once per frame
        void Update () {
               
       
                       
               
               
                fwdSpeed = Vector3.Dot(car.velocity,car.transform.forward);    
               
               
               
               
                WBR.transform.Rotate(0,-3*Time.fixedDeltaTime*WheelBR.rpm,0);//кручение модели колеса в зависимости от скорости авто
                WBL.transform.Rotate(0,-3*Time.fixedDeltaTime*WheelBL.rpm,0);
               
                 WFL.transform.Rotate(0,-3*Time.fixedDeltaTime*WheelFL.rpm,0);
                WFR.transform.Rotate(0,-3*Time.fixedDeltaTime*WheelFR.rpm,0);
               
       
               
               
               
                float steer = 0;
               
                float  speed = 0;
               
                 steer = Input.GetAxis("Horizontal");  
                speed = Input.GetAxis("Vertical");
               
               
               
               
               
               
       
               
               
               
                WheelFL.steerAngle=30*steer;   //поворот коллайдеров
                        WheelFR.steerAngle=30*steer;
               
       
               
               
     WFR.transform.localRotation=Quaternion.Euler(0,steer*30,90);  // Поворот моделей
                WFL.transform.localRotation=Quaternion.Euler(0,steer*30,90);
       
       
               
               
                WheelBR.motorTorque=0;
        WheelBL.motorTorque=0;
               
                WheelBL.brakeTorque=0;
                        WheelBR.brakeTorque=0;
               
               
               
               
                Debug.Log ("0");
               
               
                //if(Input.GetKey(KeyCode.W)){
                       
                        WheelBL.motorTorque=-10*speed;
                        WheelBR.motorTorque=-10*speed;
                //}
                //if(Input.GetKey(KeyCode.S)){
                        WheelBL.motorTorque=10*speed;
                        WheelBR.motorTorque=10*speed;
                //}
               
                if(Input.GetKey(KeyCode.D)){
                        WheelFL.steerAngle=30*steer;
                        WheelFR.steerAngle=30*steer;
                       
                       
                       
                       
                }
       
                if(Input.GetKey(KeyCode.A)){
                        WheelFL.steerAngle=30*steer;
                        WheelFR.steerAngle=30*steer;
                       
                       
                }
               
               
        }
       
       
       
}
 
BANNERTM
UNITрон
 
Сообщения: 241
Зарегистрирован: 26 фев 2012, 00:13

Re: Нужно чтобы поворачивались колеса.

Сообщение BANNERTM 11 мар 2012, 00:08

Извините еще вот такой вопрос: почему функция Quaternion.Euler(0,WheelFL.rpm,0);(это вращает колесо) выполняется только при нажатии кнопки? Если кнопку отпустить колесо замрет?
BANNERTM
UNITрон
 
Сообщения: 241
Зарегистрирован: 26 фев 2012, 00:13

Re: Нужно чтобы поворачивались колеса.

Сообщение BANNERTM 11 мар 2012, 11:49

Все проблема решилась сама собой
Я использовал Mathf.Reapet и Quaternion.Euler для вращения

Тему можно закрывать
BANNERTM
UNITрон
 
Сообщения: 241
Зарегистрирован: 26 фев 2012, 00:13


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8