Создаем FPS в Unity3D [текст]. - Форум Игроделов
Пт, 26 Апр 2024, 23:05 
 
Приветствую Вас Гость Главная | Регистрация | Вход
Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум Игроделов » UNITY3D » МАНУАЛЫ И УРОКИ » Создаем FPS в Unity3D [текст].
Создаем FPS в Unity3D [текст].
Zer0nДата: Пт, 04 Фев 2011, 13:12 | Сообщение # 1
 
Сообщений: 880
Награды: 23
Репутация: 516
Статус: Offline
Cоздание шутера от первого лица в Unity3D.

Здравствуйте, дорогие пользователи форума!
Сегодня я начинаю серию уроков по созданию шутера от 1 лица (FPS) на движке Unity3D.

Всем привет, это вторая часть урока. Сегодня мы займемся бегом.
Откроем проект из предыдущего урока. Для начала добавим в наш скрипт функцию SetSpeed, принимающую в качестве параметра переменную speed типа int, обозначающую скорость. Для тех, кто в танке, скажу, что объявляем ее в теле класса, после функции Update.

Как же мы будем устанавливать скорость? Давайте посмотрим наш объект Player

Видите в скрипте Character Motor в разделе Movement три переменные, которые я выделил? Они отвечают за скорость движения вперед, в стороны и назад соответственно - именно они нам и нужны. Создадим переменную для хранения ссылки на CharacterMotor в начале класса.

Получим ссылку на наш класс в функции Start.

Давайте заполним тело нашей функции. Просто задаем нужным переменным нужное значение.




Сообщение отредактировал Zer0n - Сб, 05 Фев 2011, 19:18
 
Сообщение
Cоздание шутера от первого лица в Unity3D.

Здравствуйте, дорогие пользователи форума!
Сегодня я начинаю серию уроков по созданию шутера от 1 лица (FPS) на движке Unity3D.

Всем привет, это вторая часть урока. Сегодня мы займемся бегом.
Откроем проект из предыдущего урока. Для начала добавим в наш скрипт функцию SetSpeed, принимающую в качестве параметра переменную speed типа int, обозначающую скорость. Для тех, кто в танке, скажу, что объявляем ее в теле класса, после функции Update.

Как же мы будем устанавливать скорость? Давайте посмотрим наш объект Player

Видите в скрипте Character Motor в разделе Movement три переменные, которые я выделил? Они отвечают за скорость движения вперед, в стороны и назад соответственно - именно они нам и нужны. Создадим переменную для хранения ссылки на CharacterMotor в начале класса.

Получим ссылку на наш класс в функции Start.

Давайте заполним тело нашей функции. Просто задаем нужным переменным нужное значение.

Автор - Zer0n
Дата добавления - 04 Фев 2011 в 13:12
Max-HunterДата: Пн, 04 Июл 2011, 20:46 | Сообщение # 2
Нет аватара
 
Сообщений: 151
Награды: 1
Репутация: 60
Статус: Offline
Не получается бег! 'The type a namespace name 'CharacterMotor' could not be found. Are you missing a using directive or an assembly reference?'
Выложите плиз (!)весь(!) скрипт.Возможно не туды вставил loony
 
СообщениеНе получается бег! 'The type a namespace name 'CharacterMotor' could not be found. Are you missing a using directive or an assembly reference?'
Выложите плиз (!)весь(!) скрипт.Возможно не туды вставил loony

Автор - Max-Hunter
Дата добавления - 04 Июл 2011 в 20:46
ShutДата: Пн, 04 Июл 2011, 23:53 | Сообщение # 3
 
Сообщений: 608
Награды: 2
Репутация: 258
Статус: Offline
Max-Hunter, у меня все замечательно работало.
Quote (Max-Hunter)
Возможно не туды вставил



Где арахисы - там и зима.
 
СообщениеMax-Hunter, у меня все замечательно работало.
Quote (Max-Hunter)
Возможно не туды вставил


Автор - Shut
Дата добавления - 04 Июл 2011 в 23:53
Max-HunterДата: Сб, 10 Сен 2011, 18:17 | Сообщение # 4
Нет аватара
 
Сообщений: 151
Награды: 1
Репутация: 60
Статус: Offline
Quote (Shut)
ТЫ копипастишь?! wacko Мой тебе совет:переписывай код сам,не копипасть!Если будешь тупо копипастить,далеко не уедешь.
Ээээ....дЫк я ещё не выучил....Если я скопипастить не могу,какое сам пиши!

