Главная » Статьи » Unity3D [ Добавить статью ]

Unity3D. Движение в сторону курсора.
Всем привет, сегодня покажу как двигать персонаж в сторону курсора, например как в игре 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» открываем его, удаляем все что там есть и вставляем следующий код:

Теперь перетягиваем «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
if(play){

проверяем в игре мы или нет, если да, то:
Code
if(Input.GetKey(KeyCode.Escape)){
  Application.Quit();
}

Если нажата клавиша "Escape”, то выходим из игры.
Code
if(grounded){
  moveDirection = transform.TransformDirection(Vector3.forward);
  moveDirection *= speed;
}

Тут мы проверяем, находимся ли мы на плоскости, если да, то – получаем направление и увеличиваем его на скорость.
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.
Всем пока, до встречи. Удачи в геймдеве.
Категория: Unity3D | Добавил: АДМИН (2012/Июн/26) | Автор: Евгений Карпенко
Просмотров: 4973 | Комментарии: 3 | Теги: diablo, Кодинг, Unity, Unity3D Indie, Diablo 2, Движение в сторону курсора, unity3d, программирование, RPG, скрипты | Рейтинг: 5.0/1
Всего комментариев: 3
№3 RobinStone написал: 2013/Апр/28 в 23:25
RobinStone
И ещё одно - я начал не с си-шарпа, а с ява-скрипт и прыгать уже не хочу. Мне бы побольше кодинга именно на java. Поклон вам в пол! smile
№2 RobinStone написал: 2013/Апр/28 в 23:21
RobinStone
Кто ты и как связаться с тобой добрый програмер-фей smile в хорошем смысле. просто есть вопросы ещё, и не один...
№1 RobinStone написал: 2013/Апр/28 в 23:19
RobinStone
Я просто не знаю как благодарить!!!!!!!!!!! Ты мне просто смысл жизни отыскать помог. Побольше бы таких объяснений.
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]