상세 컨텐츠

본문 제목

1010 TIL - Unity 게임개발 입문

스파르타 코딩캠프

by lucar 2024. 10. 10. 21:22

본문

객체지향형으로 코드를 작성했다는데 솔직히 나는 아직 이해를 잘 못했다.

 

하여튼 배운 부분에 대해서만 정리해보자.

 

저번 시간에 InputSystem에 대해 간단하게 배웠는데 

 

public void OnMove(InputValue value)
{
    Vector2 moveInput = value.Get<Vector2>().normalized;
    CallMoveEvent(moveInput);
}

public void OnLook(InputValue value)
{
    Vector2 newAim = value.Get<Vector2>();
    Vector2 worldPos = _camera.ScreenToWorldPoint(newAim);
    newAim = (worldPos - (Vector2)transform.position).normalized;

    CallLookEvent(newAim);
}

public void OnFire(InputValue value)
{
    IsAttacking = value.isPressed;
}

내부에 On(InputSystem Action이름)을 대소문자 구분하여 한 글자도 틀리지 않고 정확하게 입력해야만

InputSystem을 읽어올 수 있다...

 

OnLook을 Onlook으로 입력했다가 이거 찾겠다고 많은 시간을 소요했다..

 

다음은 AnimationController라는 스크립트를 따로 작성하여 조건 만족 시

자동으로 bool이나 trigger값을 건드려서 작동시키게 해주는 코드인데

 

문자열로 연산시에는 연산량이 크게 증가하기 때문에

해쉬화 해서 정수형으로 데이터를 저장해서 비교하면 연산량이 상대적으로 줄게 된다.

 

    private static readonly int isWalking = Animator.StringToHash("isWalking");
    private static readonly int isHit = Animator.StringToHash("isHit");
    private static readonly int Attack = Animator.StringToHash("attack");

animator에서 주요 트리거가 되는 3가지 단어를 해쉬화 해서 RO로 저장했다.

 

private void Start()
{
    controller.OnAttackEvent += Attacking;
    controller.OnMoveEvent += Move;

    if (healthSystem != null)
    {
        healthSystem.OnDamage += Hit;
        healthSystem.OnInvicibillityEnd += InvicibillityEnd;

    }
}

private void Move(Vector2 vector)
{
    animator.SetBool(isWalking, vector.magnitude > magnituteThreshold);
}

private void Attacking(AttackSO sO)
{
    animator.SetTrigger(Attack);
}

private void Hit()
{
    animator.SetBool(isHit, true);
}

private void InvicibillityEnd()
{
    animator.SetBool(isHit,false);
}

후에 스타트 문 내부에 함수를 더해주고

각 함수는 해당 트리거나 불 조건이 True냐 False냐를 정하게 만들어준다.

 

그리고 정보를 SO화 시켜서 사용하는 방법에 대해서도 알려줬는데

[CreateAssetMenu(fileName = "DefaultAttackSO", menuName = "TopDownControlloer/Attacks/Default", order = 0)]
public class AttackSO : ScriptableObject
{
    [Header("Attack Info")]
    public float size;
    public float delay;
    public float speed;
    public float power;
    public LayerMask target;

    [Header("KnockBack Info")]
    public bool isOnKnockBack;
    public float knockbackPower;
    public float knockbackTime;
}
[CreateAssetMenu(fileName = "RangedAttackSO", menuName = "TopDownControlloer/Attacks/RangeAttack", order = 1) ]
public class RangedAttackSO : AttackSO
{
    [Header("Ranged Attack Data")]
    public string bulletNameTag;
    public float duration;
    public float spread;
    public int numberOfProjectilesPerShot;
    public float multipleProjectilesAngle;
    public Color projectileColor;
}

 

 

 

 

아직 정확히 이해는 못했지만

 

유니티에서 AttackSO라는 접근 값을 하나 추가해주는 것 같다.

 

생성해보면

이런 식으로 제작되는데

비슷한 오브젝트에 데이터를 입력할 때 편하게 사용할 수 있을 것 같다.

 

이번에는 공격종류와 공격 세부사항에 대해 정리되었다.

 

괜히 AttackSO라고 계속 부르고 호출되서 더 헷갈리지

생각해보면 Stat이라는 이름으로 만들어서

각 몬스터마다

공격력 체력 방어력 순으로 입력해도 큰 문제는 없을 것 같다.

 

일종의 구조체? 클래스?를 밖으로 빼놓은? 그런 느낌이다.

 

중간에 컴퓨터가 한 번 꺼져서 과제 하던게 날아가서

오늘 TIL은 여기서 마무리 하겠다..

관련글 더보기