반응형

  • 적 장애물을 만들기 위해서 스프라이트 이미지를 애니메이션으로 만들어줍니다.
  • 하이어리키 창에 Delivery_0 ~ 2 까지 드래그&드롭으로 옮겨서 Motorbike 이름으로 애니메이션을 생성하였습니다.
  • 전체 게임 비율에 맞춰서 크기를 세부 조정하였습니다.

  • 장애물에 이전 만들어 둔 Mover, Destroyer 스크립트를 적용하였습니다.
  • 플레이어와 충돌 감지를 위해서 콜라이더를 적용하였습니다.
  • 폴리곤 콜라이더는 이미지에 정교한 콜라이더를 적용하는게 가능하며 Edit 으로 직접 수정할 수 있습니다.
  • 폴리곤 콜라이더 적용과 함께 생성된 Rigidbody를 삭제합니다.
  • 충돌 감지는 할 수 있지만 플레이어가 통과해야 하기 때문에 Is Trigger를 체크해줍니다.

  • 동일하게 두번째 할머니 장애물도 설정하겠습니다.
  • 할머니는 폴리곤 콜라이더 말고 캡슐 콜라이더를 적용하였습니다.
  • 두 장매물을 프리팹으로 만들어주었습니다.

(이미지에서 BoxCollider 2D를 해야 하는데 BoxCollider 를 적용되어 있습니다. 수정이 필요합니다.)

  • 빌딩 건물과 마찬가지로 Enemy Spawner를 생성하여 오브젝트를 등록하여 설정하였습니다.
  • 게임에 맞춰서 생성되는 속도와 생성 위치, 각 장애물의 속도를 세부 조정 하였습니다.

  • 충돌 구분을 위하여 장애물 오브젝트에 Enemy Tag를 만들어서 적용하였습니다.

  • 아이템을 만들기 위해서 아이템 스프라이트에 장애물과 동일한 스크립트를 적용하고 박스 콜라이더를 설정하였습니다.
  • 설정을 마친 각 아이템은 프리팹으로 만들었습니다.

(이미지에서 BoxCollider 2D를 해야 하는데 BoxCollider 를 적용되어 있습니다. 수정이 필요합니다.)

  • 아이템도 마찬가지로 충돌 확인을 위하여 "food" 이름의 Tag를 설정하였습니다.
  • 아이템이 생성되는 장소를 만들기 위해 Food Spawner 를 만들고 아이템 프리팹을 적용하였습니다.

  • 특별한 아이템도 동일한 방식으로 만들었습니다.
  • 별도로 관리하기 위하여 Tag와 생성 위치는 따로 만들었습니다.
using UnityEngine;

public class Player : MonoBehaviour
{
    [Header("Settings")]
    public float JumpForce;

    [Header("References")]
    public Rigidbody2D PlayerRigidBody;

    public Animator PlayerAnimator;

    public BoxCollider2D PlayerCollider;

    private bool isGrounded = true;

    private int lives = 3;

    private bool isInvincible = false;

    void Start()
    {

    }


    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
        {
            PlayerRigidBody.AddForceY(JumpForce, ForceMode2D.Impulse);
            isGrounded = false;
            PlayerAnimator.SetInteger("state", 1);
        }
    }

    void KillPlayer()
    {
        PlayerCollider.enabled = false;
        PlayerAnimator.enabled = false;
        PlayerRigidBody.AddForceY(JumpForce, ForceMode2D.Impulse);
    }

    void Hit()
    {
        lives -= 1;
        if(lives == 0)
        {
            KillPlayer();
        }
    }

    void Heal()
    {
        lives = Mathf.Min(3, lives + 1);
    }

    void StartInvincible()
    {
        isInvincible = true;
        Invoke("StopInvincible", 5f);
    }

    void StopInvincible()
    {
        isInvincible = false;
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if(collision.gameObject.name == "Platform")
        {
            if (!isGrounded)
            {
                PlayerAnimator.SetInteger("state", 2);
            }
            isGrounded =true;
        }
    }

    private void OnTriggerEnter2D(Collider2D collider)
    {
        if(collider.gameObject.tag == "enemy")
        {
            if(!isInvincible)
            {
                Destroy(collider.gameObject);
            }
            Hit();
        }
        else if(collider.gameObject.tag == "food")
        {
            Destroy(collider.gameObject);
            Heal();
        }
        else if(collider.gameObject.tag == "golden")
        {
            Destroy(collider.gameObject);
            StartInvincible();
        }
    }
}

 

반응형

+ Recent posts