ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TIL] 8주차 5일 팀 프로젝트 진행 , 시험
    개발일지/스파르타 코딩클럽 부트캠프 2024. 6. 7. 21:47

     

    오늘은 팀 프로젝트를 진행함과 동시에

    많은 특강들과 시험까지 있어서 거의 프로젝트 진행은 못했다고 봐도 될거같다.

     

    오늘 배운 내용  &  다시 한번 복습하는 내용들


    오일러각의 회전축

     

    막연히 생각했을 때는 오일러 각의 x값을 변경하면 가로, y값을 변경하면 세로로 화면이 돌아갈거라고

    생각하기 마련이다. 하지만 '축을 기준으로 회전시킨다'를 잘 생각해보면. 손을 총 모양으로 만들고

    검지가 회전하는 축, 엄지가 바라보는 방향이라고 생각하면 쉽게 이해가 된다.

     

    좌표계의 정의

     

    World좌표계 : 유니티의 씬 전체를 기준으로 오브젝트의 절대적인 위치, 회전, 크기를 나타냄

    Local좌표계 : 부모 오브젝트를 기준으로 상대적인 위치, 회전, 크기를 나타냄

     

    .Interface를 조금 더 깊게 파헤쳐보기

     

    현재 강의에서 나왔던 CampFire에 닿으면 데미지를 받는 기능을 구현한다고 했을 때, 

    interface나 상속을 사용하지 않고 데미지를 받는 로직을 구현한다고 가정해보자.

     

    1) Damagable이라는 컴포넌트를 새로 만들어서 적, 아군에게 붙인다

     이 경우는, Damagable에서 정의될 TakePhysicalDamage 메서드 내에서 현재 공격당한 유닛이 Ally인지, Enemy인지

    판별해서 알맞는 로직을 실행하는 별도의 작업이 필요하다. Ally, Enemy 뿐 아니라 neutral, Building 등 유형이 많아질수록

    Damagable 내부의 코드는 점점 복잡해질 것이다.

     

    2) CampFire에서 범위안에 들어온 Ally, Enemy를 나눠서 저장해놓는다

    이 경우엔 CampFire 클래스의 OnTriggerEnter, OnTriggerExit, DealDamage 메서드에서 Ally, Enemy에 대해서 각각

    검사를 해줘야하는 번거로움이 생긴다. 연산량도 문제지만 가독성, 유지보수에서 크게 불리해진다. 1의 경우와 마찬가지로

    유형이 많아질수록 더욱 복잡해진다.

     

    인터페이스 IDamagable을 만들어서 구현하면, 이를 구현한 클래스가 누구인지는 신경쓰지않고, 모두 IDamagable로 받아

    관리할 수 있기 때문에 위와 같은 문제점을 피해갈 수 있게된다.

    어떠한 클래스를 상속받거나 인터페이스가 구현된 자식 클래스는 부모 클래스(인터페이스) 자료형의 변수에 할당이

    가능하다. ( <- 업캐스팅) 이렇게하면 컴파일러가 부모에 어떤 변수와 메서드가 있는지 확신을 할 수 있는 만큼,

    그 변수, 메서드에 접근하거나 호출하는 것도 가능해진다.

     

    TryGetComponent

     

    위의 데미지와 연관지어서 얘기를 했을 때, 데미지를 입는 것과 관계없는 , 바위같은 오브젝트가 캠프 파이어에 접근하면

    문제가 생기는걸 피하기 위해서 TryGetComponent를 사용한다. 감지한 오브젝트에 IDamagable이 없을 경우

    GetComponent<IDamagable>을 사용하면 null을 반환하기 때문에 TryGetComponent를 사용하여 컴포넌트가 존재하지

    않을 경우에 대한 예외처리를 해주어야 한다.

     

    int 자료형의 연산

    void SetSkillUI()
    {
        remainGaugeBar.fillAmount = (float)remainSkillCnt / maxSkillCnt;
        remainText.text = $"{remainSkillCnt} / {maxSkillCnt}";
    }

    해당 코드는 스킬 횟수에 따른 UI표시를 위한 메서드이다.

     

    해당 코드에서 remainSkillCnt를 float자료형으로 형변환을 해주었는데 이유는

    int 자료형 변수 두 개를 산술연산자 / 로 나누기 연산을 할 경우에, 나머지를 버리고 몫만을 int 자료형으로 반환한다.

    remainSkillCnt가 maxSkillCnt보다 작아지는 순간, remainSkillCnt가 몇이 되든 remainSkillCnt/maxSkillCnt는 1보다

    작으므로 항상 0이 나오게된다.

     

    따라서, 비율을 계산할 때는 두 수 모두 int 일 경우 둘 중 하나를 float 로 형변환을 해주어야 정확한 값을

    얻을 수 있다. 

     

    Ray와 Raycast 개념 파헤치기

     

    Ray : Ray를 쏠 시작점과 방향에 대한 데이터가 저장된 객체

    Raycast : 쏠 Ray, 검사하는 거리, 검사하는 레이어를 정하여 실제로 Ray를 쏘고 어떤 오브젝트가

    검출되었는지 확인하는 메서드

     

    Camera의 ScrrenPointToRay : 해당 카메라가 보여주고 있는 화면 상의 좌표를 매개변수로 받아서

    월드 좌표계를 기준으로 [카메라 화면 상 해당 지점의 실제 좌표를 시작점/카메라가 바라보고있는 정면 방향]

    으로하는 Ray를 생성해 반환한다.

     

    new Ray로 새로운 Ray를 생성할 때는, 생성자의 매개변수로 시작점과 방향을 받게 된다.

     

     

    오늘은 오늘 치룬 시험내용을 중점으로 다시 한번 알아둬야할 점들을 TIL에 써봤다.

     

Designed by Tistory.