Пятница, 03 Мая 2024, 02:59

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Что в этом скрипте не так?
Что в этом скрипте не так?
ArtemoidДата: Воскресенье, 24 Мая 2015, 20:23 | Сообщение # 1
частый гость
Сейчас нет на сайте
Привет всем! Делаю игру про космос, а точнее её управление, покачто.
Надо так: повернул камеру, космический корабль медленно довернул до поворота камеры.
Прицепил я на пустой обьект камеру(координаты пустого обьекта такие же как у модельки корабля) и сделал обычный скрипт поворота мышью.
На корабль нацепил вот(покачто только для оси Y для начала) :

Код
public class RotShip : MonoBehaviour {
public GameObject GameObject1;
public GameObject Ship;
public float RotSpeed = 1.0f;
// Use this for initialization
void Awake () {
}

// Update is called once per frame
void Update () {
//RotSpeed *= Time.deltaTime;
if (GameObject1.transform.rotation.y > Ship.transform.rotation.y) {
transform.Rotate(0,RotSpeed,0);
}
}
}


Всё вроде бы хорошо, но когда доходит корабль до 180 градусного поврота, то отказывается поворачиваться.
Что в этом скрипте не так?
MANMANAДата: Воскресенье, 24 Мая 2015, 22:03 | Сообщение # 2
почти ветеран
Сейчас нет на сайте
if (GameObject1.transform.rotation.y > Ship.transform.rotation.y) {
transform.rotation хранит координаты в кватернионе

if (GameObject1.transform.localEulerAngles.y > Ship.transform.localEulerAngles.y) {

но тут стоит учитывать, что после 360 градусов идет 0. Часто возникает такая ситуация, что у пустого объекта может быть угол в 10 градусов, а у корабля - в 350 градусов, и здесь не всегда подходит сравнение "если 350 > 10"...
Однако учитывая, что у вас поворот идет в одну сторону, то это не важно smile


http://www.3dbuffer.com/ Текстуры, Unity3D, Blender: Эффекты, скрипты, моделирование, текстурирование, скульптинг
VKонтакте 3Dbuffer

Последнее:

Новый раздел "Текстуры"

Как запатентовать, защитить техническое решение, игру, идею
ArtemoidДата: Вторник, 26 Мая 2015, 22:08 | Сообщение # 3
частый гость
Сейчас нет на сайте
Цитата MANMANA ()
О

Понял как это сделать, но опять проблема: корабль при повороте дёргается(поворот уже по двум осям).
Судя по всему просто выполняется поворот по двум осям по очереди...как это сгладить?
Скрипт:
Код
void FixedUpdate () {
razY = GameObject1.transform.localEulerAngles.y - Ship.transform.localEulerAngles.y;
razX = GameObject1.transform.localEulerAngles.x - Ship.transform.localEulerAngles.x;

float x = 0;
float y = 0;

//Ось Y
if (razY > 1) {
if (razY > 180) {
y = -RotSpeedY;
} else if (razY < 180) {
y = RotSpeedY;
}
}
if (razY < -1) {
if (razY < -180) {
y = RotSpeedY;
} else if (razY > -180) {
y = -RotSpeedY;
}
}

//Ось X
if (razX > 1) {
if (razX > 180) {
x = -RotSpeedX;
} else if (razX < 180) {
x = RotSpeedX;
}
}

if (razX < -1) {
if (razX < -180) {
x = RotSpeedX;
} else if (razX > -180) {
x = -RotSpeedX;
}
}

transform.Rotate (x, y, 0);
}
ValterДата: Вторник, 26 Мая 2015, 22:46 | Сообщение # 4
почетный гость
Сейчас нет на сайте
Проблема в том, что Вы не хотите работать с кватернионом, как с цельным объектом, а пытаетесь менять отдельно x,y через эйлеровы углы.
Повести вот это на свой объект:

Код

void Update () {
   Vector3 cur_pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
   Vector3 rel_pos = cur_pos - transform.position;
   transform.rotation = Quaternion.LookRotation(new Vector3(rel_pos.x, rel_pos.y, transform.position.z));
}
ArtemoidДата: Среда, 27 Мая 2015, 16:58 | Сообщение # 5
частый гость
Сейчас нет на сайте
Цитата Valter ()
Повести вот это на свой объект:

Я в принцепе понимаю что там, но у меня работает не понятно как и я не понимаю почему..
Цитата Valter ()
Вы не хотите работать с кватернионом

Да, не хочу ибо не нашёл нормального обьяснения нигде. На той же офф.документации обьяснено в качестве какой-то штуки, которая связана с углами и основанна она на высшей математике..

Добавлено (27 мая 2015, 16:58)
---------------------------------------------

Цитата Artemoid ()
Да, не хочу

Сделал biggrin
Ship.transform.rotation = Quaternion.Slerp (Ship.transform.rotation, GameObject1.transform.rotation,Time.deltaTime * RotSpeed );
Как теперь сделать разную скорость поворота по разным осям?
RangerДата: Среда, 27 Мая 2015, 17:12 | Сообщение # 6
почти ветеран
Сейчас нет на сайте
разложить на углы эйлера и слерпить к ним с разной скоростью



Сообщение отредактировал Ranger - Среда, 27 Мая 2015, 17:27
ArtemoidДата: Четверг, 28 Мая 2015, 20:06 | Сообщение # 7
частый гость
Сейчас нет на сайте
Цитата Ranger ()
разложить на углы эйлера и слерпить к ним с разной скоростью

Напишите ,пожалуйста, пробовал по разному и не понимаю как :/
RangerДата: Четверг, 28 Мая 2015, 20:38 | Сообщение # 8
почти ветеран
Сейчас нет на сайте
Набирал код в блокноте.
Могут быть ошибки.
Но идея, думаю, понятна.

Код

{
   Quaternion sx,sy,sz;
   sx = Quaternion.Euler(transform.rotation.euler.x,0,0);
   sy = Quaternion.Euler(0,transform.rotation.euler.y,0);
   sz = Quaternion.Euler(0,0,transform.rotation.euler.z);
   Quaternion tx,ty,tz;
   tx = Quaternion.Euler(target.transform.rotation.euler.x,0,0);
   ty = Quaternion.Euler(0,target.transform.rotation.euler.y,0);
   tz = Quaternion.Euler(0,0,target.transform.rotation.euler.z);
     
   transform.rotation = Quaternion.Slerp(sx,tx,Time.deltatime*Vx)*Quaternion.Slerp(sy,ty,Time.deltatime*Vy)*Quaternion.Slerp(sz,tz,Time.deltatime*Vz);
}

Есть вероятность нахватить Замок Эйлера. Нужно пробовать, если возникнет проблема, тогда брать относительный поворот Quaternion.FromToRotation и раскладывать его.
вращать этим Quaternion.RotateTowards. float maxDegreesDelta считать от угловых скоростей.




Сообщение отредактировал Ranger - Четверг, 28 Мая 2015, 20:46
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Что в этом скрипте не так?
  • Страница 1 из 1
  • 1
Поиск:

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