에셋 다운로드 했을때 왜 에셋의 쉐이더가 깨지게 되는가?
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로 변경하는 방법




- 캐릭터 컨트롤러 등록
- 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를 사용한 이동
- 마우스를 사용한 카메라 방향 변경

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

이해가 잘 안되는 부분


게임 플레이를 해서 마우스로 카메라를 조작한다.
이때, 마우스를 위로 올리게 되면, 인스펙터 창의 메인 카메라의 X 값이 음수(-) 값으로 변경되면서 값이 변하는데 이게 왜 이런건가?
써치를 해봤으나 명확한 답변이 안나와서
GPT친구에게 물어봤다
- verticalAngle -= turnCam;에서 - 연산자를 사용하는 이유는, 마우스의 상하 움직임과 카메라 회전 방향이 반대이기 때문입니다.
- 마우스를 위로 올리면 자연스럽게 위쪽을 바라보기 위해서는, 마우스의 상하 이동 값을 카메라의 회전에서 빼줘야 합니다.
이제 무슨 말인지 이해가 되었다. 역시 GPT는 최고야~