
지금까지 한 것들을 연결하는 작업을 하였다.
하지만 생각보다 오류가 많이 있어서 수정을 위주로 작업하였다.
늦은 시간까지 오류 수정하느라 당일에 TIL을 못썼다...
어느정도 연결이 끝나고 효과음을 연결해주었다.
사운드매니저 스크립트를 싱글턴으로 사용해서 효과음을 구현하였고
사용할때는 PlayOneShot을 통해 사용하였다.
public void PlayClip(AudioClip clip, float volume = 1f)
{
audioSource.PlayOneShot(clip, volume);
}
기존에는 사운드프리팹을 생성하고 재생한 후 삭제하는 구조로 작성되어있었는데
PlayOneShot을 사용하여 성능적으로 더 효율성있게 바꾸었다.
빛 생성기로 생성된 빛이 거울을 통해 반사될때 세팅해둔 레이캐스트가 자기 자신을 컨택하면
무한 루프에 빠져 유니티 에디터가 멈춰버리는 문제가 발생하였다.
if (hit.collider.gameObject == gameObject)
{
Debug.Log("자기 자신을 감지");
break;
}
다음과 같이 조치하여 자기 자신을 감지하게 되면 break되게 수정하였다.
여러 방법을 시도하였었는데 이 부분은 따로 다뤄야겠다.
모든 씬을 연결한 뒤 테스트를 하는데 빛이 벽을 뚫고 가버리는 문제가 발생했다.
연결 전 개인 작업에서는 잘 작동되었는데 연결 후 생긴 문제였다.

인스펙터에서 막히는 레이어를 설정해주었는데 이 부분에서 default(맵에 사용) 부분이
빠져있었고 다시 추가해주니 정상 작동하였다.
빛 생성 큐브의 상하 회전이 반대로 되는 문제가 있었는데 이 부분을 수정하였다.
// 상하 회전 처리
if (rotationInputY != 0f)
{
if (selectedRotatableObject.CompareTag("LightGenerator"))
{
rotationAxis = selectedRotatableObject.transform.right;
selectedRotatableObject.Rotate(-rotationInputY * selectedRotatableObject.rotationSpeed * Time.deltaTime, rotationAxis);
}
else
{
rotationAxis = selectedRotatableObject.transform.right;
selectedRotatableObject.Rotate(rotationInputY * selectedRotatableObject.rotationSpeed * Time.deltaTime, rotationAxis);
}
}
처음에는 그냥 큐브를 뒤집어버리면 되는거 아닌가 해서 해봤는데 안돼서
그냥 tag 를 설정해서 LightGenerator 큐브가 해당 되었을때 상하 회전의 값을 반대로
할 수 있게 추가해주었다.
기존에는 3인칭 카메라만 존재하였고 시점에 따른 기믹 해결에 조금은 불편한 부분이
어느 정도 존재하였다.
그래서 완벽한 1인칭 카메라는 아니지만 1인칭 느낌을 낼 수 있게 카메라를 하나 더 제작하여
c키를 눌러 시점 변경이 가능하게 추가해주었다.

발생한 문제
해당 방법으로 사용했을때 1인칭 시점 역할을 하는 카메라로 시점이 변경되면
플레이어 캐릭터의 모델이 뚫려서 보이는 문제가 있었다.
아무래도 완벽한 1인칭 시점 카메라가 아니고 3인칭 카메라를 1인칭처럼 보이게 설정했기 때문에
생긴 문제였다.
해결
c키를 입력하여 시점을 변경하게 되는데 이때 1인칭 역할 카메라로 변경되면
플레이어 모델의 메테리얼의 값을 변경해주어서 투명해지게 만들었다.
private void ChangeRenderMode(bool isChanged)
{
if (material != null)
{
if (isChanged)
{
Debug.Log("Transparent Mode");
material.SetFloat("_Mode", 2);
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
material.SetInt("_ZWrite", 0);
material.DisableKeyword("_ALPHATEST_ON");
material.EnableKeyword("_ALPHABLEND_ON");
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = 3000;
SetAlpa(0f);
}
--------------------------생략--------------------------------
해당 메서드를 통해 1인칭 시점에 들어선 순간 메테리얼의 랜더링 모드를 Fade로 변경해주었고
알파값을 0으로 세팅하여 완전히 투명해지게 만들어주었다.

이외에도 여러가지 오류들이 있었지만 팀원들과 같이 하니까
발생했던 대부분의 오류를 수정할 수 있었다.
거의 12시까지 수정만 해서 힘들었을텐데 다들 열심히 해줘서 너무 고마웠고
덕분에 재밌게 작업한 것 같다.