Quote (Shut)
Zer0n, выкладывай код скринами biggrin

Я только за!!!!!!! biggrin
Всё исправил!

Добавлено (10.09.2011, 18:17)
---------------------------------------------
Опять не получается сделать...Куда надо впихнуть
Code
    // устанавливает скорость перса.
      void SetSpeed(int speed)
      {
         
      }
?


Сообщение отредактировал Max-Hunter - Сб, 10 Сен 2011, 18:21
 
Сообщение
Quote (Shut)
ТЫ копипастишь?! wacko Мой тебе совет:переписывай код сам,не копипасть!Если будешь тупо копипастить,далеко не уедешь.
Ээээ....дЫк я ещё не выучил....Если я скопипастить не могу,какое сам пиши!

Quote (Shut)
Zer0n, выкладывай код скринами biggrin

Я только за!!!!!!! biggrin
Всё исправил!

Добавлено (10.09.2011, 18:17)
---------------------------------------------
Опять не получается сделать...Куда надо впихнуть
Code
    // устанавливает скорость перса.
      void SetSpeed(int speed)
      {
         
      }
?

Автор - Max-Hunter
Дата добавления - 10 Сен 2011 в 18:17
ZaktanДата: Сб, 10 Сен 2011, 18:51 | Сообщение # 5
 
Сообщений: 1022
Награды: 8
Репутация: 349
Статус: Offline
Zer0n, как ты программный код так сделал?

Technology for Home Robotics
 
СообщениеZer0n, как ты программный код так сделал?

Автор - Zaktan
Дата добавления - 10 Сен 2011 в 18:51
ShutДата: Сб, 10 Сен 2011, 19:02 | Сообщение # 6
 
Сообщений: 608
Награды: 2
Репутация: 258
Статус: Offline
Evel_Lord_Zaktan, Pastebin.com

Где арахисы - там и зима.
 
СообщениеEvel_Lord_Zaktan, Pastebin.com

Автор - Shut
Дата добавления - 10 Сен 2011 в 19:02
Max-HunterДата: Сб, 10 Сен 2011, 20:24 | Сообщение # 7
Нет аватара
 
Сообщений: 151
Награды: 1
Репутация: 60
Статус: Offline
КУКУ РЕБЯТ) ДАК КУДА ЕГО ВСТАВИТЬ?
Quote (Zer0n)
Для тех, кто в танке, скажу, что объявляем ее в теле класса, после функции Update.

ВСЁ РАВНО НЕ ПОНЯЛ!

Добавлено (10.09.2011, 20:24)
---------------------------------------------

 
СообщениеКУКУ РЕБЯТ) ДАК КУДА ЕГО ВСТАВИТЬ?
Quote (Zer0n)
Для тех, кто в танке, скажу, что объявляем ее в теле класса, после функции Update.

ВСЁ РАВНО НЕ ПОНЯЛ!

Добавлено (10.09.2011, 20:24)
---------------------------------------------


Автор - Max-Hunter
Дата добавления - 10 Сен 2011 в 20:24
Zer0nДата: Пн, 12 Сен 2011, 13:57 | Сообщение # 8
 
Сообщений: 880
Награды: 23
Репутация: 516
Статус: Offline
Code
объявление класса
{
       ...
       function Update () {
       }
         
       здесь.
}


 
Сообщение
Code
объявление класса
{
       ...
       function Update () {
       }
         
       здесь.
}

Автор - Zer0n
Дата добавления - 12 Сен 2011 в 13:57
Max-HunterДата: Вт, 13 Сен 2011, 16:52 | Сообщение # 9
Нет аватара
 
Сообщений: 151
Награды: 1
Репутация: 60
Статус: Offline
Quote (Zer0n)
объявление класса
{
...
function Update () {
}

здесь.
}

Но там нет function!!! Там void,и куда бы я не тыкал везде ошибка

Добавлено (13.09.2011, 16:52)
---------------------------------------------
Всё,код сделал,но

Quote (Max-Hunter)
'CharacterMotor' could not be found. Are you missing a using directive or an assembly reference?'
 
Сообщение
Quote (Zer0n)
объявление класса
{
...
function Update () {
}

здесь.
}

Но там нет function!!! Там void,и куда бы я не тыкал везде ошибка

Добавлено (13.09.2011, 16:52)
---------------------------------------------
Всё,код сделал,но

