Управление мышкой(Решена внутри код)

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

Управление мышкой(Решена внутри код)

Сообщение ziat 18 окт 2009, 21:52

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

Чем дальше отклоняется мышка от области тем круче поворот...

Как такую фичу реализовать в юнити?
Последний раз редактировалось ziat 19 окт 2009, 18:23, всего редактировалось 1 раз.
ziat
UNITрон
 
Сообщения: 199
Зарегистрирован: 07 окт 2009, 21:28
  • Сайт

Re: Управление мышкой

Сообщение Zavhoz 19 окт 2009, 05:14

тут много вариаций... как вариант, ширину экрана делить на несклько частей, и относиетльно позиции курсора в той илиинной облсти продолжать работать. второй вариант, чем дальше курсор от центра, тем сильней эффект.
а если честно, то вопрос очень неправильный, тут скорей логику надо включать, нежели полагаться на знания юнити (ИМХО).
FUNNY BLOX
Аватара пользователя
Zavhoz
UNITрон
 
Сообщения: 197
Зарегистрирован: 10 фев 2009, 07:23
Откуда: Караганда KZ
  • ICQ

Re: Управление мышкой

Сообщение ziat 19 окт 2009, 15:06

Скажем так логику включал, но знания юнити не хватает(
(Просто надеялся что есть какие-нить стандартные скрипты, а то когда я начианю логику включать порой иду из Москвы в Питер через камчатку)
Выбрал второй вариант, только совладать с кодом немогу....

Код: Выделить всё
var h= 1;
var v= 1;
private var hm = Vector3.zero;
private var vm = Vector3.zero;
private var centerm = Vector3.zero;
function Awake()
{
centerm=Input.mousePosition; //тут задаём чтобы позиция курсора при старте считалась центром
}

function Update ()
{
    var hr;
   var vr;
   Screen.showCursor = false;
   //var hr =h*Input.GetAxis ("Mouse X");
    //var vr =v*Input.GetAxis ("Mouse Y");
   vm=Vector3(0,1)*Input.mousePosition; /тут и ниже чувствую (судя по кол-ву ошибок компилятора юнити) идёт полная ересь, но надеюсь ход мысли понятен/
   hm=Vector3(1,0)*Input.mousePosition;
      if (centerm*Vector3(0,1)-vm>=Vector3(0,50)){if (centerm-vm>=Vector3(0,100)){vr=v*2;} else{vr=v;}}
      if (centerm*Vector3(0,1)-vm>=Vector3(0,-50)){if (centerm-vm>=Vector3(0,-100)){vr=v*-2;} else{vr=v*-1;}}
      if (centerm*Vector3(1,0)-hm>=Vector3(50,0)){if (centerm-hm>=Vector3(100,0)){hr=v*2;} else{hr=v;}}
      if (centerm*Vector3(1,0)-hm>=Vector3(-50,0)){if (centerm-hm>=Vector3(-100,0)){hr=v*-2;} else{hr=v*-1;}}
    transform.Rotate (vr, 0, hr);
}


Собственно туда ли иду?(по логике) и если туда то как исправить код?)
ziat
UNITрон
 
Сообщения: 199
Зарегистрирован: 07 окт 2009, 21:28
  • Сайт

Re: Управление мышкой

Сообщение Tolking 19 окт 2009, 15:37

:)Ихмо Screen.showCursor = false; В аадейте это сильно!

На Юнити не пишу но ИХМО чем ближе к краю экрана, тем быстрее.
Код: Выделить всё
var DH = 50;//Типа на каком растоянии от края начинать поворот

private var ScreenDX ;
private var ScreenDY ;

function Awake()
{
ScreenDX=ПолучитьШиринуЭкрана(); //Где нибуть в Screen наверняка есть
ScreenDY=ПолучитьВысотуЭкрана(); //Где нибуть в Screen наверняка есть (Но это если окно фикс размера)
Screen.showCursor = false;
}

function Update ()
{
vm = Input.mousePosition;

dx=0//"Скорость" по Х
dy=0//"Скорость" по Y

If (vm.x<DH)
{
dx=vm.x-DH//Отрицательная скорость - влево
}

If (vm.x>ScreenDX-DH)
{
dx=vm.x-ScreenDX//Положительная скорость - вправо
}

dx=dx*3//регулеровка градации скорост, можно хоть dx=dx*dx сделать

If (vm.y<DH)
{
dy=vm.y-DH//Отрицательная скорость - вверх
}

If (vm.y>ScreenDY-DH)
{
dy=vm.y-ScreenDY//Положительная скорость - вниз
}

dy=dy*3//регулеровка градации скорости, можно сделать другой закон не такой как для Х

transform.Rotate (dx, 0, dy);//Здесь должна быть функция которая поварачивает на дельту, а не устанавливает угол. Либо вычислять новый угол через дельту и подставлять...
}
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Управление мышкой

Сообщение ziat 19 окт 2009, 15:46

Спс) ход мыслей понял и свую ошибку тоже)

