유니티2D 입문 정리 7 - 공격 시스템 구현

woollim·2024년 10월 10일
0

1. 프리팹

○ 공장제 기성품 - 프리팹 (Prefab)

  • 프리팹은 Unity 게임 엔진에서 사용되는 게임 오브젝트를 재사용 가능하고 관리하기 쉽게 만들기 위한 템플릿, 프리셋

  • 프리팹을 사용하면 게임 오브젝트와 그에 관련된 컴포넌트 및 설정을 미리 정의하고, 여러 장면이나 게임에서 재사용할 수 있음

  • 프리팹은 인스턴스화를 통해 실제 게임 오브젝트로 변환될 수 있으며, 이 때 모든 프로퍼티와 컴포넌트 설정이 복사됨

  • 프리팹의 변경사항은 모든 인스턴스에 즉시 반영되므로, 일관성을 유지하고 일괄적인 업데이트를 쉽게 할 수 있음

  • 프리팹은 레벨 디자인, 재사용 가능한 게임 요소(캐릭터, 아이템, 장애물 등)의 생성, 프로토타이핑 등에 주로 사용됨

  • 프리팹 만들기
    - 프리팹을 만드려면 생성되어있는 게임오브젝트를 프로젝트 뷰로 옮기면 됨
    - 게임오브젝트를 에셋으로 만듬


2. Instantiate

○ 복사해서 만든다 - Instantiate 함수

  • Instantiate 함수는 Unity에서 제공하는 메소드로, 주어진 원본 개체의 복사본을 새로 생성하고 이를 반환함

  • 이 함수는 주로 게임 오브젝트, 즉 캐릭터, 아이템, 프로젝타일 등동적으로 게임 세계에 추가할 때 사용

  • Instantiate 함수는 원본 개체의 모든 컴포넌트와 그 프로퍼티를 복사하여 새 게임 오브젝트를 생성함

  • 이 함수를 통해 생성된 게임 오브젝트는 독립적이며, 원본 개체에 대한 변화는 이에 영향을 주지 않음

  • Instantiate 함수는 원본 게임 오브젝트, 위치 및 회전 정보를 인자로 받을 수 있음


3. 실습 - 공격 시스템과 총알 만들기

1. PlayerInputController 수정

  • 이제 실제로 발사가 됨
public void OnFire(InputValue value)
{
    IsAttacking = value.isPressed;
}

2. TopDownController 수정

  • PlayerInputController에서 변경해주었던 IsAttacking 변수를 바탕으로 작동
  • IsAttacking 즉 버튼을 눌렀나 안눌렀나에 따라 변동되는 bool 값을 따라 변경
---------- 생략 ----------
public event Action OnAttackEvent;

private float timeSinceLastAttack = float.MaxValue;
protected bool IsAttacking { get; set; }

protected virtual void Update()
{
    HandleAttackDelay();
}

 private void HandleAttckDelay()
 {
     // TODO : MAGIC NUMBER 수정
     if(timeSinceLastAttack <= 0.2f)
     {
         timeSinceLastAttack += Time.deltaTime;
     }
     if(IsAttacking && timeSinceLastAttack > 0.2f)
     {
         timeSinceLastAttack = 0f;
         CallAttckEvent();

     }
 }

---------- 생략 ----------

public void CallAttackEvent()
{
    OnAttackEvent?.Invoke();
}

3. TopDownShooting 만들기

  • 실제로 슈팅이 일어나는 부분
  • OnLookEvent에 Aim하는 부분을 등록하고, OnAttackEvent에 Shoot하는 부분을 등록하고, 생성
  • Player에 해당 클래스 스크립트 추가
public class TopDownShooting : MonoBehaviour
{
    private TopDownController controller;

    [SerializeField] private Transform projectileSpawnPosition;
    private Vector2 aimDirection = Vector2.right;

    public GameObject TestPrefab;

    private void Awake()
    {
        controller = GetComponent<TopDownController>();
    }

    private void Start()
    {
        controller.OnAttackEvent += OnShoot;
        // OnLookEvent에 이제 두개가 등록되는 것 - 하나는 TopDownAimRotation.OnAim(Vec2)
        // 한 개의 델리게이트에 여러 개의 함수가 등록되어있는 것을 multicast delegate라고 함.
        // Action이나 Func도 델리게이트의 일종인 것 기억하시죠..?

        controller.OnLookEvent += OnAim;
    }

    private void OnAim(Vector2 direction)
    {
        aimDirection = direction;
    }

    private void OnShoot()
    {
        CreateProjectile();
    }

    private void CreateProjectile()
    {
        // TODO :: 날라가질 않기 때문에 날라가게 만들 것임
        Instantiate(TestPrefab, projectileSpawnPosition.position, Quaternion.identity);
    }
}

4. Arrow 만들

  • 다음과 같이 오브젝트 구성

  • Prefabs/Projectiles 경로(폴더) 생성 후 드래그 앤 드랍 → 프리팹 생성
  • Scene - Arrow 삭제
  • Player - TopDown Shooting - Test Prefab 에 연결

0개의 댓글