전체 글 (201)

  • 04:17:27
  • 2025.04.02
  • 2025.03.06
  • 2025.02.26
  • 2025.02.06
  • 2024.12.10
  • 2024.11.11
  • 2024.11.11
  • 2024.11.07
  • 2024.11.01
  • 2024.10.31
  • 2024.10.23
  • 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
     
    04
    02

    파이널판타지 글로벌서버 7.2 업데이트 (2025.03.25) 기점으로 적당히 복귀

    비공식 서버 내 업적랭킹이 약 3년 간 23위가 밀려 25위에 위치해 있는 상태.

    밀려있던 컨텐츠를 밀면서 위로 올라가보는 기록

    반응형

    'Game > FFXIV' 카테고리의 다른 글

    파이널판타지 내 미코테 근황  (0) 2024.02.02
    [FFXIV] 탐험수첩 18번  (0) 2018.07.27
    [FFXIV] 탐험수첩 3번  (0) 2018.07.27
    [FFXIV] 탐험수첩 9번  (0) 2018.07.27
    [FFXIV] 탐험수첩 19번  (0) 2018.07.26
    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
     
    10
    31

    한개 서버로 여러 서비스 폴더별로 구분하여 관리

    파일 시스템 구조

    • 미리보기

    서비스 생성

    새로운 서비스(앱, 게임 등) 생성 시, GameData, UserData, OtherData 폴더가 함께 생성되도록 하고, UserData 폴더에는 Info.json 파일을 생성하여 신규 유저의 UID 부여에 참고하도록 한다.

    {"next_uid": "000000000"}

    유저 정보 생성(회원가입)

    회원가입을 위해 서비스 이름, 입력ID, 입력Password와 함께 서버에 요청한다.

    1. 서비스가 있는지 확인, 겹치는 유저 ID가 있는지 확인
    2. (입력Password + 16자리의 salt) 를 해시 암호화 한 패스워드를 얻는다
    3. UID의 폴더를 생성하고, Base.json을 작성한다.
      1. uid, id, pass, salt 를 보관한다.

    데이터 백업 압축파일 다운로드

    백업했던 데이터 업로드하여 복원(덮어쓰기)

    게임 데이터 업로드(기존 서버의 게임 데이터를 덮기)

    게임 데이터 GET

    로그인 기능

    • SERVICE 내 ID PASS 검증.(즉 이 세 요소를 서버에 같이 전송해야함)
    • 토큰발행 후 유저에게 전송, 서버에 보관, (토큰-UID) 쌍이면 괜찮으려나
      • 아까 UserData 폴더 내에 Info.json 파일로 UID 관리했듯이, Token.json 하나 미리 마련해두고 여기에서 동적으로 관리하면 될 것 같다.

    로그아웃 기능

    • 클라이언트 앱이 종료되거나, 로그아웃 버튼을 누르면 서버에서 로그아웃 기능 수행. Key값이 해당 계정의 토큰값인 아이템을 삭제하면 되나?
    • 또는 토큰이 추가된 후 일정 시간(24시간?) 지난 게 확인되면 역시 보관된 아이템을 삭제하면 될듯. 만약 삭제된 뒤로 유저가 토큰으로 유저데이터에 접근을 시도할 경우, 클라이언트에 “님 지금 토큰이 보관되어있지 않은 것 같은데 로그인좀 다시 하셈” 이라고 메시지를 보내면 될 것 같다.

    유저 데이터 통으로 업데이트

    유저 특정 데이터 업데이트

    유저 데이터 모두 얻기

    유저 특정 데이터 얻기

    랭킹 시스템(업로드)

    Get 랭크보드(상위 N명)

    반응형
    COMMENT
     
    10
    23

    1 인턴 개요

    하루 네 시간 인턴 활동, 10월 중순부터 12월 중순까지 두 달 간 진행한다.
    시급 1만원 계산으로 두 달 160만 지원금 지급. 용역 계약으로 적혀 있어 인턴으로써 급료를 받는 건 아니다.
    매칭된 회사에 출퇴근하기 위해 판교로 거주지를 이동했다.

    2 주요 활동

    현업 팀장 및 인턴 팀원과 두달 간 한 개의 게임을 기획부터 완성까지 진행한다. 성공적으로 완료하여 정식 채용가지 이어지면 좋겠다.

    3 기타

    판교, 퇴근 시간 교통체증이 자비가 없다.
    버스를 타고 귀가를 해야 하는데 사람이 너무 많아 다 타지 못해 다음 버스를 기다렸다. 배차간격도 무자비했다.
    거주 고시원 근처에 새벽 5시 반까지 열려있는 넓은 카페가 있어 좋다.

    반응형
    COMMENT