Unity 2d Создаем Кликер

Unity 2d Создаем Кликер

Простой кликер-платформер на движке Unity

Совсем недавно, на нашем сайте, было опубликовано несколько статей о том, как создать анимацию и о том, как заставить двигаться персонажа, при создании 2d игры в Unity. В этой статье мы хотим показать вам как на основе тех знаний и  на основе новых, которые мы получим в ходе изучения этой статьи, создать простой 2d кликер-платформер.

Итак, на основе этих статей:

Unity 5. 2d Анимация

Unity 2d. Движение персонажа

и использования готовых 2d спрайтов из этой статьи

Unity 2d. Спрайты для создания игр

Мы уже подготовили готовую сцену с работоспособным персонажемpers2d

Ну если разобрать более детально, то :

    • на игровой объект (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();
          }

Собственно, при наличии вышеперечисленных компонентов можно создать управляемый объект на сцене.

Далее, на создании самой сцены мы останавливаться не будем, она может выглядеть на ваш вкус и цвет, ну и если вы это читаете, то наверняка умеете переносить игровые объекты на сцену. А вот на самих игровых объектах остановимся поподробней.

Суть игры — пройти уровень не потеряв жизни, собственно не умереть, в этом нам помогут вспомогательные объекты, которые мы разместим на сцене и помешают различные преграды.

Разместим на сцене поваленное дерево, которое помешает пройти нашему персонажу и от которого нужно избавится, как вариант — разрубить.

brevno2d

Поместим дерево и топор, который поможет нам пройти. На них поместим объекты 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. Ну и не забудьте присвоить тэги объектам, которые указали в скрипте.

У меня немного доработано, но смысл тот же:

Подходим к дереву, но оно не дает нам пройти, нажимаем на него ничего не происходит

derevo2d
находи топор, берем его

topor2d

и снова к дереву, дерево исчезает

styk2d

Первая преграда пройдена, далее реализуем столкновение персонажа с игровыми объектами, например, поместим на сцену паука и при столкновении с ним персонажа будет отбрасывать назад.

pauk2d

Создадим еще один скрипт в котором будем использовать функцию обработки столкновений коллайдеров

 private void OnTriggerEnter2D(Collider2D other)
    {

        

            if (other.tag == "Pauk")
            {

                this.gameObject.GetComponent().MovePosition(Vector2.left * 10 * Time.deltaTime);

            }

    }

Соответственно, на паука вешаем Box Collider с галочкой isTrigger и указываем тэг, который указали в скрипте.

pauk2d

На основе функции OnClick() и OnTriggerEnter2D(Collider2D other) можно и дальше размещать объекты на сцене, которые будут преграждать путь или будут помогать персонажу пройти уровень.

Итак, я немного доработал и в итоге вы можете посмотреть на видео что может получится.

На этом все, удачных проектов)!

На главную


Оставить Комментарий