Простой кликер-платформер на движке Unity
Совсем недавно, на нашем сайте, было опубликовано несколько статей о том, как создать анимацию и о том, как заставить двигаться персонажа, при создании 2d игры в Unity. В этой статье мы хотим показать вам как на основе тех знаний и на основе новых, которые мы получим в ходе изучения этой статьи, создать простой 2d кликер-платформер.
Итак, на основе этих статей:
и использования готовых 2d спрайтов из этой статьи
Мы уже подготовили готовую сцену с работоспособным персонажем
Ну если разобрать более детально, то :
- на игровой объект (GameObject) помещаем компонент Sprite Renderer, где в поле Sprite помещаем нужный нам спрайт (изображение)
- добавляем компоненты Collider 2d, Box или Circle в зависимости от строения изображения, можно несколько
- компонент Rigidbody 2D обязательно, так как он будет отвечать за движение персонажа
- компонент Animator с нужной нам анимацией
- ну и несколько скриптов, первый скрипт отвечает за перемещение персонажа по сцена
public float WalkSpeed = 2; private MoveState _moveState = MoveState.Idle; private DirectionState _directionalState = DirectionState.Right; private Transform _transform; private Rigidbody2D _rigidbody; private Animator _animatorController; private float _walkTime = 0, _walkCooldown = 0.2f; private void Start() { _transform = GetComponent(); _rigidbody = GetComponent(); _animatorController = GetComponent(); _directionalState = transform.localScale.x > 0 ? DirectionState.Right : DirectionState.Left; } public void MoveRight() { _moveState = MoveState.Walk; if (_directionalState == DirectionState.Left) { transform.localScale = new Vector3(-_transform.localScale.x, _transform.localScale.y, _transform.localScale.z); _directionalState = DirectionState.Right; } _walkTime = _walkCooldown; _animatorController.Play("Walk"); } public void MoveLeft() { _moveState = MoveState.Walk; if (_directionalState == DirectionState.Right) { transform.localScale = new Vector3(-_transform.localScale.x, _transform.localScale.y, _transform.localScale.z); _directionalState = DirectionState.Left; } _walkTime = _walkCooldown; _animatorController.Play("Walk"); } private void Update() { if (_moveState == MoveState.Walk) { _rigidbody.velocity = ((_directionalState == DirectionState.Right ? Vector2.right : -Vector2.right) * WalkSpeed * Time.deltaTime); _walkTime -= Time.deltaTime; if (_walkTime <= 0) { Idle(); } } } void Idle() { _moveState = MoveState.Idle; _animatorController.Play("Idle"); } enum MoveState { Idle, Walk, } enum DirectionState { Right, Left }
- Ну и второй скрипт, который будет отвечать за назначение клавиш управления персонажем
private Player Player; // Use this for initialization void Start () { Player = Player == null ? GetComponent() : Player; if (Player == null) { } } // Update is called once per frame void Update() { if (Player != null) { if (Input.GetKey(KeyCode.D)) { Player.MoveRight(); } if (Input.GetKey(KeyCode.A)) { Player.MoveLeft(); } } } public void WailkRight() { Player.MoveRight(); } public void WalkLeft() { Player.MoveLeft(); }
Собственно, при наличии вышеперечисленных компонентов можно создать управляемый объект на сцене.
Далее, на создании самой сцены мы останавливаться не будем, она может выглядеть на ваш вкус и цвет, ну и если вы это читаете, то наверняка умеете переносить игровые объекты на сцену. А вот на самих игровых объектах остановимся поподробней.
Суть игры — пройти уровень не потеряв жизни, собственно не умереть, в этом нам помогут вспомогательные объекты, которые мы разместим на сцене и помешают различные преграды.
Разместим на сцене поваленное дерево, которое помешает пройти нашему персонажу и от которого нужно избавится, как вариант — разрубить.
Поместим дерево и топор, который поможет нам пройти. На них поместим объекты Box Collider2d и обработчик Event Trigger (про это больше упоминать не будем, эти компоненты будут присутствовать на всех последующих игровых объектах )
Создадим простой скрипт, где при нажатии мышкой на объект топор он будет как-бы в руке и при нажатии мышкой на дерево мы будем проверять, если топор в руке то удаляем дерево, если нет …. то нет.
public GameObject rukaobject; // Use this for initialization void Start() { } // Update is called once per frame void Update() { } public void OnClick() { if (this.gameObject.tag == "Topor") { rukaobject = this.gameObject; } if (this.gameObject.tag == "DerevoPolom") { if (rukaobject == GameObject.FindGameObjectWithTag("Topor")) { Destroy(gameObject); } } }
Теперь вернемся к объектам на сцене (топор и дерево), поместим этот скрипт на них, в компоненте Event Trigger создадим новый тип Pointer Click и укажем эти объекты в этом типе (каждый в своем), так же укажем скрипт и функцию OnClick. Ну и не забудьте присвоить тэги объектам, которые указали в скрипте.
У меня немного доработано, но смысл тот же:
Подходим к дереву, но оно не дает нам пройти, нажимаем на него ничего не происходит
находи топор, берем его
и снова к дереву, дерево исчезает
Первая преграда пройдена, далее реализуем столкновение персонажа с игровыми объектами, например, поместим на сцену паука и при столкновении с ним персонажа будет отбрасывать назад.
Создадим еще один скрипт в котором будем использовать функцию обработки столкновений коллайдеров
private void OnTriggerEnter2D(Collider2D other) { if (other.tag == "Pauk") { this.gameObject.GetComponent().MovePosition(Vector2.left * 10 * Time.deltaTime); } }
Соответственно, на паука вешаем Box Collider с галочкой isTrigger и указываем тэг, который указали в скрипте.
На основе функции OnClick() и OnTriggerEnter2D(Collider2D other) можно и дальше размещать объекты на сцене, которые будут преграждать путь или будут помогать персонажу пройти уровень.
Итак, я немного доработал и в итоге вы можете посмотреть на видео что может получится.
На этом все, удачных проектов)!