Unity 강의 1주차 - 4 스탯 구현, 스크립터블 오브젝트 사용 예시

김정환·2024년 10월 8일
0
post-thumbnail

투사체

프리팹 Prefab

  • 게임 오브젝트를 재사용하기 위한 프리셋
  • 공장제 기성품
  • 인스턴스화로 실제 게임오브젝트로 변환 가능하며, 이때 모든 프로퍼티와 컴포넌트 설정이 복사됨.
  • 프리팹의 변경사항은 모든 인스턴스에 즉시 반영되어, 일관성 유지, 일관적인 업데이트를 쉽게 가능하게 함.
  • 레벨 디자인, 재사용 가능한 게임요소(캐릭터, 아이템, 장애물 등)의 생성, 프로토타이핑 등에 주로 사용됨.

복사 메서드 Instantiate

  • 매개변수로 받은 오브젝트를 복사한다.
  • 매개변수로 복사한 오브젝트의 부모 트랜스폼, 위치, 회전 등등을 설정할 수 있다.

구현

InputAction에서 미리 만들어둔 Fire 부분 작성

// TopDownController.cs
protected bool isAttacking = false;
private float timeSinceLastAttack = float.MaxValue;

void Update()
{
    HandleAttackDelay();
}

void HandleAttackDelay()
{
    // TODO : MAGIC NUMBER 수정
    if(timeSinceLastAttack < stats.CurrentStat.attackSO.delay)
    {
        timeSinceLastAttack += Time.deltaTime;
    }
    else if (isAttacking && timeSinceLastAttack >= stats.CurrentStat.attackSO.delay)
    {
        timeSinceLastAttack = 0f;
        CallAttackEvent(stats.CurrentStat.attackSO);
    }
}

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

// PlayerInputController.cs
public void OnFire(InputValue val)
{
	// 입력받은 키가 눌렸는지 확인
    isAttacking = val.isPressed;
}

//TopDownShooting.cs

[SerializeField] Transform tfFirePoint;
Vector2 aimDir = Vector2.right;

public GameObject prefProjectile;

void Start()
{
	// 공격 기능을 공격 이벤트 구독
    controller.OnAttackEvent += OnShoot;
    // 조준 기능을 마우스 포지션을 받는 이벤트에 구독
    controller.OnLookEvent += OnAim;
}

void OnAim(Vector2 dir)
{
    aimDir = dir;
}

void OnShoot()
{
    CreateProjectile();
}

void CreateProjectile()
{
    Instantiate(prefProjectile, tfFirePoint.position, Quaternion.identity);
}

번외

심화 파트 구현

// TopDownShooting.cs
void CreateProjectile(RangedAttackSO rangedAttackSO, float angle)
{
    // 심화 파트
    // 회전각
    float rotZ = Mathf.Atan2(aimDir.y, aimDir.x) * Mathf.Rad2Deg;

    // 날아가기 구현 : 심화
    Projectile p = Instantiate(prefProjectile, tfFirePoint.position, Quaternion.Euler(new Vector3(0, 0, rotZ)));
    p.Fire(10f, aimDir);
}

// Projectile.cs
public class Projectile : MonoBehaviour
{
    Rigidbody2D rb;

    void Awake()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    public void Fire(float speed, Vector2 dir)
    {
        rb.velocity = speed * dir;
    }

    public void OnCollisionEnter2D(Collision2D other)
    {
        if(other.gameObject.tag.Equals("Obstacle"))
        {
            Destroy(gameObject);
        }
    }
}


스탯 기초

열거형 enum

  • 숫자에 의미를 부여한다.

스크립터블 오브젝트

  • 유연한 데이터 컨테이너.
  • 게임에서 재사용 가능한 데이터나 설정을 저장하는데 사용.
  • 코드와 데이터를 분리하여 코드를 더 깔끔하고 관리하기 쉬움.
  • 하나의 스크립터블 오브젝트를 여러 게임 오브젝트에서 참조할 수 있다.

사용법 차이

데이터를 분리했다는 차원에서는 동일하게 사용.

나는 데이터들을 내부에 구조체 리스트나 맵으로 만들어 둠.
하나의 오브젝트에서 찾아서 쓰는 방법.

여기서는 개별, 한 개씩 만들어서 사용하는 방법.

스탯 구현

profile
사파 개발자

0개의 댓글