전체 글 (203)

  • 2025.05.01
  • 2025.04.25
  • 2025.04.18
  • 2025.04.03
  • 2025.03.06
  • 2025.02.26
  • 2025.02.06
  • 2024.12.10
  • 2024.11.11
  • 2024.11.11
  • 2024.11.07
  • 2024.11.01
  • 05
    01

    https://youtu.be/mYzqGqOi9OA

    모바일이었으면 더 쉽게 구현할 수 있지만, PC의 경우는 Firebase SDK 에서 관련 기능을 지원하지 않음.

    따라서 서버를 열고 구글 로그인을 한 뒤 인증 정보를 콜백받아 유니티에서 사용하는 방식을 채택함.

    1. 새 창에서 열기는 크롬 팝업 관련 정책이슈로 불가능

    2. 새 탭에서 연 뒤, 로그인 완료 후 닫는 것은 유니티에서 직접 연 창(Window)가 아니기에 제어가 불가능

    반응형

    '다이어리 > 게임개발일지' 카테고리의 다른 글

    [Unity] 양목장 진행 경과  (0) 2025.02.06
    COMMENT
     
    04
    25

    마지막 레시피인 철학자의 소금을 완성하고, 처음부터 다시 레시피 개선에 착수

    최적 경로를 찾아 재료를 줄이는 과정에서, 자연스레 중복 재료가 가능한 적게 들어가도록 구성

    개선 전과 후 순으로 이미지 나열

    1. 니그레도

    2. 알베도

    3. 시트리니타스

    4. 루비도

     

    반응형
    COMMENT
     
    04
    18

    #. 유니온 멤버 등록 조건

    유니온 멤버에 포함되려면 '2차 전직' 조건을 만족해야 한다.

    #. 작성 현황

    [작성] 모험가, 시그너스, 레지스탕스, 듀얼블레이드, 패스파인더, 아크, 일리움, 카인, 호영, 은월, 라라, 제로
    [미작성] 아란, 에반, 메르세데스, 팬텀, 엔젤릭버스터, 키네시스, 카데나, 제논, 캐논슈터, 미하일, 카이저, 아델, 칼리

    1-1. 모험가 계열

    스토리 스킵이 가능하다면, 슈가를 클릭하여 스토리 스킵 → 1차전직 → 머리 위 전구로 스토리 스킵 후 2차 전직하여 완료
    스토리 스킵이 불가능하다면, 메인 스토리를 따라가며 2차 전직까지 도달하도록 하자. (첨부할 자료 부족)

    모험가 스토리의 스킵은 4차 전직을 한 모험가 직업이 있을 경우 가능하다.
    즉 한 번은 스토리를 정직하게 밀거나 잘 알려진 편법을 사용한다.
    대표적인 편법으로는, 패스파인더 101레벨 이상 달성 후, 자유전직 시스템(직업변경)을 통해 보우마스터나 신궁으로 전직하는 방법이 있다. 자유전직은 미나르 숲 : 산양의 골짜기1로 텔레포트 후 전직관이 모여있는 '사제의 숲'으로 이동, 전직관에게 말을 걸어 진행이 가능하다. 자유전직 시, 현재 레벨에 따라 메소를 지불해야 하며, 레벨이 높을수록 많은 비용을 지불한다.
    만약 패스파인더로 궁성비를 사용해서 200레벨이 된 후 자유전직을 시도하면 4.6억메소를 지출해야 하므로, 101레벨까지 직접 육성한다는 선택지와 저울질이 필요하다.

    1-2. 시그너스 직업
    튜토리얼과 1차전직 완료 후, 나인하트의 [시그너스 기사단] 수련기사의 끝 퀘스트로 2차전직 진행
    몬스터에게서 전리품 획득 후 에레브로 돌아가야 하는데, 거리가 좀 있으므로 텔레포트 또는 마을이동 기능을 사용하면 좋다.
    퀘스트와 함께 2차전직도 함께 완료된다.

    1-3. 레지스탕스 직업

    마을에 도착 할 때까지의 스토리 진행을 해야한다.
    궁성비를 통해 10레벨 이상이 되었다면, 좌측 전구 아이콘 에서 [레지스탕스] 의문의 초대장 퀘스트를 받아, 인벤토리에서 초대장 사용 후 1차 전직을 진행한다.
    전구를 통해 [레지스탕스] 방과 후 특별수업[레지스탕스] 복수와 성장 퀘스트를 진행하여 2차 전직 완료
    적을 처치해야 할 에델슈타인 임시공항의 위치는 아래와 같다.

    2. 듀얼 블레이드 / 듀블 (10분+)

    슈가 클릭 후 스토리 스킵
    → 비화원 진입 후 튜토리얼 룸 세 단계 클리어
     넬라, 제이엠, 돈 지오바네 조사
    → (
    1.5차 전직)탁한 유리구슬 깨뜨리기
     
    머리 위 전구 퀘스트를 통해 헤네시스 이동
    → 헤네시스에서 머리 위 전구를 통해 모험가 스토리 스킵
    → 좌측 전구 아이콘의  [모험가] 비화원으로 돌아가는 법 퀘스트 완료 및 획득한 스킬을 사용하여 전직관에게 이동
    전직관에게 말을 걸어 2차 전직 완료

    2차 전직 퀘스트가 어째서인지 좌측 전구에 뜨지 않아서 직접 설희(전직관)을 찾아가야 한다.

    3. 패스파인더 / 패파

    동굴맵 탈출 후 바로 머리 위 전구를 통해 전직 가능

    4. 아크

    피난처 튜토리얼과 관계 없이 레벨만 되면 2차 전직이 가능하다.(한 번 더 검증 필요)

    5. 일리움(30분)

    2차전직을 위해 초반 스토리 진행 필요. 막힘 없이 진행 시, 약 30분 소요.
    스토리 진행 중 지역 간 텔포 이동이 불가능하여 이동에 시간을 많이 소모한다.
    또한, 아이템을 주워야 하는 퀘스트가 많아 펫이 있다면 조금 더 수월하게 진행이 가능하다.
    아카데미아에서 각성(흰머리)과 함께 2차전직 완료.
    유니온 UI를 띄울 수 없는 지역이지만 정상적으로 완료되었으므로 바로 종료하여도 무방함.

    6. 카인

    제일 먼저 보이는 스토리 퀘스트를 받고, 문 밖을 나가 NPC로부터 퀘스트를 진행하면 1차전직을 할 수 있고, 레벨이 될 경우 머리 위 전구를 통해 2차전직 바로 가능.
    1층 서쪽 통로에서 머리 위에 뜬 전구를 통해 헬리시움으로 빠지지 않도록 주의. 실수로 헬리시움으로 이동되었다면, 다시 해당 맵으로 돌아와 스토리 퀘스트 진행하도록 하자.

    7. 호영(5분)

    스토리 퀘스트 조금 진행하여 도철을 봉인에서 풀어준 뒤, 1차 전직 후 바로 머리 위의 전구를 통해 2차 전직이 가능.
    캐릭터 생성부터 약 5분 소요.
    유니온 UI를 열 수 없는 지역이지만, 2차 전직만 완료되었다면 문제 없이 유니온 효과 적용.

    8. 은월(15분)

    여우마을 탈출과 함께 2차전직

    9. 라라(3분?)

    퀘스트 [라라] 내가 도와줄까?[라라] 가까워진 산 꼬마들 로 1차 전직을 완료 후, 머리 위 전구 퀘스트 [헬리시움] 판테온으로 또는 길라잡이로 나린 밖으로 이동하고, 머리 위 전구를 통해 2차 전직

    꼭 시작맵에서 1차 전직을 하고 이동하자.

    실수로 1차 전직 전에 나린 밖으로 이동하였을 경우에는 아래 표시된 위치로 돌아가서 1차 전직을 완료한다.

    10. 제로(약 5분?)

    아래 필드에 도달 할 때 까지 튜토리얼 진행, 궁성비 사용 시 바로 유니온 멤버에 등록된다.

    11. 루미너스

    스토리 진행 중 엘리니아 사냥터 맵 진출 시점에서 전구 아이콘을 통해 2차 전직

     

    99. 번외 - 캐릭터 슬롯 채우기 추천 직업 : 레지스탕스

    생성하자마자 아무런 컷씬 없이 메뉴 조작이 가능하다

    99. 번외 - 유니온 레벨 채우기 추천 직업 : 모험가, 라라

    비교적 컷씬이 짧은 직업.
    필자가 아직 플레이하지 않은 직업도 있어 최선이 아닐 수도 있음.

    반응형
    COMMENT
     
    04
    03

    코드 내에 민감한 내용이 포함되는 경우

    개인 프로젝트를 하며 작성한 내용을 깃허브에 '공개' 상태로 올리고 싶은데, 위와 같이 민감한 키가 함께 올라가면 개인 프로젝트든 팀 프로젝트든 무척 큰 문제가 된다. 나중에 알아채고 지운 뒤 커밋을 하여도 아무튼 로그에는 남기 때문에 꽤나 머리가 아픈 상황.

    파이썬 등의 경우, '.env' 라는 이름의 파일을 두어 민감한 정보 등을 모아 읽어들여 사용하고, 해당 파일은 깃에 올리지 않는다.

    python 프로젝트의 .env 파일

    그리고 배포 시에는 플랫폼에서 해당 환경변수들을 직접 사용자가 입력하여 사용하는 등의 지원이 잘 되어있다.

    cloudtype.io 플랫폼에서의 환경변수 입력

    유니티에서는 스크립트를 읽을 수 있는 배포환경에서 민감한 내용을 따로 숨기는 방식은 찾지 못했기 때문에, '.env'와 같은 방식을 유니티에서도 사용하면 되겠다.

    1. env 파일 생성 (예: Assets/.env)

    WEB_SOCKET_URL=wss://ssyoutube.****
    CHANNEL_ID=UCOU****
    PAGE_IDX=mNzL****

    1+. env 작성 가이드 파일 생성(예: Assets/.env_template)

    다른 사용자가 작성하기 용이하도록 탬플릿을 작성 해 놓자.

    ".env"파일을 ignore 되기 전에 미리 커밋 해 두는 방식도 생각할 수 있지만, 프로젝트의 진행에 따라 필요한 내용이 많아질 수 있어 아래와 같은 방식이 좋을 듯 하다.

    WEB_SOCKET_URL=
    CHANNEL_ID=
    PAGE_IDX=

    2. .gitignore에 내용 추가.

    /Assets/.env

    3. Unity에서 .env 파일 파싱 클래스 작성

    using System.Collections.Generic;
    using System.IO;
    using UnityEngine;
    
    public static class EnvLoader
    {
        private static Dictionary<string, string> envValues = new Dictionary<string, string>();
    
        public static void LoadEnv(string path)
        {
            envValues.Clear();
    
            if (!File.Exists(path))
            {
                Debug.LogWarning($".env 파일이 존재하지 않습니다: {path}");
                return;
            }
    
            var lines = File.ReadAllLines(path);
            foreach (var line in lines)
            {
                if (string.IsNullOrWhiteSpace(line) || line.StartsWith("#")) continue;
    
                var parts = line.Split('=');
                if (parts.Length != 2) continue;
    
                var key = parts[0].Trim();
                var value = parts[1].Trim();
                envValues[key] = value;
            }
    
            Debug.Log(".env 파일 로드 완료");
        }
    
        public static string Get(string key, string defaultValue = "")
        {
            return envValues.TryGetValue(key, out var value) ? value : defaultValue;
        }
    }

    4. 외부 클래스에서 사용하기

    public class UnityWebSocketClient : MonoBehaviour
    {
        private static string WebSocketUrl;
        private static string ChannelId;
        private static string PageIdx;
    
        void Awake()
        {
            EnvLoader.LoadEnv(Application.dataPath + "/.env");
    
            WebSocketUrl = EnvLoader.Get("WEB_SOCKET_URL", "웹 소켓 URL을 여기에 입력하세요");
            ChannelId = EnvLoader.Get("CHANNEL_ID", "채널 ID를 여기에 입력하세요");
            PageIdx = EnvLoader.Get("PAGE_IDX", "페이지 인덱스를 여기에 입력하세요");
    
            Debug.Log($"WebSocket URL: {WebSocketUrl}");
        }
    }

     

    기타 주의사항

    위 방식과 다르게 .env를 Resources 폴더에 넣고, Resources.Load() 를 통해 파싱할 생각이라면, 정상적으로 읽어들이기 위해 마침표를 지우고 확장자를 txt나 json으로 두어야 할 것이다. (ex. "Resoruces/env.txt")

    반응형
    COMMENT
     
    03
    06

    필자의 필요에 의해 만들어보는 미디어 분류 저장을 위한 크롬 확장 프로그램.

    기능과 사용 예시는 아래와 같다.

     

    사용 예시


    1. 크롬 확장 프로그램의 아이콘을 눌러, 프리셋 이름과 폴더를 지정할 수 있다.

    2. 이미지(기타 미디어에도 확장 예정)를 우클릭하면, '이미지를 특정 폴더에 저장' 메뉴가 뜨며, 프리셋으로 지정해놓았던 이름이 있어 해당 위치에 저장하게 된다.

    개발 실패를 야기한 문제점

    **크롬 정책 상 절대경로 참조를 통한 저장이 불가능하다.**

    절대경로 저장을 위해서는, 저장 시점에 직접 폴더를 지정하거나 Native Messaging 외부 프로그램을 사용자가 함께 설치해야한다.
    - 직접 폴더지정의 경우는 애초에 설정한 프리셋이 무용지물이 되며 기존 기능인 '이미지를 다른 이름으로 저장...' 과 차이점이 없다.
    - Native Messaging 의 경우는 외부 프로그램의 힘을 빌려 연동하는 방식인데, 사용자가 직접 번거롭게 추가 세팅을 해야하는 게 제일 문제이다.

    경로를 하드코딩하며 직접 실행 해 보았지만, 역시 기본 다운로드 폴더의 밖을 참조하려고 하면 오류가 발생한다.

    즉 알려진 바로는 크롬의 기본 저장위치로부터의 상대경로(저장위치의 자식경로 한정)에만 저장이 가능하며, 이러한 제약사항때문에 확장프로그램의 효용성이 매우 떨어진다.

    반응형
    COMMENT
     
    02
    26

    아직도 변수명명을 일관되지 못하게 하고 있어서 생각난 김에 제대로 정하고 가려고 한다.

    앞으로 진행할 개인프로젝트에서도 유의할 것.

    일단 GPT 자문을 통해, Unity 스타일과 C# 스타일에도 살짝 차이가 있다고 한다. 일단 차이를 확인 해 보면,

    두 스타일이 크게 다르진 않은데,
    - private 멤버변수에 'm_'을 붙이느냐(Unity) 아니면 '_'을 붙이거나 아얘 생략하거나(C#) 할 수 있고
    - C# 스타일에서는 public 멤버변수는 프로퍼티 사용을 하는 게 기본 스타일이라고 적혀있는데, 더 찾아보지는 않았다. 그리고 C#은 PascalCase를 사용하는 정도.

    종종 변수명으로 private const string SERVER_ENDPOINT = "https://api.example.com"; 이렇게 ALL_CAPS의 경우도 보였는데, 이는 C++에서 주로 사용하는 스타일이고 C#에서는 ServerEndpoint 와 같이 PascalCase를 사용하는 게 권장된다고 한다. 또한 static readonly 변수의 경우에 특히 자주 보이는데 이 역시 PascalCase가 일반적으로 사용된다는 듯.
    유니티와는 별개로 환경변수 파일에서는 ALL_CAPS 명명이 일반적이었던 것으로 기억한다.

    게임개발 사이드라고 하더라도 유지보수에는 C# 스타일이 낫다고 하고, 개인적으로 m_ 명명법이 낯설어서 C# 스타일을 채택해야겠다.

    반응형
    COMMENT
     
    12
    10

    세부 옵션까지는 어렵지만 가능한 모든 메뉴를 만져보면서 익숙해지는 중.

    현재 단계에서 이해가 여려운 점

    1. 일단 타임라인에서 만든 이슈가, 보드 탭에서 안보이는 이유를 모르겠고 반대로도 보드에서 만든 이슈에 스타트날이랑 기한까지 붙여놓아도 타임라인에서 보이지 않는 점.

    2. 이슈 목록에서 보면 타임라인에서 만든 이슈는 '에픽'이고, 유형 보드에서 만든 이슈는 '작업'유형이 붙어있는데 why...

    계속 붙어서 익숙해져봐야겠다.

    반응형
    COMMENT
     
    11
    11

    튜토리얼을 따라하고 있었는데 Surface Options 가 보이지 않는다.
    노란색 부분이 보이도록 하고 싶음

    VFX 튜토리얼을 따라하고 있는데, 인스펙터에서 Surface Options 가 보이지 않는다.

    구글링 해도 해결법이 안 보여서 인스펙터를 직접 만져봤는데

    노란색 화살표로 표시 한 'Space' 속성을 Local 에서 World로 바꾸었더니, 잠깐의 로딩 후 Surface Options 카테고리가 보이기 시작했다.

    World 에서 Local로 바꾸어도 계속 보인다.

    아무래도 이런 식으로 한번 수정을 가해야 다른 옵션들(여기에서는 Surface Options)도 초기화가 이루어지는 듯 하다.

    반응형
    COMMENT
     
    11
    11

    체크한 부분이 안 뜨고 있었음, 해결 된 상태

    Output Particle Quad 키워드로 계속 찾다가 못 찾아서, 좀 더 그래프를 둘러보니 셰이더 그래프를 넣는 공간을 전혀 찾을 수가 없어 아래와 같은 키워드로 검색, 구글 검색 AI Labs 에서 나온 내용만으로도 해결되었다.

    Edit - Preferences - Visual Effects -> Experimental Operators/Blocks 체크

    요렇게 체크해준 뒤, 첫 사진처럼 셰이더그래프를 넣을 수 있는 공간이 생긴 것을 확인하였다.

    반응형
    COMMENT
     
    11
    07

    오늘 받은 메일

    평소에 GPT4-o 를 잘 쓰고 있던지라 유니티 AI가 궁금하기는 했다.

    실험프로그램에 참여하면 구독 없이 써 볼 수 있다고 해서 일단 신청을 넣어두었는데, 1~2일 내에 다시 메일이 온다고 한다.

    반응형
    COMMENT
     
    11
    01

    아래는 GPT로 정리한 해결 가이드


    상품 페이지

    1. 캡슐 이미지 문제:
      • 문제: 캡슐 이미지에서 로고나 제품명이 음악 배너로 가려져 있습니다.
      • 해결 방법: 다음 캡슐 이미지들이 로고나 제품명이 잘 보이도록 수정해야 합니다.
        • 헤더 이미지 (header.jpg)
        • 소형 캡슐 (capsule_231x87.jpg)
      • 참고 자료: 스팀의 캡슐 이미지 가이드라인을 확인하여 기준에 맞게 수정하세요. 캡슐 이미지 가이드라인.
    2. 설명 중복 문제:
      • 문제: 설명에 트랙 리스트가 포함되어 있어 메타데이터에 표시된 트랙 리스트와 중복됩니다.
      • 해결 방법: 설명에서 트랙 리스트 부분을 삭제하여 중복을 피하세요.
    3. 시스템 요구 사항 문제:
      • 문제: 시스템 요구 사항에서 일반 음질 파일과 고음질 파일 모두 동일한 크기가 표시되어 있습니다.
      • 해결 방법: 파일 크기가 정확히 반영되었는지 확인하세요. 표준 MP3 오디오만 제공하는 경우, 고음질 오디오 관련 언급은 삭제하는 것이 좋습니다.

    사운드트랙 파일

    1. MP3 파일 필수 요구 사항:
      • 문제: 스팀에서는 모든 사운드트랙에 MP3 파일이 포함되어야 합니다.
      • 해결 방법: Normal 디포에 MP3 형식의 사운드트랙 파일을 다시 업로드하세요.
    2. 고음질 파일 (선택 사항):
      • 문제: MP3가 아닌 고음질 파일은 별도의 Optional High-Quality 디포에 업로드해야 합니다.
      • 해결 방법: MP3 외의 고음질 파일이 있는 경우, Optional High-Quality 디포에 추가하고 설명에 해당 내용을 언급하세요.
    3. 디포 설정 오류:
      • 문제: 현재 고음질 파일이 "normal audio" 디포에 설정되어 있어 문제가 됩니다.
      • 해결 방법: 디포 설정을 다음과 같이 수정하세요:
        • Normal 디포에는 MP3 파일만 포함시킵니다.
        • Optional High-Quality 디포에는 고음질 형식의 파일을 포함시킵니다.
      • 참고 자료: 스팀의 사운드트랙 디포 설정 관련 문서를 확인해 보세요. 사운드트랙 디포 설정 가이드.

    다시 정리

    • Normal 디포에 기존 업로드했던 WAV파일 대신 MP3 파일을 다시 업로드 할 것
    • 기존 업로드 했던 WAV 파일은 Optional High-Quality 디포 로 수정
    • 캡슐 이미지(헤더 이미지, 소형 캡슐) 가이드에 맞게 수정
    • 설명에서 트랙 리스트에 관한 내용 빼기

    캡슐 이미지
    ChatGPT QA
    새로 업로드 할 헤더 이미지
    사운드트랙 설명

    MP3파일용 디포, WAV파일용 디포를 새로 파고 각각 업로드.

    가장 빠른 번호의 디포(앱 디포)를 꼭 채워야 하는 것 같다.

     

    내 경우에는 앱 디포 번호가 ~~~~21 이었고

    1차 시도에서

    MP3파일용 디포를 ~~22번에, WAV파일용 디포를 ~~23번에 생성했는데 21번이 비어있는 상태라 진행이 안되었다.

    위 디포들을 지우고 다시 21번에 MP3, 22번에 WAV용 디포를 작성하고 파일을 업로드했다.

    이 체크표시를 해결하기 위해 거의 한 시간을 찾아 헤멨다.

    상점 및 Devcomp 패키지 일치
    출시 테스트를 위해 귀하의 devcomp 패키지는 반드시 상점 패키지와 같은 디포를 포함해야 합니다.

    진짜 한참을 헤멨다. 아래와 같은 packagelanding 주소를 가지는 페이지에서 작업이 필요했었다.

    packagelanding

    '포함된 디포' 에 현재 사용하고 있는 디포 중 누락된 게 있어 포함시켜주었다.

    패키지랜딩 페이지에 어떻게 찾아갔는지, '뒤로가기'를 눌러 이전 페이지로 돌아가서 다시 찾는데도 한참이 걸렸다(...)

    '관련 패키지 및 DLC' 하단의 내용 중

    위 보이는 스크린샷에서, 빨간색 패키지를 클릭하면 나오는 페이지였다

    아무튼 해결

    2차 검토 신청을 하자

    반응형

    '다이어리' 카테고리의 다른 글

    JIRA 입문 중  (0) 2024.12.10
    유니티 Muse 실험 프로그램 참여  (0) 2024.11.07
    Python FastAPI 범용 게임 데이터 서버  (3) 2024.10.31
    스타트업 인턴 2일차 진행 중  (2) 2024.10.23
    Day 1  (0) 2024.10.08
    COMMENT