на счёт этого не спорю)
Screen.showCursor = false

Но ведь работало)

А на счёт функции я наверно через Torque напишу
ziat
UNITрон
 
Сообщения: 199
Зарегистрирован: 07 окт 2009, 21:28
  • Сайт

Re: Управление мышкой

Сообщение Tolking 19 окт 2009, 16:00

если от центра:
Код: Выделить всё
var DHX = 50;//Типа на каком растоянии от центра начинать поворот X
var DHY = 50;//Типа на каком растоянии от центра начинать поворот Y

private var ScreenDX ;
private var ScreenDY ;

function Awake()
{
ScreenDX=ПолучитьШиринуЭкрана()/2; //Где нибуть в Screen наверняка есть
ScreenDY=ПолучитьВысотуЭкрана()/2; //Где нибуть в Screen наверняка есть (Но это если окно фикс размера)
Screen.showCursor = false;
}

function Update ()
{
vm = Input.mousePosition;

dx=0//"Скорость" по Х
dy=0//"Скорость" по Y

dx=vm.x-ScreenDX//Отрицательная скорость - влево, положительная вправо

If (abs(dx)<DHX)
{
dx=0
}

dx=dx*3//регулеровка градации скорост, можно хоть dx=dx*dx сделать

dy=vm.y-DH//Отрицательная скорость - вверх, Положительная скорость - вниз

If (abs(dy)<DHY)
{
dy=0
}

dy=dy*3//регулровка градации скорости, можно сделать другой закон не такой как для Х

transform.Rotate (dx, 0, dy);//Здесь должна быть функция которая поварачивает на дельту, а не устанавливает угол. Либо вычислять новый угол через дельту и подставлять...
}
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Управление мышкой

Сообщение ziat 19 окт 2009, 16:28

Значит код почти исправил
Код: Выделить всё
var h= 0.5;
var v= 0.5;
private var vm;
private var centerm = Vector3.zero;
function Awake()
{
centerm=Vector3(Screen.width/2,Screen.height/2);
}

function Update ()
{
    var hr;
   var vr;
   //var hr =h*Input.GetAxis ("Mouse X");
    //var vr =v*Input.GetAxis ("Mouse Y");
   vm=Input.mousePosition;
      if (centerm.y-vm.y<=-10){if (centerm.y-vm.y<=Screen.height/-6){vr=v*-2;} else{vr=v*-1;}}
      if (centerm.y-vm.y>=-10){if (centerm.y-vm.y>=Screen.height/6){vr=v*2;} else{vr=v;}}
      if (centerm.x-vm.x<=-10){if (centerm.x-vm.x<=Screen.width/-6){hr=h*-2;} else{hr=h*-1;}}
      if (centerm.x-vm.x>=-10){if (centerm.x-vm.x>=Screen.width/6){hr=h*2;} else{hr=h;}}
    rigidbody.AddRelativeTorque (new Vector3(1.0, 0.0, 0.0 )*vr * Time.deltaTime, ForceMode.VelocityChange);
   rigidbody.AddRelativeTorque (new Vector3(0.0, 0.0, 1.0 )*hr * Time.deltaTime, ForceMode.VelocityChange);
   
}


ТОлько образовалась полоса внутри которой движение по х не происходит( по ширене на глаз она около 20 пикселей)
ziat
UNITрон
 
Сообщения: 199
Зарегистрирован: 07 окт 2009, 21:28
  • Сайт

Re: Управление мышкой

Сообщение ziat 19 окт 2009, 17:31

С горизонтальной полосой не получается побороться((((
не пойму откуда она берётся
ziat
UNITрон
 
Сообщения: 199
Зарегистрирован: 07 окт 2009, 21:28
  • Сайт

Re: Управление мышкой

Сообщение ziat 19 окт 2009, 18:23

Всё справился сам
Код: Выделить всё
var h= 0.1;
var v= 0.1;
private var vm;
private var centerm = Vector3.zero;
function Awake()
{
centerm=Vector3(Screen.width/2,Screen.height/2);
}

function Update ()
{
    var hr;
   var vr;
   
   vm=Input.mousePosition;
   var w=((Screen.width - 2*vm.x)/Screen.width)*50;
   var wh=((Screen.height - 2*vm.y)/Screen.height)*50;
      if (centerm.y-vm.y<=50){vr=-v*wh;}
      if (centerm.y-vm.y>=-50){vr=-v*wh;}
      if (centerm.x-vm.x<=50){hr=-h*w;}
      if (centerm.x-vm.x>=-50){hr=-h*w;}
    rigidbody.AddRelativeTorque (new Vector3(1.0, 0.0, 0.0 )*vr * Time.deltaTime, ForceMode.VelocityChange);
   rigidbody.AddRelativeTorque (new Vector3(0.0, 0.0, 1.0 )*hr * Time.deltaTime, ForceMode.VelocityChange);
   
}


мб кому нить пригодится
ziat
UNITрон
 
Сообщения: 199
Зарегистрирован: 07 окт 2009, 21:28
  • Сайт


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

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

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