ABOUT ME

Today
Yesterday
Total
  • 내일배움캠프 36일차 TIL - 3D 게임 기초 개발 - 팀 프로젝트 3
    TIL/Unity 2024. 6. 5. 20:54

     

    [한 줄 요약]

    유니티 숙련 주차 팀 프로젝트를 진행하며 2층 퍼즐 기믹을 구현했고, 카메라 줌인 기능을 구현 중이다..


    [학습 내용]

     

    유니티 숙련 주차 팀 프로젝트


    2층 퍼즐 기믹

    스토리 클립보드

    퍼즐 정답을 유추할 수 있는 스토리가 작성되어 배치되어 있다.

    스토리 클립보드

     

    의자 상호작용

    의자와 상호작용 할 수 있도록 구현하였다. 기본적으로 에임을 갖다 대면 프롬프트가 출력된다.

    의자

    그리고 E 키를 누르면 퍼즐 관련 패널이 켜진다.

    퍼즐 관련 패널

     

    퍼즐 패널 카메라

    의자 아래에 적힌 숫자를 패널에 출력하기 위해서 카메라를 추가했다. 카메라를 비췄을 때 오브젝트가 너무 어두워서 Spotlight 조명도 추가했다.

    문제는 이 카메라를 패널에 출력하는 것이었다. 다행히 구글에서 자료를 찾을 수 있었다.

    먼저 빈 텍스처를 하나 만들었다. 그리고 카메라의 Target Texture를 이 텍스처로 지정해줬다.

    Target Texture

     

    그러면 이 텍스처에 카메라가 찍고 있는 뷰가 담긴다.

    다음으로 패널에 Raw Iamge를 만들고 이 텍스처를 넣어줬다.

    RawImage Texture

     

    카메라 설정에서 Culling Mask를 Interactable 레이어로 설정해줬기 때문에, 책상과 의자만 카메라에 담길 수 있었다.

     

    퍼즐 패널 기타

    그리고 이외에 패널이 켜지면 플레이어의 키 입력을 멈추고, 마우스 고정을 해제하는 등의 작업을 했다. 마우스를 자유롭게 움직일 수 있기 때문에 패널 닫기 버튼을 만들어 누를 수 있게 하였다. 패널이 닫히면 원래대로 키입력 등이 동작한다.

     

     

    Json 특강 2


    개인과제 피드백

    단면

    충돌처리는 어느 한쪽에서 됐다면 반대쪽은 안 될 가능성이 크다. 한쪽에서 레이를 쐈다면 반대쪽에서도 레이를 쏴서 더블 체크를 해야 한다.

     

    코루틴

    오브젝트가 파괴되어 코루틴이 실행되지 않는 경우가 있다. 코루틴 헬퍼 등의 다른 오브젝트를 만들어서 매개변수 등을 활용하여 그 쪽에서 코루틴을 실행시키는 방법이 있다.

     

    이동

    Rigidbody의 velocity를 직접 건드리는 방법 외에도 addForce, tranlate, movePostion 등 여러 방법이 있다. 각자의 장단점을 이해하고 사용하는 것이 중요하다.

     

    직렬화

    제네릭

    여러 데이터를 직렬화할 때마다 함수를 만드는 일은 비효율적이다. 이럴 때 제네릭을 사용한다면 한결 수월해진다.

    public void SaveData<T>(T data)
    {
    	string saveData = JsonUtility.ToJson(data);
        File.WriteAllText(savePath + $"/{typeof(T).ToString()}.txt", saveData);
    }
    
    public T LoadData<T>()
    {
    	if (!File.Exists(savePath + $"/{typeof(T).ToString()}.txt"))
        	return JsonUtility.FromJson<T>(null);
        
        string data = File.ReadAllText(savePath + $"/{typeof(T).ToString()}.txt");
        
        return JsonUtility.FromJson<T>(data);
    }

     

    서버 통신

    Json -> C#

    아래 사이트에 들어가서 변환하여 사용하면 편하다.

    https://json2csharp.com/

     

    Convert JSON to C# Classes Online - Json2CSharp Toolkit

     

    json2csharp.com

     

    UnityWebRequest

    유니티에서 기본적으로 제공하는 웹 통신 기능이다.

     

    Open API 활용

    // 코루틴 사용
    IEnumerator GetCharacterID(string nickname)
    {
    	string path = url + nickname;
        UnityWebRequest www = UnityWebRequest.Get(path);
        
        www.SetRequestHeader("x-nxopen-api-key", apiKey);
        
        yield return www.SendWebRequest();
        
        string result = www.downloadHandler.text;
        id = JsonUtility.FromJson<CharacterOCID>(result);
        
        Debug.Log(result);
    }

     

    Using 메서드

    using() {} 메서드를 사용하면 블록의 구문이 끝났을 때 소괄호 안의 객체들이 메모리 반환된다.


    [회고]

    오늘 2층 퍼즐을 어느 정도 완성했다. 현재는 카메라 줌인 기능을 구현 중이다. 아마 카메라의 FOV를 건드려주면 해결될 거 같다. 일단 키 입력부터 받아야하기 때문에 그 부분을 만들다가 끝났다.

    현충일이 지나고 오는 금요일에는 줌인 기능을 빠르게 완성하고 이후 작업을 찾아봐야겠다. 특강이 많이 배정된 날이라서 시간이 많지는 않을 것 같다.