Oграничение поворота турели

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

Oграничение поворота турели

Сообщение ille 10 июн 2011, 15:30

Есть такой код:
Синтаксис:
Используется javascript
var rotSpeed : float = 30; // скорость поворота орудий
//ткуйщий угол поворота орудий
var thisRotation  : float = 0;

function Update () {
        // сведение передних  групп туреллей  клавишей E,Q
        if(transform.name == "FrontCannon"){
                if (Input.GetKey (KeyCode.E)){
                if(thisRotation > -110) {
                transform.Rotate(Vector3(0, rotSpeed * Time.deltaTime, 0));
                thisRotation -= rotSpeed * Time.deltaTime;
                  }
                }
                if (Input.GetKey (KeyCode.Q)) {
                if(thisRotation < 110) {
                        transform.Rotate(Vector3(0, -rotSpeed * Time.deltaTime, 0));
                        thisRotation += rotSpeed * Time.deltaTime;
                        }
                }
        }

        // сведение задних  групп туреллей  клавишей E,Q.
        if(transform.name == "BackCannon"){
                if (Input.GetKey (KeyCode.Q)) {
                if(thisRotation < 110) {
                transform.Rotate(Vector3(0, rotSpeed * Time.deltaTime, 0));
                thisRotation += rotSpeed * Time.deltaTime;
                    }
                }
                if (Input.GetKey (KeyCode.E)) {
                if(thisRotation > -110) {
                        transform.Rotate(Vector3(0, -rotSpeed * Time.deltaTime, 0));
                        thisRotation -= rotSpeed * Time.deltaTime;
              }
                }
        }

                // поворот передних групп A,D
        if(transform.name == "FrontCannon"){
                if (Input.GetKey (KeyCode.A)) {
                if(thisRotation > -110) {
                transform.Rotate(Vector3(0, rotSpeed * Time.deltaTime, 0));
                thisRotation -= rotSpeed * Time.deltaTime;
                }
                }
                if (Input.GetKey (KeyCode.D)) {
                if(thisRotation < 110) {
                        transform.Rotate(Vector3(0, -rotSpeed * Time.deltaTime, 0));
                        thisRotation += rotSpeed * Time.deltaTime;
                        }
                }
        }

        // поворот задних групп A,D
        if(transform.name == "BackCannon"){
                if (Input.GetKey (KeyCode.A)){
                if(thisRotation > -110) {
                transform.Rotate(Vector3(0, rotSpeed * Time.deltaTime, 0));
                thisRotation -= rotSpeed * Time.deltaTime;
                 }
                }
                if (Input.GetKey (KeyCode.D)) {
                if(thisRotation < 110) {
                        transform.Rotate(Vector3(0, -rotSpeed * Time.deltaTime, 0));
                        thisRotation += rotSpeed * Time.deltaTime;
                        }
                }
        }
}

Скрипт поворачивает орудийные башни на корабле. Башни делятся на передние"FrontCannon" и задние "BackCannon". клавиши QE сводят башни. клавиши AD поворачивают башни синхронно. Проблема в ограничении угла поворота. Если управлять только одной группой клавиш то все работает - башня поворачивается на определенный максимальный угол и останавливается но если перейти на управление другой группой клавиш то башня продолжает движение.
Как сделать что бы при управлении двумя группами клавиш действовало ограничение поворота?
Последний раз редактировалось ille 10 июн 2011, 16:48, всего редактировалось 6 раз(а).
Аватара пользователя
ille
UNец
 
Сообщения: 18
Зарегистрирован: 29 мар 2011, 17:40
Откуда: Санкт-Петербург
Skype: sanipuh
  • Сайт
  • ICQ

Re: Oграничение поворота турели

Сообщение mentors 10 июн 2011, 15:57

Вы думаете в этом унылом листинге без форматирования кто-то будет разбираться?
Теги [syntax=csharp][syntax=javascript] для кого придуманы?
Аватара пользователя
mentors
UNITрон
 
Сообщения: 309
Зарегистрирован: 20 мар 2011, 19:32
Откуда: Россия

Re: Oграничение поворота турели

Сообщение Neodrop 10 июн 2011, 16:06

Тама даже кнопочки есть для ленивых. Теги руками вводить не надо. Выделил и нажал.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Oграничение поворота турели

Сообщение ille 10 июн 2011, 16:49

исправил
Аватара пользователя
ille
UNец
 
Сообщения: 18
Зарегистрирован: 29 мар 2011, 17:40
Откуда: Санкт-Петербург
Skype: sanipuh
  • Сайт
  • ICQ

Re: Oграничение поворота турели

Сообщение mentors 10 июн 2011, 18:19

А где получение текущего положения турели до вызова нового?
Вначале, по логике, нужно получить положение турели, затем проверить не вышло ли оно за диапазон, и только потом управлять поворотом...
thisRotation вообще не нужна. Дстаточно значения оси координат относительно родительского объекта (в вашем случае это Y)...
Аватара пользователя
mentors
UNITрон
 
Сообщения: 309
Зарегистрирован: 20 мар 2011, 19:32
Откуда: Россия

Re: Oграничение поворота турели

Сообщение ille 10 июн 2011, 22:51

Проверку положения нужно производить для всех турелей в отдельности ?
Аватара пользователя
ille
UNец
 
