Всем привет, сегодня покажу как двигать персонаж в сторону курсора, например как в игре Diablo 2. В примере будет использоваться Unity3D 2.6. Сам урок очень старый, и делался для создания серии уроков по созданию РПГ (для другого ресурса, но ресурс накрылся медным тазом, по этому для пользователей gcup это будет более полезно, да и некоторые писали мне в лс "как двигать персонаж в сторону курсора"), но я не смог тягаться c BugZerg по этому забросил проект. Ну что, начнем. Первое – запускаем Unity3D. Выбираем в окне «Project Wizard» где будем хранит проект, и выбираем импортируемый ассет «Standart Assets.unityPackage». Ждем пока импортируется ассет . Это может занять некоторое время. Импорт закончен? Это хорошо, давайте продолжим дальше. О, и не стоит пугается странного интерфейса, это не Blender. Давайте сначала добавим пол для нашего уровня. Заходим в меню «Game Object», далее в «Create Other» и выбираем в выпавшем меню «Cube». В вкладке «Inspector» настройте объект как на изображение:
Импровизированный пол для нашего уровня готов. Теперь добавим персонажа. Заходим в меню «Game Object», далее в «Create Other» и выбираем в выпавшем меню «Capsule». В вкладке «Inspector» настройте объект как на изображении:
Вау, главный персонаж готов. Но чего-то не хватает, кажется что не хватает источника света. Давайте решим эту проблему. Заходим снова в меню «Game Object», далее в «Create Other» и выбираем в выпавшем меню «Point Light». В вкладке «Inspector» настройте объект как на изображении:
Ну а теперь займемся камерой. Выбираем камеру «Main Camera» во вкладке «Hierarchy», и заходим в меню «Component», далее в «Camera Control» и выбираем «Smooth Follow». Вы теперь можете увидеть, что изменилась вкладка «Inspector», не переживайте все это хорошо. Теперь нам надо выполнить одно из самых трудных действий для новичков. Выберите «Main Camera» в вкладке «Hierarchy», теперь методом Drag’n’Drop попробуйте перенести из вкладки «Hierarchy» объект «Capsule» в вкладку «Inspector» на панель «Smooth Follow (Script)» на свойство «Target», там где написано «None». Ну а теперь создадим скрипт для перемещения главного персонажа. Перемещать будем следующим способом – персонаж находится в центре экрана, двигается в сторону курсора, когда нажата правая кнопка мыши. Ну а теперь про то, как мы будем поворачивать персонажа в сторону курсора. Помните Я говорил что использую решение похожее на хитрозакрученую жопу? Щас вы это увидите. Так как игрок всегда находится в центре экрана, то мы найдем сначала расстояние по оси Х от центра до курсора, далее найдем расстояние от центра до курсора но уже по оси Y. В итоге мы имеем два катета, и мы можем спокойно найти угол между катетом и гипотенузой по формуле - Угол = Арктангенс(Растояние по оси У, Растояние по оси Х). Может плохо объяснил, но вот графическое объяснение:
Хотя оно тоже может быть кривым, и вы ничего не поймете, по крайней мере, те кому я показывал рисунок - нифига не поняли. Давайте уже кодить. Первое, во вкладке «Project» кликнем на кнопку «Create» и выберем «Folder», переименуем ее на «Scripts» клавишей «F2». Теперь опять кликаем на кнопку «Create» и выберем «JavaScript», в окне «Project» появится скрипт «NewBehaviourScript», переименуйте его на «Game_Player_Script» клавишей F2. В итоге должна быть следующая структура:
Двойным кликом на «Game_Player_Script» открываем его, удаляем все что там есть и вставляем следующий код:
Code
public var play:boolean = true; public var speed: int = 10; public var moveDirection: Vector3; public var grounded: boolean; public var gravity: int = 1;
function Update () { if(play){ if(Input.GetKey(KeyCode.Escape)){ Application.Quit(); }
if(grounded){ moveDirection = transform.TransformDirection(Vector3.forward); moveDirection *= speed; } moveDirection.y -= gravity * Time.deltaTime; if(Input.GetMouseButton(1)){ var dx: int = Input.mousePosition.x - Screen.width / 2.0; var dy: int = Input.mousePosition.y - Screen.height / 2.0; var strawRadians: float = Mathf.Atan2(dx,dy); var strawDigrees:float = 360.0 * strawRadians/(2.0*Mathf.PI); transform.rotation.eulerAngles.y = strawDigrees; var controller : CharacterController = GetComponent(CharacterController); var flags = controller.Move(moveDirection * Time.deltaTime); grounded = (flags & CollisionFlags.CollidedBelow) != 0; } } }
Теперь перетягиваем «Game_Player_Script» на «Capsule», который находится на вкладке «Hierarchy». Теперь выбираем «Capsule» и заходим в меню «Component», далее в «Physics» и выбираем «Character Controller». Вот и все, все готово, жмем на кнопку «Play» и смотрим на результат наших трудов. Ну а теперь про сам код:
Code
public var play:boolean = true; public var speed: int = 10; public var moveDirection: Vector3; public var grounded: boolean; public var gravity: int = 1;
В переменной play хранится флаг состояния игры, в speed – скорость перемещения, в moveDirection – направление движения, grounded – флаг по которому определяем на плоскости персонаж или нет, gravity – гравитация.
Code
function Update () {
Это стандартная функция которая будет вызыватся каждый раз когда происходит обновление сцены
Тут мы проверяем, находимся ли мы на плоскости, если да, то – получаем направление и увеличиваем его на скорость.
Code
moveDirection.y -= gravity * Time.deltaTime;
...и уменьшаем его по оси у на значение гравитации.
Code
if(Input.GetMouseButton(1)){ var dx: int = Input.mousePosition.x - Screen.width / 2.0; var dy: int = Input.mousePosition.y - Screen.height / 2.0; var strawRadians: float = Mathf.Atan2(dx,dy); var strawDigrees:float = 360.0 * strawRadians/(2.0*Mathf.PI); transform.rotation.eulerAngles.y = strawDigrees;
Ну а тут проверяется, нажата ли правая кнопка мыши, если да то, рассчитываем угол поворота.
Code
var controller : CharacterController = GetComponent(CharacterController); var flags = controller.Move(moveDirection * Time.deltaTime); grounded = (flags & CollisionFlags.CollidedBelow) != 0;
Эта самая трудная часть кода. Тут мы получаем ссылку на компонент «Charactrer Controller», который и управляет персонажем. Его методом «Move» двигаем персонажа, а рассчитываем флаг «grounded». Ну вот и все. Как видно игрок двигается в сторону мыши прям как в игре Diablo. Всем пока, до встречи. Удачи в геймдеве.
Категория: Создание игр | Добавил: noTformaT (25 Апреля 2011)
| Автор: Евгений Карпенко
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:
Игровые объявления и предложения:
Если вас заинтересовал материал «Unity3D. Движение в сторону курсора.», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела.
Предлагаются такие схожие материалы:
Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.
А как можно этот метод в пошаговый перетащить, ну то есть примерно как в героях что бы кликом мыши ходить именно по коррдинатам, либо как в шахматах что бы персонаж шел на ту клетку куда кликнул мышью???