ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TIL] Unity 강의 2
    TIL 2024. 5. 9. 21:25

    프리팹 (Prefab)

    unity 엔진에서 사용되는 게임 오브젝트를 재사용 가능하고 관리하기 쉽게 만들기 위한 프리셋

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

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

    게임오브젝트를 에셋으로 만든다고 생각하자

     

    Instantiate 함수

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

    주로 오브젝트, 캐릭터, 아이템 등을 동적으로 세계에 추가할 때 사용된다.

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

     

    열거형(Enum)

    열거형은 사수형 값에 의미를 부여하기 위해 사용된다. 

    기본타입은 int기반으로, 제일 앞 값을 0으로 하고 이전 값에서 +1 하여 번호를 붙인다.

    중간에 번호 체계 변경가능

     

    스크립터블 오브젝트(Scriptable Object)

    Unity에서 데이터를 저장하고 관리하는 유연한 데이터 컨테이너

    재사용 가능한 데이터 또는 설정을 저장하는 데 사용

    코드와 데이터를 분리하여 코드를 더 깔끔하고 관리하기 쉽게 만듬

    하나의 스크립터블 오브젝트를 여러 오브젝트에 참조하거나 재사용 가능

     

    비트 연산자, 레이어 마스크

    레이어는 기본적으로 32개 까지 가능하다. 

    레이어 하나하나가 비트를 가지고있다.

    unity에서 각 오브젝트는 특정 레이어에 속할 수 있으며, 주로 오브젝트 간의 상호작용을 관리하기 위해 사용한다.

    1. AND(&): 두 비트 모두가 해당 비트로 설정되어있을때 결과 비트 설정, 특정 레이어의 존재 여부 확인 가능

    2. OR(|) : 두 비트 중 하나라도 설정되어 있을 때 결과 비트 설정, 새로운 레이어를 추가할 때 유용

    3. XOR(^): 두 비트에서 서로 다를때 결과 비트 설정. 두 레이어의 차이를 찾을 때

    4. NOT(~): 모든 비트를 반전 시킨다. 특정 레이어에서 제외시킬 때

     

    비트 시프트 연산 

    1<< n 은 1을 n번째 비트 위치로 시프트한다. 이는 n번째 레이어를 나타내는 비트마스크를 생성하는 데 사용

    이를 통해 특정 레이어에 대한 연산을 쉽게 할 수 있다.

    이 방법은 무리적 충돌, 레이캐스팅, 카메라 렌더링 등을 제어하는 데 사용 한다.

    충돌 검사: 비트 마스킹을 사용하여 특정 레이어에 속한 오브젝트만을 대상으로 충돌 검사 수행

    레이캐스팅 제어: 레이캐스트가 특정 오브젝트에만 반응하도록 비트마스크 설정

    카메라 렌더링 설정: 카메라가 특정 레이어의 오브젝트만을 렌더링하도록 설정, 게임의 시각적 요소 제어

     

    쿼터니언과 벡터의 곱셈

    쿼터니언을 활용해 벡터도 회전할 수 있다.

    unity에서 Quaternion과 Vector3의 곱셈을 지원하기 때문에 순서만 맞춰 곱하면 된다.

     

    오브젝트 풀링

    게임 개발에 널리 사용되는 테크닉으로, 게임의 성능을 개선하기 위해 사용한다.

     

    오브젝트 풀링은 객체를 미리 생성해두고 필요할 때 가져다 사용하고, 사용이 끝나면 다시 풀에 반납하는 방식이다.

    오브젝트 풀링은 생성(Instantiate)와 소멸(Destroy)라는 비용이 큰 작업을 최소화함으로써 성능을 향상시키는 데 중요한 역할을 한다.

     

    이는 빈번하게 생성하고 파괴되는 객체에 대해 중요하며 저장해 놓고 재사용함으로써 메모리 할다과 가비지 컬렉션에 따른 성능 저하를 방지할 수 있다.

    적절히 사용하면 큰 성능 개선을 가져올 수 있지만 불필요한 메모리 사용을 증가시킬 수 있으므로 오브젝트 풀의 크기를 적절히 조절하는 것이 중요

     

    겪은 오류

    더보기

    11강에서 열심히 다듣고 한번 돌려보던중... 되게 이상한 오류가 발생했다.

     강의 속 게임은 화살속도도 느리고 벽에 부딪히면 화살이 없어졌지만, 내 게임은 화살이 너무 빠르고 벽을 뚫고 날아가 버렸다...

     

    벽을 뚫고 나가는 원인은 예전에 경험한적이 있어서 알고 있었다.

    일단 발생하는 이유는 얇은 콜라이더를 빠른속도로 오브젝트와 충돌할 경우 물리가 인식하지 못하고 뚫려버린다.

    원래라면 Rigidbody의 Interpolate를 바꿔주던가 ( 대신 좀 무거워진다)

    콜라이더의 벽을 좀 두껍게하던가 Raycast를 쓰던가 등등 해결법이 많지만.

     

    지금 내 상황에서 가장 문제가 되는 것은 화살의 속도 였다.

    기본적인 speed를 바꿔줬지만 0이면 멈춰버리고 0.1을해도 빠르게 날아간다는게 문제였다.

     

    처음에는 내가 강의를 따라가다가 코드나 엔진에서 빠트린 부분이 있을까 싶었지만

    10~11강을 한 3~4번을 따라보고 복붙에서 붙여봐도 현상이 나아지지 않았다.

     

    그래서 튜터님한테 찾아갈까 그냥 무시하고 다음 강의로 넘어갈까 고민을 했지만

    디버깅을 통해 원인을 찾아 올라가기로 했다.

     

    TopDownShooting.cs

     

    문제가 화살을 생성하는 함수쪽에 있을거라 추측을하고 Debug를 찍었더니.... 다름이 아니라 Vector 값이 미치도록 큰 값이 나오는걸 발견하게 되었다.

     

    그렇다면 angle이나 aimDireaction 둘 중 하나가 값을 잘못계산되었고 그것 때문에 결론적으로 화살의 속도에 영향을 주었다고 생각하여, 각각 변수를 거슬러 올라가기 시작했다.

     

    결론적으로 aimDireaction 이 문제였는데

    TopDownShooting.cs / PlayerInputController.cs

    camera.WorldToScreenPoint() : position 월드 공간에서 스크린 공간으로 변환

    camera.ScreenToWorldPoint() : 카메라 평면으로부터 제공된 거리에서 화면 공간 으로 변환하여생성

     

    자동완성으로 탭탭 누르다가 잘못 완성되었는지 이상한 함수를 쓰고있어서 생긴 원인이였다.

    https://docs.unity3d.com/ScriptReference/Camera.WorldToScreenPoint.html

     

    Unity - Scripting API: Camera.WorldToScreenPoint

    Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close

    docs.unity3d.com

    https://docs.unity3d.com/ScriptReference/Camera.ScreenToWorldPoint.html

     

    Unity - Scripting API: Camera.ScreenToWorldPoint

    World space coordinates can still be calculated even when provided as an off-screen coordinate, for example for instantiating an off-screen object near a specific corner of the screen. Screenspace is defined in pixels. The bottom-left of the screen is (0,0

    docs.unity3d.com

     

    저걸해결하고도 자잘한 오류를 발견했었는데 플레이어 중심에서 마우스를 두고 화살을 쏠 경우 화살이 느리게 나가고

    멀리 떨어져서 화살을 쏠 경우 빠르게 발사 되었다.

     

    괄호안에 worldPos 를 넣지않고 normalized를 해서 생긴 오류였다..... 

    같은 함수 내에 오류만 2개라니 졸았나 내가..

     

    'TIL' 카테고리의 다른 글

    [TIL] 유니티로 개인과제 1  (0) 2024.05.13
    [TIL] Unity 3 + 알고리즘 문제  (0) 2024.05.10
    [TIL] Unity 강의 1  (0) 2024.05.08
    [TIL] 게임 특강  (0) 2024.05.07
    [TIL] 2024-05-03 팀 프로젝트 마무리  (0) 2024.05.03
Designed by Tistory.