10/8 TIL 3D FPS

Cheorii·2024년 10월 8일

Unity Pipeline

에셋 다운로드 했을때 왜 에셋의 쉐이더가 깨지게 되는가?

Unity에는 기본적으로 3가지 렌더링 파이프라인이 있다.

  • 빌트인 렌더링 파이프라인 (Built-in Rendering Pipeline)
    - Unity의 기본 렌더링 파이프라인으로, 초기 Unity 버전에서 사용되던 방식
    - 쉐이더(Shader)와 그래픽 설정은 사용자 정의가 제한적이고, 기본적인 작업에 적합한 방식

  • URP (Universal Render Pipeline)
    - SRP(스크립터블 렌더 파이프라인) 중 하나로, 과거 LWRP (Lightweight Render Pipeline)에서 발전한 것
    - 모바일 및 다양한 플랫폼에서 성능을 최적화할 수 있도록 설계
    - URP는 성능이 중요한 프로젝트에 적합하며, 사용자 정의가 용이한 렌더링 파이프라인을 제공

  • HDRP (High Definition Render Pipeline)
    - SRP 중 하나로, 고사양 프로젝트에서 고품질 그래픽을 제공하기 위해 설계
    - 고성능 PC 및 콘솔과 같은 고사양 환경에서 뛰어난 비주얼을 구현할 수 있는 렌더링 파이프라인

  • 그러면 왜? 에셋 및 오브젝트 쉐이더가 깨졌는가?
    - 다운 받은 에셋의 파이프라인이 빌트인으로 제작되었는데 Unity21.2이후 부터 SRP가 기본이 되어서, 빌트인으로 만든 에셋들이 쉐이더가 맞지 않아서 깨지게 됨

Pipeline Converter

위에서 말한 빌트인 파이프라인을 -> URP로 변경하는 방법



Player Input


  • 캐릭터 컨트롤러 등록
  • input System Package 사용하기 위해 PlayerInput 컴포넌트 등록

PlayerController.cs

using UnityEngine;
using UnityEngine.InputSystem;

public class PlayerController : MonoBehaviour
{
    public float walkingSpeed = 7;
    public float mouseSens = 0.01f;
    public Transform CameraTransform;

    float horizontalAngle;
    float verticalAngle;

    InputAction moveAction;
    InputAction lookAction;

    CharacterController characterController;

    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;

        InputActionAsset inputActions = GetComponent<PlayerInput>().actions; // PlayerInput에 actions를 가지고 와서 

        moveAction = inputActions.FindAction("Move");                        // move를 사용
        lookAction = inputActions.FindAction("Look");

        characterController = GetComponent<CharacterController>();

        verticalAngle = 0;
        horizontalAngle = transform.localEulerAngles.y;

    }

    // Update is called once per frame
    void Update()
    {
        // Move 평행이동
        Vector2 moveVector = moveAction.ReadValue<Vector2>();
        Vector3 move = new Vector3(moveVector.x, 0, moveVector.y);

        if(move.magnitude>1)        // 벡터 길이가 1보다 크면, 1로 맞춘다. 정규화 사용
        {
            move.Normalize();
        }

        move = move * walkingSpeed * Time.deltaTime;
        move = transform.TransformDirection(move);  // 현재 gameObject의 방향으로 벡터를 돌림
        characterController.Move(move);             // character controller componenet 움직여

        // 마우스 좌우 
        Vector2 look = lookAction.ReadValue<Vector2>();     // look액션 벡터를 가져옴

        float turnPlayer = look.x * mouseSens;              // 마우스 감도 적용
        horizontalAngle += turnPlayer;                      //현재 각도에 더함
        if (horizontalAngle >= 360) horizontalAngle -= 360;
        if (horizontalAngle <0) horizontalAngle += 360;
        
        Vector3 currentAngle = transform.localEulerAngles;  // 변한된 현재 각도를 넣는다.
        currentAngle.y = horizontalAngle;
        transform.localEulerAngles =currentAngle;

        // 마우스 상하 
        float turnCam = look.y * mouseSens;
        // 마우스를 올리면 양수값이 들어와야 하는데
        // 게임에서 마우스를 올려서 위를 올려보려면 음수값을 넣어줘야 한다.? 
        verticalAngle -= turnCam;           
        verticalAngle = Mathf.Clamp(verticalAngle, -89f,89f);
        currentAngle = CameraTransform.localEulerAngles;
        currentAngle.x = verticalAngle;
        CameraTransform.localEulerAngles = currentAngle;
    }
}
  • Player의 마우스 이동에 따른 카메라의 방향을 담당하는 스크립트
    - w,a,s,d를 사용한 이동
    - 마우스를 사용한 카메라 방향 변경

MeshCollider

  • Mesh Collider 는 메시 에셋을 사용하고 해당 메시를 기반으로 콜라이더를 빌드
  • 복잡한 mesh에 Primitive를 사용하는 것보다 충돌 검사에 더 정확함
  • Convex를 체크 하면, 콜라이더 삼각형이 255개로 증가하며, 메시 콜라이더는 다른 메시 콜라이더와 충돌할 수 있음
    - 콜라이더의 오목한 곳이 사라지며, 퍼포먼스 향상


이해가 잘 안되는 부분


게임 플레이를 해서 마우스로 카메라를 조작한다.
이때, 마우스를 위로 올리게 되면, 인스펙터 창의 메인 카메라의 X 값이 음수(-) 값으로 변경되면서 값이 변하는데 이게 왜 이런건가?

써치를 해봤으나 명확한 답변이 안나와서
GPT친구에게 물어봤다

  • verticalAngle -= turnCam;에서 - 연산자를 사용하는 이유는, 마우스의 상하 움직임카메라 회전 방향이 반대이기 때문입니다.
  • 마우스를 위로 올리면 자연스럽게 위쪽을 바라보기 위해서는, 마우스의 상하 이동 값을 카메라의 회전에서 빼줘야 합니다.

이제 무슨 말인지 이해가 되었다. 역시 GPT는 최고야~

profile
코딩테스트는 진짜 못하겠어요 ㅠㅠ

0개의 댓글