Quote (Max-Hunter)
'CharacterMotor' could not be found. Are you missing a using directive or an assembly reference?'

Автор - Max-Hunter
Дата добавления - 13 Сен 2011 в 16:52
seamanДата: Вт, 13 Сен 2011, 19:18 | Сообщение # 10
Гуру
 
Сообщений: 1748
Награды: 10
Репутация: 660
Статус: Offline
Вот эту строку урока Вы выполнили?:
Quote
проект с импортированными стандартными ассетами
 
СообщениеВот эту строку урока Вы выполнили?:
Quote
проект с импортированными стандартными ассетами

Автор - seaman
Дата добавления - 13 Сен 2011 в 19:18
Max-HunterДата: Сб, 17 Сен 2011, 15:21 | Сообщение # 11
Нет аватара
 
Сообщений: 151
Награды: 1
Репутация: 60
Статус: Offline
seaman, разумеется))) скрипт CharacterMotor имеется!
 
Сообщениеseaman, разумеется))) скрипт CharacterMotor имеется!

Автор - Max-Hunter
Дата добавления - 17 Сен 2011 в 15:21
Zer0nДата: Сб, 17 Сен 2011, 15:52 | Сообщение # 12
 
Сообщений: 880
Награды: 23
Репутация: 516
Статус: Offline
Max-Hunter, да, надо void, перепутал с JS. Ошибку выдает в Юнити или в редакторе кода?

 
СообщениеMax-Hunter, да, надо void, перепутал с JS. Ошибку выдает в Юнити или в редакторе кода?

Автор - Zer0n
Дата добавления - 17 Сен 2011 в 15:52
Max-HunterДата: Вс, 18 Сен 2011, 13:01 | Сообщение # 13
Нет аватара
 
Сообщений: 151
Награды: 1
Репутация: 60
Статус: Offline
В юне
 
СообщениеВ юне

Автор - Max-Hunter
Дата добавления - 18 Сен 2011 в 13:01
DekterevДата: Вс, 18 Сен 2011, 14:25 | Сообщение # 14
 
Сообщений: 1753
Награды: 16
Репутация: 892
Статус: Offline
Quote (Max-Hunter)
В юне

копипаст хреновый, адназначна...


Поиск | Правила | Новые сообщения
 
Сообщение
Quote (Max-Hunter)
В юне

копипаст хреновый, адназначна...

Автор - Dekterev
Дата добавления - 18 Сен 2011 в 14:25
Max-HunterДата: Ср, 21 Сен 2011, 13:27 | Сообщение # 15
Нет аватара
 
Сообщений: 151
Награды: 1
Репутация: 60
Статус: Offline
Dekterev, а не можете пожалуйста дать полный скрипт? Мне для изучения.
 
СообщениеDekterev, а не можете пожалуйста дать полный скрипт? Мне для изучения.

Автор - Max-Hunter
Дата добавления - 21 Сен 2011 в 13:27
commandobyДата: Сб, 14 Апр 2012, 19:43 | Сообщение # 16
Unity 3D Free
 
Сообщений: 836
Награды: 3
Репутация: 211
Статус: Offline
Если кому надо, я переписал скрипт приседания на UJS:
Code
var controller : CharacterController;
var oldHeight;
var newHeight: float;
var newPos;

function Start () {
controller = GetComponent(CharacterController);
oldHeight = controller.height;
}

function Update() {
newPos = new Vector3(transform.position.x, transform.position.y + 0.7f, transform.position.z);
          if (Input.GetKey(KeyCode.LeftControl)) {
              controller.height = newHeight;
          } else {
          if (Input.GetKeyUp (KeyCode.LeftControl)) {
              controller.height = oldHeight;
              transform.position = newPos;
          }
          }
   }


Блог.

Сообщение отредактировал commandoby - Сб, 14 Апр 2012, 19:44
 
СообщениеЕсли кому надо, я переписал скрипт приседания на UJS:
Code
var controller : CharacterController;
var oldHeight;
var newHeight: float;
var newPos;

function Start () {
controller = GetComponent(CharacterController);
oldHeight = controller.height;
}

function Update() {
newPos = new Vector3(transform.position.x, transform.position.y + 0.7f, transform.position.z);
          if (Input.GetKey(KeyCode.LeftControl)) {
              controller.height = newHeight;
          } else {
          if (Input.GetKeyUp (KeyCode.LeftControl)) {
              controller.height = oldHeight;
              transform.position = newPos;
          }
          }
   }