Сообщения: 18
Зарегистрирован: 29 мар 2011, 17:40
Откуда: Санкт-Петербург
Skype: sanipuh
  • Сайт
  • ICQ

Re: Oграничение поворота турели

Сообщение mentors 10 июн 2011, 23:18

ille писал(а):Проверку положения нужно производить для всех турелей в отдельности ?

Конечно, а вдруг одна из турелей по неизвестным причинам оказалась повернута практически на максимум (thisRotation = 99.99) - вот вам и поворот на угол больший заданного значения... Ну а дальше получите все вытекающие последствия.. Особенно при работе с отдельной переменной, в которую вы пишите положение всех турелей...
Аватара пользователя
mentors
UNITрон
 
Сообщения: 309
Зарегистрирован: 20 мар 2011, 19:32
Откуда: Россия

Re: Oграничение поворота турели

Сообщение ille 16 июн 2011, 22:02

К сожалению знаю пока мало и смог переработать только свой вариант. Он наверное достаточно неуклюжий по сравнению с вашим предложением но вроде вполне рабочий. Скрипт для одной турели.
Синтаксис:
Используется javascript
 var rotSpeed : float= 30; // скорость поворота орудий
var yMinLimit = -100;
var yMaxLimit = 100;

//ткуйщий угол поворота орудий
var thisRotation : float= 0;
private var tek_Angles : float;

function Update () {


        // выбираем  группу орудий
        if(transform.name == "BackCannon"){
               
                //если нажата клавиша QE
                if (Input.GetKey (KeyCode.Q)){
       
                if(tek_Angles >= yMinLimit ) { //проверяем значение угла поворота
                transform.Rotate(Vector3(0, rotSpeed * Time.deltaTime, 0));
                thisRotation -= rotSpeed * Time.deltaTime;
                                tek_Angles = thisRotation; //возвращаем текущий угол
                               
                  }
                }
                if (Input.GetKey (KeyCode.E)) {
                if(tek_Angles <= yMaxLimit) { //проверяем значение угла поворота
                        transform.Rotate(Vector3(0, -rotSpeed * Time.deltaTime, 0));
                        thisRotation += rotSpeed * Time.deltaTime;
                                                tek_Angles = thisRotation;
                        }
                }
        }
                               // поворот передних групп A,D
        if(transform.name == "BackCannon"){
                if (Input.GetKey (KeyCode.D)) {
                if(tek_Angles >= yMinLimit) { //проверяем значение угла поворота
                transform.Rotate(Vector3(0, rotSpeed * Time.deltaTime, 0));
                thisRotation -= rotSpeed * Time.deltaTime;
                                tek_Angles = thisRotation;
                }
                }
                if (Input.GetKey (KeyCode.A)) {
                if(tek_Angles <= yMaxLimit) { //проверяем значение угла поворота
                        transform.Rotate(Vector3(0, -rotSpeed * Time.deltaTime, 0));
                        thisRotation += rotSpeed * Time.deltaTime;
                                                tek_Angles = thisRotation;
                        }
                }
        }
}

Спасибо что проявили внимание к моей проблеме!
Аватара пользователя
ille
UNец
 
Сообщения: 18
Зарегистрирован: 29 мар 2011, 17:40
Откуда: Санкт-Петербург
Skype: sanipuh
  • Сайт
  • ICQ

Re: Oграничение поворота турели

Сообщение Prosto_Vasya 21 июл 2011, 18:14

Может вам будет интересно. Я решал похожую задачу только для колеса мотоцикла, вот решение для одной турели:


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

public class NewBehaviourScript : MonoBehaviour {

public float MaxAngle, Speed; // Максимальный угол поворота, скорость поворота
public Transform Cannon; // Пушка которую мы собираемся поворачивать
private Quaternion ZeroRot; //  кватернион нулевой позиций поворота
       
// Use this for initialization
void Start () {
   ZeroRot = Cannon.rotation; // Присваиваем нулевому повороту начальный поворот башни.
}
       
// Update is called once per frame
void Update () {
       
   if ( Input.GetKey("q") ) {
      Cannon.rotation = Quaternion.Slerp(Cannon.rotation,ZeroRot*Quaternion.AngleAxis(MaxAngle, Vector3.forward),
      Speed*Time.deltaTime); // Поворачиваем пушку влево
   }

   if ( Input.GetKey("e") ) {
      Cannon.rotation = Quaternion.Slerp(Cannon.rotation,ZeroRot*Quaternion.AngleAxis((-MaxAngle), Vector3.forward),
      Speed*Time.deltaTime); // Поворачиваем пушку вправо
   }

}

}

 
Prosto_Vasya
UNец
 
Сообщения: 3
Зарегистрирован: 06 июл 2011, 11:34
Откуда: Москва

Re: Oграничение поворота турели

Сообщение Savalin 21 окт 2011, 13:33

Prosto_Vasya писал(а):Может вам будет интересно. Я решал похожую задачу только для колеса мотоцикла, вот решение для одной турели

Мне оказалось очень интересно, спасибо!
Полдня пытался сделать нечто подобное под свой случай и вот наконец-таки увидел рабочий прототип
Savalin
UNец
 
Сообщения: 35
Зарегистрирован: 07 окт 2011, 11:00


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

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 6