내일배움캠프 19일차 TIL, 유니티 기초3

황오영·2024년 5월 10일
0

TIL

목록 보기
19/56
post-thumbnail

유니티 기초강의 내용정리

  • 오늘더 어제처럼 유니티강의 내용에서 어려웠던 코드들 배운내용들 추가 정리를 할 것이다.

발사체에 관한 코드

  • 리그오브레전드의 애쉬 w같은 방사형 갈레스킬들의 로직인데 처음에 이해를 못했는데 예시를 들어서 직접 계산해보며 깨달았다.
private void OnShoot(AttackSO attackSO)
{
        RangedAttackSO RangedAttackSO = attackSO as RangedAttackSO;
        float projectilesAngleSpace = RangedAttackSO.multipleProjectilesAngel;
        int numberOfProjectilesPerShot = RangedAttackSO.numberofProjectilesPerShot;

        // 중간부터 펼쳐지는게 아니라 minangle부터 커지면서 쏘는 것으로 설계했어요! 
        float minAngle = -(numberOfProjectilesPerShot / 2f) * projectilesAngleSpace + 0.5f * RangedAttackSO.multipleProjectilesAngel;


        for (int i = 0; i < numberOfProjectilesPerShot; i++)
        {
            float angle = minAngle + projectilesAngleSpace * i;
            // 그냥 올라가면 재미없으니 랜덤으로 변하는 randomSpread를 넣었어요!
            float randomSpread = Random.Range(-RangedAttackSO.spread, RangedAttackSO.spread);
            angle += randomSpread;
            CreateProjectile(RangedAttackSO, angle);
        }
}
  • 이해가 안갔던 부분이 minAngle을 구하는 방식이었는데 우선 스크립터블 오브젝트에서 몇개를 발사하는지와 몇도의 각도로 분사를 할껀지를 받아온다.
  • 근데 이경우 홀수개와 짝수개가 되었을 때 중앙이 존재하냐 하지 않느냐로 나뉘게 된다.
  • 홀수개인 경우는 중앙이 0 도로 중앙에 발사가 되는데 짝수개의 경우에는 중앙 0도에는 발사체가 존재하지 않게 된다.

    (발퀄그림ㅎ..)
  • 그렇기 때문에 홀수 짝수 경우를 나누어 봐야되는데 우선 홀수일때를 먼저 보면
    3갈래 그림상의 각도가 20도라고 보면 아래의 각도를 먼저 계산하는식이
  1. -(3/2f) * 20 을먼저 계산하면 -30이 되는데, 근데 이떄 3/2f에서 1.5로 계산이 되는거라서 0.5만큼의 추가보정이 필요하다 그래서 뒤에 + 0.5만큼 추가 각도로 계산을 해주게 되는것이다.
  2. 짝수가 되는경우에는 좀더 계산식이 쉽다. (-4/2f)에서 2배만큼 차이가 벌어지게 되는데 실제로 0도를 기준으로 0.5만큼의 차이만큼만 최소각도에 벌어지므로 똑같이 0.5만큼 보정이 들어가는것이다.
  • 처음에는 이해하기 엄청 어려웠는데 숫자 대입해보고 로그찍어보면서 계산원리를 이해하니 정말 좋은 방식이구나를 느꼈다. 나였다면 그냥 if문으로 나눠서 계산했을 것 같다.

오브젝트 풀링

  • 개념과 코드만 알고있어서 이번기회에 한번 더 정리하고 자한다.

왜 써야하는가?

  • 유니티의 오브젝트 생성,파괴 함수인 Instantiate와 Destroy는 메모리를 많이 사용하고 대가가 큰 함수이다. 유니티의 가비지컬렉션 시스템에서 위 두함수는 할당과 해제가 되며 CPU에 부담이 가게되는 가비지 컬렉터가 발생하게 되어 게임성능에 영향을 미치게 된다. 그러므로 FPS류의 총알이 무수히 많이 생성되는 게임에선 필수적으로 구현해야 하는것이 오브젝트 폴링이다.

방식

  • 간단하다 오브젝트 '풀링'이다. 풀에 저장되어 있는걸 꺼내오면 되므로 우선 처음에 많이 오브젝트를 생성하면 된다. 그후 오브젝트를 사용하고 필요 없어지면 파괴하는것이 아닌 비활성화를 해주는 방식으로 진행을 하면 된다.
for (int i = 0; i < pool.size; i++)
            {
                GameObject obj = Instantiate(pool.prefab);
                obj.SetActive(false);
                objectPool.Enqueue(obj);
            }
  • 일반적으로 자료구조 Queue를 많이 써서 관리하느 알아두면 좋을듯! 이런식으로 생성을 한 뒤에
    사용하는 코드에서 풀에서 참조해 불러오면 된다.

오늘의 회고

  • 오늘 제공된 강의는 우선다 들었다. 생각보다 어려웠는데 평소에도 꼭 알았으면 하는부분이 강의에 있어서 잘 집중했다. 이런 구조짜고 상속하는 모듈식 프로그래밍에 대해 자주 보고 좀 더 학습을 많이 해야겠다.
  • 강의 듣느라 조원들과 대화를 많이 못했는데 오늘 조원분들과 이런저런 대화하면서 조금 친해지는 시간을 가졌다. 다음주 목요일 팀프로젝트 할 때 좀더 친해야져야겠다.
  • 주말과 다음주중엔 개인과제를 진행 할 예정이다. 생각보다 과제 난이도가 나한테는 크게 어렵지 않아서 금방 할 것같다. 추가 과제까지 잘 마무리해야지
  • 분반발표되서 다음주부터는 더욱 바빠지지않을까.. 알고리즘 문제도 풀고 바쁜 나날을 보낼것 같다. 한편으론 많이 두렵고 무섭다 ㅎ.. 그래도 화이팅해야지
profile
게임개발을 꿈꾸는 개발자

0개의 댓글