Автор - commandoby
Дата добавления - 14 Апр 2012 в 19:43
seamanДата: Сб, 14 Апр 2012, 21:20 | Сообщение # 17
Гуру
 
Сообщений: 1748
Награды: 10
Репутация: 660
Статус: Offline
Я бы написал так:
Code
var controller : CharacterController;
var oldHeight;

  function Start ()
  {
     controller = GetComponent(CharacterController);
     oldHeight = controller.height;
  }

  function Update()
  {
     if (Input.GetKey(KeyCode.LeftControl)) controller.height = controller.height / 2;
  if (Input.GetKeyUp (KeyCode.LeftControl))
  {
         controller.height  = oldHeight;
         transform.position.y = transform.position.y + 0.7f;
     }
}
 
СообщениеЯ бы написал так:
Code
var controller : CharacterController;
var oldHeight;

  function Start ()
  {
     controller = GetComponent(CharacterController);
     oldHeight = controller.height;
  }

  function Update()
  {
     if (Input.GetKey(KeyCode.LeftControl)) controller.height = controller.height / 2;
  if (Input.GetKeyUp (KeyCode.LeftControl))
  {
         controller.height  = oldHeight;
         transform.position.y = transform.position.y + 0.7f;
     }
}

Автор - seaman
Дата добавления - 14 Апр 2012 в 21:20
ЛевшаДата: Сб, 14 Апр 2012, 22:55 | Сообщение # 18
Черный Волк
 
Сообщений: 7257
Награды: 30
Репутация: 3313
Статус: Offline
Неудачный метод, есть большой шанс при вставании пробить пол и улететь под него или воткнуться в колайдер над головой и застрять. smile

X.cor.R (Prologue)
 
СообщениеНеудачный метод, есть большой шанс при вставании пробить пол и улететь под него или воткнуться в колайдер над головой и застрять. smile

Автор - Левша
Дата добавления - 14 Апр 2012 в 22:55
commandobyДата: Сб, 14 Апр 2012, 23:25 | Сообщение # 19
Unity 3D Free
 
Сообщений: 836
Награды: 3
Репутация: 211
Статус: Offline
В моём случае вероятность пробить пол и улететь - 0%, а пробить потолок - 100%. Я пытался избежать этого путём добавления триггера над головой, но он никак не захотел реагировать на блоки.

Блог.
 
СообщениеВ моём случае вероятность пробить пол и улететь - 0%, а пробить потолок - 100%. Я пытался избежать этого путём добавления триггера над головой, но он никак не захотел реагировать на блоки.

Автор - commandoby
Дата добавления - 14 Апр 2012 в 23:25
seamanДата: Вс, 15 Апр 2012, 10:08 | Сообщение # 20
Гуру
 
Сообщений: 1748
Награды: 10
Репутация: 660
Статус: Offline
Ну я над методом даже не думал. Я просто хотел показать, что то же самое можно записать короче и понятнее.
Ну а если думать над методом.
Чтобы не пробить головой потолок перед вставанием нужно проверять наличие потолка (RayCast) и соответственно не давать вставать, если он есть.
Code
var flagStand = false;

function Update()
{
     if(flagStand && !Physics.Raycast (transform.position, Vector2.up, oldheight / 2))
      {
         StandUo();
         flagStand = false;
      }
...
      if (Input.GetKeyUp (KeyCode.LeftControl) )
      {
         if(!Physics.Raycast (transform.position, Vector2.up, oldheight / 2)) StandUp();
         else flagStand = true;
      }
}
function StandUp()
{
      controller.height  = oldHeight;
      transform.position.y = transform.position.y + 0.7f;    
}

Чтобы точно не провалиться под пол нужно при вставании не просто прибавлять 0.7, а рассчитывать позицию посложнее, типа:
Code
var dist;

в Start:
Code
dist = oldheight / 4 ; //вообще - (oldheight - controller.height) / 2, но т.к.  controller.height == oldheight / 2, то получаем это

в Update:
Code
transform.position.y = transform.position.y + dist + 0.01f;

Чтобы не "падать" при приседании, нужно смещать позицию вниз:
в Update:
Code
transform.position.y = transform.position.y - dist + 0.01f;


Итого нечто такое:
Code
var controller : CharacterController;
var oldHeight;
var flagStand = false;
var dist;

function Start ()
{
      controller = GetComponent(CharacterController);
      oldHeight = controller.height;
      dist = oldheight / 4 ; //вообще - (oldheight - controller.height) / 2, но т.к.  controller.height == oldheight / 2, то получаем это
}

function Update()
{
      if(flagStand && !Physics.Raycast (transform.position, Vector2.up, oldheight / 2))
      {
         StandUo();
         flagStand = false;
      }
      if (Input.GetKey(KeyCode.LeftControl)) Squatting();
      if (Input.GetKeyUp (KeyCode.LeftControl) )
      {
         if(!Physics.Raycast (transform.position, Vector2.up, oldheight / 2)) StandUp();
         else flagStand = true;
      }
}
function StandUp()
{
      controller.height  = oldHeight;
      transform.position.y = transform.position.y + dist + 0.01f
}
functoin Squatting()
{
      controller.height = controller.height / 2;
      transform.position.y = transform.position.y - dist + 0.01f;
}

Не проверял, мог где-то ошибиться, тем более, что в JS не работаю.

Добавлено (15.04.2012, 10:08)
---------------------------------------------
Ну ошибка логическая одна есть. При приседании нужно:

Quote
if (Input.GetKey(KeyCode.LeftControl))
{
Squatting();
flagStand = false;
}
 
СообщениеНу я над методом даже не думал. Я просто хотел показать, что то же самое можно записать короче и понятнее.
Ну а если думать над методом.
Чтобы не пробить головой потолок перед вставанием нужно проверять наличие потолка (RayCast) и соответственно не давать вставать, если он есть.
Code
var flagStand = false;

function Update()
{
     if(flagStand && !Physics.Raycast (transform.position, Vector2.up, oldheight / 2))
      {
         StandUo();
         flagStand = false;
      }
...
      if (Input.GetKeyUp (KeyCode.LeftControl) )
      {
         if(!Physics.Raycast (transform.position, Vector2.up, oldheight / 2)) StandUp();
         else flagStand = true;
      }
}
function StandUp()
{
      controller.height  = oldHeight;
      transform.position.y = transform.position.y + 0.7f;    
}

Чтобы точно не провалиться под пол нужно при вставании не просто прибавлять 0.7, а рассчитывать позицию посложнее, типа:
Code
var dist;

в Start:
Code
dist = oldheight / 4 ; //вообще - (oldheight - controller.height) / 2, но т.к.  controller.height == oldheight / 2, то получаем это

в Update:
Code
transform.position.y = transform.position.y + dist + 0.01f;

Чтобы не "падать" при приседании, нужно смещать позицию вниз:
в Update:
Code
transform.position.y = transform.position.y - dist + 0.01f;


Итого нечто такое:
Code
var controller : CharacterController;
var oldHeight;
var flagStand = false;
var dist;

function Start ()
{
      controller = GetComponent(CharacterController);
      oldHeight = controller.height;
      dist = oldheight / 4 ; //вообще - (oldheight - controller.height) / 2, но т.к.  controller.height == oldheight / 2, то получаем это
}

function Update()
{
      if(flagStand && !Physics.Raycast (transform.position, Vector2.up, oldheight / 2))
      {
         StandUo();
         flagStand = false;
      }
      if (Input.GetKey(KeyCode.LeftControl)) Squatting();
      if (Input.GetKeyUp (KeyCode.LeftControl) )
      {
         if(!Physics.Raycast (transform.position, Vector2.up, oldheight / 2)) StandUp();
         else flagStand = true;
      }
}
function StandUp()
{
      controller.height  = oldHeight;
      transform.position.y = transform.position.y + dist + 0.01f
}
functoin Squatting()
{
      controller.height = controller.height / 2;
      transform.position.y = transform.position.y - dist + 0.01f;
}

Не проверял, мог где-то ошибиться, тем более, что в JS не работаю.

Добавлено (15.04.2012, 10:08)
---------------------------------------------
Ну ошибка логическая одна есть. При приседании нужно:

Quote
if (Input.GetKey(KeyCode.LeftControl))
{
Squatting();
flagStand = false;
}

Автор - seaman
Дата добавления - 15 Апр 2012 в 10:08
Форум Игроделов » UNITY3D » МАНУАЛЫ И УРОКИ » Создаем FPS в Unity3D [текст].
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:
Загрузка...

Game Creating CommUnity © 2009 - 2024