전체 글 (195)

  • 2024.02.20
  • 2024.02.20
  • 2024.02.19
  • 2024.02.18
  • 2024.02.15
  • 2024.02.14
  • 2024.02.13
  • 2024.02.08
  • 2024.02.07
  • 2024.02.07
  • 2024.02.05
  • 2024.02.02
  • 02
    20

    0. 개요

    유튜브 보다가 흥미로워 보이는 프로그램을 발견해서 바로 찾아보았다. 해당 영상의 설명란에서 Domino에서 열 수 있는 파일(큐우쿠라링.dms)을 배포하고 있다.

    1. 설치

    다운로드 버튼

    • 영어(비공식 번역) : Github: Hans5958 - Domino-English-Translation
      • 영어 번역이 대부분 되어있지만 인코딩 문제로 한글이 표시되어야 할 곳은 여전히 깨져 보인다. 어플로케일 등으로 실행하여 해결하면 될 듯 하지만, 당장 시연에는 문제가 없으므로 그냥 사용

    압축파일을 해제하여, Domino.exe 파일실행

    2. 간단 사용법

    아래와 같은 사용법을 순서대로 정리한다.

    • dms 파일을 여는 방법
    • 모든 트랙을 보는 방법
    • 재생 시, 스피커에서 들리도록 설정

    압축 해제 된 모습

    압축 해제 후, Domino.exe를 실행하여 에디터를 열 수 있다.

    Domino.exe를 실행하면 보이는 모습

    영어 버전의 경우, Defender의 보안 설정을 통해 해당 파일을 수동으로 예외처리해야 실행할 수 있을지도 모르지만, 여기에는 정리하지 않는다.

    정상적으로 열렸다면 위와 같은 모습. 준비된 파일(위 영상의 설명란에서 곡의 dms 파일을 배포 중)을 불러오자.

    `File - Open`을 통해 준비된 dms 파일을 열어본다

    파일을 정상적으로 열면, 아래와 같은 모습을 확인 할 수 있다.

    파일을 연 직후의 상태

    좌측 패널에서 여러가지 이벤트(각 음에 대한 정보, 곡의 세팅, 곡의 시작과 종료 등)에 대한 내용을 확인 할 수 있고(현재 선택된 트랙에 따라서는 아무것도 적혀있지 않을 수 있음),

    노트를 시각화 한 정보는 우측 패널에 아직 보이지 않을 수 있다. Tab(View - Track List, 표 모양의 아이콘 형태로도 있음)을 눌러 곡의 모든 트랙을 확인 할 수 있다.

    트랙 리스트로 토글 한 모습. 표시한 부분에서 줌 기능 사용 가능

    스크린샷에 표시한 아이콘으로 X축과 Y축의 줌인 줌아웃을 할 수 있다. 물론 단축키로도 사용 할 수 있다.

    상하 이동은 마우스 휠을, 좌우 이동은 Shift를 누른 상태에서 마우스 휠을 이용해 이동 할 수 있다.

    여러 트랙이 잘 열린 것을 확인하였으니, 다시 Tab을 눌러 원래 모드로 돌아온다.

    아이콘을 눌러 Onion Skin을 사용한다

    먼저 모여준 영상과 같이, 모든 트랙의 노트를 한번에 시각화 할 수 있도록 하고 싶은데, 이는 Onion Skin이라는 것을 사용한다. Overlay Specific Track(s)를 선택하여, 내가 선택한 트랙이 모두 보여지도록 할 수 있다.

    Shift를 누른 채로, 처음과 끝을 선택 한 모습
    Ctrl을 누른 채로 원하는 트랙을 선택 한 모습

    여러 트랙을 선택하기 위해서는 아무래도 Shift키나 Ctrl 키를 사용할 수 밖에 없어 보인다. 아무튼 이렇게 보여줄 트랙을 모두 고른 후 OK를 눌러본다.

    Onion Skin을 통해 모든 트랙을 오버레이 한 모습. 작성자가 세팅한 곡의 Start 이벤트 지점등으로 이동할 수 있고, SpaceBar로 재생 할 수 있다.

    현재 선택한 트랙 이외에도 다른 트랙이 오버레이되어 보여지게 된다.

    파일 작성자가 세팅 해 둔 Setup 지점이나 Start 지점으로 버튼 클릭을 통해 이동 할 수 있고, 스페이스바 또는 재생 아이콘을 눌러 재생을 할 수 있다.

    Domino를 설치한 직후라면, 소리가 들리지 않을 텐데, 이에 대한 설정이 필요하다.

    `File - Preferences...`로 환경설정에 진입
    `MIDI-OUT - MIDI OUT 장치선택(으로 추정)`에서 장치 선택

    위와 같이 설정에 진입하여 MIDI-OUT 탭에서 Microsoft GS Wavetable Synth 장치를 선택하고 OK 버튼을 클릭한다.

    재생 시 정상적으로 스피커를 통해 재생되는 곡을 들을 수 있다.

    99. 참고자료

    모든 트랙을 표시(Onion Skin) - https://tounderlinedk.blogspot.com/2011/02/domino_25.html

    반응형
    COMMENT
     
    02
    20

    개인 연구와 미니 프로젝트에 관한 내용은 한 게시글에 작성중이며, 업데이트할 내용시 포스트를 수정합니다.
    모든 연구 페이지(현재 미작성)에서 진행중인 모든 주제를 확인 할 수 있습니다.

    모든 연구 포스트는 시간 흐름대로 작성중이며, 연구주제는 업데이트가 있을 수 있습니다.
    현재 진행도(2024.02.20 ~ 2024.02.20(끝))

    0. 주제

    midi 음계를 상하반전 시켜주거나 음계 일괄조정(Inverting MIDI Scales Vertically or Bulk Adjusting Pitch)

    1. 사용하고 싶은 기능

    2024.02.20
    현재 부분을 작성하는 시점, 전문 DAW를 사용하는 방법 외에 다른 수단을 찾아보지 않았습니다.

    인터넷에서 여러가지 음악과 노래의 midi파일을 구할 수 있고, 이를 바탕으로 다른 악기로의 연주, 여러가지 이펙트를 넣어 사용할 수 있지만, 그 전에 원본 midi를 높낮이 반전 또는 shift pitch만을 간단하게 하여 새로운 느낌의 소스로 선행작업을 해 줄 수 있다고 생각하였습니다.(물론 DAW에서는 정말 간단하게 두 가지 작업을 할 수 있으나, 여기서는 DAW를 사용하지 않고 선행작업을 하는 방법을 생각합니다.)

    먼저 사용 가능한 소프트웨어와 프로젝트가 있는지 찾아보았습니다.

    위 프로젝트의 프로그램을 사용 해 보았습니다.

    CarlosManuelRodr/Midi-Transform
    Unwelcome_School.mid
    0.01MB

    File: Orig

    Invert.mid
    0.01MB

    File:  Invert

    Revert.mid
    0.01MB

    File:  Revert

    ChangePitch+2.mid
    0.01MB

    File:  ChangePitch+2

    Invert+Revert.mid
    0.01MB

    File:  Invert+Revert

     

    Invert(상하반전), Revert(곡의 처음과 끝 뒤집기), Change Pitch 셋 다 모두 정상적으로 작동하는 것을 확인했습니다.

    개인적으로 원본이 괜찮다면 Invert+Revert가 의외로 괜찮게 나오지 않을까? 라고 생각했지만, 그렇지 않았습니다.

    2. 종료

    이미 같은 기능을 구현 해 놓은 프로젝트가 있는 것을 확인했기 때문에 종료, 저장 해 두고 유용하게 쓸 수 있을지도 모르겠습니다.

    반응형
    COMMENT
     
    02
    19

    과정명 : 내일배움캠프 Unity 게임개발 3기

    전체진행도 : 38일차

    부분진행도 : Chapter5.1 - 1일차

    작성일자 : 2024.02.19(월)

    개발일지 목록 : 클릭


    입문과 숙련을 넘어 심화주차(개인 1주, 팀 1주)에 진입했다. 밀린 세션과 강의도 있고, 최종프로젝트 관련하여 깊게 생각할 일도 있고(스테미너 소모량 높음), 새로운 팀과 소통하는 일도 피로도가 누적되어 있어 힘든 것 같다.

    이번 개인 주차와 팀 주차의 과제는 거의 자유작성이다. 개인 주차도 그렇지만, 팀 주차는 되도록 가볍게 하면 좋겠다고 생각했다. 컨텐츠적인 요소를 너무 많이 만들다보니 압박감도 심하고 좋은 코드를 고민할 여유가 없어진다.

    반응형
    COMMENT
     
    02
    18

    과정명 : 내일배움캠프 Unity 게임개발 3기

    전체진행도 : 37일차

    부분진행도 : Chapter4.2 - 5일차

    작성일자 : 2024.02.16(금)

    개발일지 목록 : 클릭


    1. 진행중인 과정에 대해

    팀 과제 마지막날, 발표를 무사히 끝냈다. (확인해보니 포스트 내용이 날아가 있어 간단하게나마 수정중)

    2. 오늘 학습에 대해

    • 게임 개발에 있어 느낀 점
      • 이번엔 UI 구조화를 나름 도전 해 보았는데, 기반이 갖춰지는 만큼 이후 스퍼트에서 좋은 효율을 보였다.
        • 일단 구축 역량이 제일 중요하다
        • 구조 구축에 긴 시간이 필요하거나 개발 기간이 극도로 짧다면 분배를 정말 잘 하여야겠다.
      • Manager들의 구성에 대해 소통을 잘 해야 한다.
        • 전체 매니저를 관리하거나, 게임 전체를 총괄하는 매니저의 부재로, 개인적으로 TempManagers라는 매니저를 사용하였는데, 소통의 부재로 개인용 매니저가 되어버렸다. 사실 그래도 상관은 없었지만 나중에 본다면 구조적으로 아쉬운 부분이 될 것은 확실하다.
    • 발표 준비에 있어 느낀 점
      • 밤을 새며 준비한 것 치고는 볼륨을 많이 낼 수가 없었다. 발표라는 걸 해본 경험이 거의 없었기 때문이라고는 생각하지만 상상 이상으로 시간을 소요했다.
      • 전체적인 흐름은 나쁘지 않았다고 생각하지만, 확 와닿는 핀트를 잡지 못했다고 생각했다.
        • 게임 소개는 좋은 흐름이었다고 생각한다.
        • 기술적인 부분은 기존 안내된 대로 팀원이 각자 1분 30초가량의 영상을 준비하여 넣어 괜찮았는데, 이렇게 하지 않았다면 내가 직접 기술적인 내용을 많이 넣지는 못했을 것이라고 생각한다. 앞으로 발표 자료를 준비할 일이 있다면 더 신경써야 할 것.
        • 팀원 역할에 대해서는 넣었지만 각자의 개성을 보여주는 것은 포기했다. 발표를 듣는 사람의 관점에 따라 해당 내용은 호불호가 크게 갈리지 않을까 싶다.
        • 마지막 슬라이드에 '-終-' 이라는 문구 괜히 넣은 것 같다.
      • 시연 영상의 촬영
        • 무척 시간이 오래 걸리지는 않았고, 편집 중 나레이션이 비는 부분이 많아 자연스럽게 영상과 엮기가 어려웠다.
        • 그래도 미리 어떤 내용과 흐름으로 할 지 설계를 해 두고, 그에 맞게 의식하며 게임 시연 영상을 찍고 나레이션을 녹화하는 것은 좋은 선택이었던 것 같다. 문제가 되었던 건 그저 경험이 부족해서 전체적인 그림이 잘 그려지지 않았던 것.
      • 그 외
        • 발표에 어울리는 잔잔한 목소리들이 부럽다. 이에 관한 연습도 하면 되는걸까.

    3. 과제에 대해

    • 팀 리포지토리 포크 하여 정돈해두기
    • 챌린지반 세션 델리게이트 내용 이후 다시 보며 익히기
    • 오는 주차 제공 강의 학습하고 익숙해지기
    • 루키스 강의도 시간 내서 보고 싶은데, 과연.
    반응형
    COMMENT
     
    02
    15

    과정명 : 내일배움캠프 Unity 게임개발 3기

    전체진행도 : 36일차

    부분진행도 : Chapter4.2 - 4일차

    작성일자 : 2024.02.15(목)

    개발일지 목록 : 클릭


    1. 진행중인 과정에 대해

    유니티 게임개발 숙련주차의 팀 프로젝트 4/5일째 진행중이다.

    3D 플랫폼 퍼즐게임을 개발중이고, UI전반을 맡아 진행중에 있다.

    UI를 구성할 뼈대를 갖추는 데 시간이 많이 걸렸고, 스퍼트가 붙기 시작할 때 즈음 마감일이 다가와서 아쉬운 기분이다.

    아직 해야 할 작업이 많이 남았는데, 룰렛을 돌려 발표담당까지 맡게 되었다. 앞으로 14시간 뒤가 과제 제출 마감시간이고, 16시간 뒤 발표 세션을 시작한다. 밤샘각이지만 14시간이나 있으니 어떻게든 되겠지라는 생각중이다.

    2. 오늘 학습에 대해

    팀 리포지토리 커밋 그래프

    이전 프로젝트와는 다르게, 오브젝트들을 모두 제대로 프리팹화 하여 작업들을 했기 때문에, 브렌치들이 머지 될 때 충돌이 아얘 없었다. 하나 보였던 충돌은, 빌드세팅에서 설정 차이가 조금 있었다는 점 1회.

    각자 만든 이벤트에 모두 구독 시스템을 잘 넣어두었기 때문에, 머지 이후에도 나름 쉽게 서로 연동이 잘 되었다.

    3. 과제에 대해

    - UI 작업 마치기, 발표 자료 만들고 제출 준비하기

    반응형
    COMMENT
     
    02
    14

    과정명 : 내일배움캠프 Unity 게임개발 3기

    전체진행도 : 35일차

    부분진행도 : Chapter4.2 - 3일차

    작성일자 : 2024.02.14(수)

    개발일지 목록 : 클릭


    1. 진행중인 과정에 대해

    팀 프로젝트 3/5(발표날 포함)일째이다. 3D플랫폼 퍼즐 게임을 진행중이고, UI 및 씬 관리 전반을 하고있다.

    굉장히 시간이 모자라다. 스크립트와 UI의 기본적인 프리팹은 모두 준비되었는데, 메인 브런치에 Merge를 해가며 진행할 요소가 너무 많아 시간에 맞출 수 없을 것 같은 기분이 들고, UI가 아니더라도 퍼즐 쪽도 어떻게 진행이 될지, 내일 하루만에 완성을 해야할텐데 정말 모르겠다.

    Todo 리스트를 열심히 지워가며 진행중인데도 아직 할 게 많이 남았고 많이 또 생길 것 같다.

    Todo

    • 현재 Data에 따라 Stage 해금되도록 하기, 스테이지 선택 할 수 있도록 하기
    • 애니메이션이나 Fade in out 효과 넣기
    • 전체적인 디자인 손보기

    Merge 후 손보기

    • ESC키로 UI_Pause 띄우게 하기 : 제대로 메서드 써서 씌워야 Popup 오더 관리 됨
    • Player가 상호작용 가능 할 때, 어떻게 UI를 보여줄지 생각
    • Player의 상태를 보여줄 때, 어떻게 UI를 보여줄지 생각
    • 위 두 가지 사항에 대해, 화면 내 어느 위치에 UI를 배치하고 구현할지 생각
    • Player가 분신을 만들었을 때, 어떻게 UI를 보여줄지 생각
    • 게임을 클리어 했을 때, 어떻게 UI를 보여줄지 생각
    • 결과 데이터 저장

    일단 생각나는 것만 해도 이 정도. 에셋 찾아와서 UI를 꾸미는 게 정말 시간이 오래 걸릴 것 같은데 다른 것도 만만치 않다.

    2. 오늘 학습에 대해

    Unity의 생명주기때문에 코드가 꼬이는 일이 종종 있다. 매번 난감해서 생소한 코딩을 하며 해결을 하였는데, 오늘은 여러 스크립트가 꼬여 그렇게도 할 수가 없어, UI의 Start() 메서드에 사용하던 모든 코드를 통째로 다른곳으로 옮겨 작업을 해야만했다. 오브젝트를 만들고 컴포넌트를 붙여주는 작업이 그 오브젝트의 Start 메서드보다 빨리 실행되어 Null을 갖게 된 게 이유이다. 조금 더 경험이 쌓여있었다면 더 나은 방법으로 해결 할 수 있었을까 생각한다.

    3. 과제에 대해

    • 팀 프로젝트 되는 데까지 하기
    반응형
    COMMENT
     
    02
    13

    과정명 : 내일배움캠프 Unity 게임개발 3기

    전체진행도 : 34일차

    부분진행도 : Chapter4.2 - 2일차

    작성일자 : 2024.02.13(화)

    개발일지 목록 : 클릭


    1. 진행중인 과정에 대해

    심화주차 팀 과제 2/5일차(발표날 포함)이다. 3D 플랫폼 퍼즐 게임을 만들고 있고, UI 전반 관리의 역할을 맡았다.

    1일차에 준비 해 둔 UI요소들

    1일차에 UI 요소들을 만들었는데, UI를 관리할 능력이 없어 관련 강의를 듣고 스크립트를 짜는 법을 대강이나마 배워왔다.

    어설프지만 그렇게 만들어진 오늘의 스크립트들의 목록은 위와 같다. 아직 매끄럽지 못한 부분이 많아 계속 손보아야 하지만 시간이 부족하다. 뼈대는 어찌저찌 마련하였으니 이젠 원래 스타일대로 깡코딩으로 밀어붙일 차례인 듯 하다.

    2. 오늘 학습에 대해

    오늘은 코테준비 없이 UI작업을 계속하였다. 메모 해 둘 정도의 트러블슈팅은 없었고, 간단하게 배운 내용을 조금 정리.

    게임이 로드 될 때 실행되는 특별한 메서드(유니티에서 지원)

    Monobehaviour을 상속받는 Managers.cs에서 사용한 방법이다.

    씬 위에 오브젝트와 컴포넌트를 배치하지 않더라고 게임이 로드 될 때 함께 메서드를 실행시켜주는 방법이 있었다.

    // 게임이 로드될 때 자동으로 실행
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    static void OnBeforeSceneLoadRuntimeMethod() 
    {
        Init();
    }

    게임 시작 시, Awake 실행 이전에 한번만 호출되는 함수이며, 나는 이 메서드에 Init()메서드를 두고, Init 메서드에서 @Managers 오브젝트의 생성과 그 안에 여러가지 Manager류 컴포넌트를 추가하는 방식을 사용하였다.

    팝업의 배경에 IPointerClickHandler를 상속

    팝업의 외부에 화면을 덮는 이미지를 만들어준 후(투명도는 자유, Raycast Target 옵션을 켜주어야 한다) 사용하면 좋고, 이 배경의 클릭 이벤트에 대응할 메서드를 버튼 컴포넌트 없이 쉽게 작성 할 수 있다.

    public class BlockBG : MonoBehaviour, IPointerClickHandler
    {
        public void OnPointerClick(PointerEventData eventData)
        {
            // BG 클릭 시, 가장 최근의 팝업을 지우기
            TempManagers.UI.ClosePopupUI();
        }
    }

    본인의 경우는 UIManager에서 팝업 관리 메서드 중 하나(닫기)를 사용했지만, 다른 방법으로도 쉽게 팝업을 닫던가 다른 행동을 할 수도 있다.

    3. 과제에 대해

    • UI 빡세게 구현 진행하기... 당장 공부하기도 구현하기도 시간이 너무 부족하다.
    반응형
    COMMENT
     
    02
    08

    과정명 : 내일배움캠프 Unity 게임개발 3기

    전체진행도 : 33일차

    부분진행도 : Chapter4.2 - 1일차

    작성일자 : 2024.02.08(목)

    개발일지 목록 : 클릭


    1. 진행중인 과정에 대해

    숙련주차 팀 과제의 시작이다. 설 연휴 제외 오늘 포함 4일간 개발을 하고, 다음날 발표를 한다.

    이번 주제 역시 쉽지 않았다. 주어진 네개의 토픽 중 하나를 선택하여 기능구현을 한다. 우리 조는 긴 회의 끝에 3D 플랫폼 퍼즐 게임을 선택했다. 다른 세개의 주제도 쉽지 않아보였지만, 우리조도 만만치 않다.

    2. 오늘 학습에 대해

    저작권 특강 세션

    저작권과 관련하여 간단한 특강 세션을 진행했다.

    나는 저작권에 대해 자세한 내용은 거의 찾아본 적이 없었기 때문에 무척 도움이 되는 내용들이었다.

    일단 자주 보였지만 자세히 알아보지는 않았던 CC 라이선스에 대한 내용이다.

    크리에이티브 커먼즈 라이선스

    이용 허락 조건 네 종류(생각보다 적었다) 기호의 뜻만 알고 있어도 큰 불편함이 없을 것으로 보였다.

    • 사람 모양은, 출처를 표기하기.
    • 달러 모양은, 영리목적 금지
    • 이퀄 모양은, 변경 금지
    • 재사용같은 화살표 모양은, 변경 가능이지만 이후 창작물에 동일한 라이선스를 붙이기

    그리고, 어떻게 사용해도 상관없는 CC0 퍼블릭도메인 저작권이다.(땡큐를 외치며 사용하면 된다고)

    실제 예시도 다양하게 들을 수 있었는데, 저작권의 라이센스를 준수하며 사용한다고 하여도 문제가 발생할 수 있는 경우가 있다.

    • 판매자A의 저작물을 구매하여 사용하였다.
    • 나중에 알고보니, 판매자A는 판매자B의 저작물을 무단으로 판매하였다.

    이러한 경우 B로부터의 법적인 소송을 대비하기 위해, 나는 해당 저작물을 사용하기 시작하면서 판매자 A에게 이 저작물을 어떠한 용도로 사용한다는 이메일을 보내두는 방법을 사용할 수 있다.(A로부터의 답장이 없을 시, 한 달 정도 단위로 계속 연락을 시도한다.)

    이러한 기록을 확실히 쌓아두어 나는 A에게 저작물을 구매하여 억울하다는 입장이었다는 것을 보여줄 수 있다.

    프로젝트 진행

    앞서 적은 것처럼, 팀의 프로젝트로 '3D 플랫폼 퍼즐게임'을 선정했다.

    역할 분담으로는 UI 전반과 씬 전환 관리를 맡았다.

    회의 내용이 무척 많았고 길었기 때문에, 오늘의 개발 시간은 많지 않았다.

    나는 일단 UI 관련한 오브젝트들을 마련하였다. 스크립트 등은 내일부터 구상하거나 더 배우고 손대려고 한다.

    구현할 UI들 구상
    타이틀 씬에서 사용할 UI 패널들
    게임 씬에서 사용할 UI 패널들

    슬라이드바는 관련한 내용을 알아보고 넣을 예정이고, 이러한 UI 관련 강의들을 설 연휴(내일부터)에 찾아보며 공부해야겠다.

    개발기간이 4일밖에 되지 않아 퍼즐게임이 잘 만들어질지 모르겠다. 일단 아이디어가 부족해보이는 상황이다.

    적어도 UI만은 어디서든 접근하기 쉽도록 설계해야겠다.

    3. 과제에 대해

    • UI 관련 내용 많이 학습해서 팀 프로젝트에 기여하기

    4. 참고자료

    반응형
    COMMENT
     
    02
    07

    과정명 : 내일배움캠프 Unity 게임개발 3기

    전체진행도 : 32일차

    부분진행도 : Chapter4.1 - 5일차

    작성일자 : 2024.02.07(수)

    개발일지 목록 : 클릭


    1. 진행중인 과정에 대해

    11시간에 걸친 밤샘 개인 과제 작성을 마쳤다. 오전 10시까지 제출이었는데 기능구현을 마치고 마지막까지 README와 혹시 있을 버그를 열심히 손보았다.

    내일부터는 약 일주일간 숙련주차의 팀 과제를 시작한다. 어떤 주제로 하게 될지는 아직 미지수.

    어제 캠프내 새로 사귀게 된 분들과 얘기를 하며 구조화에 대한 시야도 넓히고, 강의를 추천받았는데 굉장히 듣고 싶은 내용이었다.

    지금까지 내가 소화할 지 미지수인 것도 있고 유료라는 허들이 커서 유료강의는 거의 듣지 않았는데, 이번에 추천받은 Rookiss씨의 강의는 가격이 좀 나가도 내용이 무척 깊어 보여 엄청 듣고싶다고 생각하였다. 로드맵 강의를 따라가면 572,000원.

    아, 그리고 이전 입문 주차에 소화하지 못한 강의와, 이번 숙련주차에 소화하지 못한 13/13강 마지막 강의가 있다. 이것도 공부해야 할 듯.

    2. 오늘 학습에 대해

    과제 도중 이슈

    InputField의 값이 갱신되지 않는 버그

    발단

    public class Withdraw : MonoBehaviour
    {
        [SerializeField] private int amount;
    
        public InputField amountInput;
    
        public GameObject[] goSuccess;
        public GameObject popupObject;
        public Text AlertText;
    
        public DisplayText displayTextManager;
        public void OnClickButton()
        {
            if (amount < 1)
                amount = int.Parse(amountInput.text);
    
            if (DataManager.Instance.Withdraw(amount))
            {
                displayTextManager.RenewDisplay();
                foreach (GameObject go in goSuccess)
                    go.SetActive(!go.activeSelf);
                return;
            }
    
            AlertText.text = "계좌 잔금이 부족합니다.";
            popupObject.SetActive(!popupObject.activeSelf);
        }
    }

    값을 필드에 입력하고 출금 버튼을 클릭 시(OnClickButton()), 일정 금액이 출금된다.

    다른 금액을 다시 넣어 시도 시, 처음에 넣었던 금액만큼의 처리가 계속되는 현상이 있다.

    당장 코드만 보면 크게 문제가 없어 보였으나, 원인을 발견하였다.

    코드와 원인에 대해

    해당 메서드는, '10000원 버튼', '30000원 버튼', '50000원 버튼'을 누를 경우에도 대응되도록, 미리 설정된 amount가 1만, 3만, 5만이 아닐 경우(amount<1) InputField로부터 유저로부터 입력받은 값을 가져오도록 했다.

    그래서, amount가 새로 설정되는 시점부터 그 이후는 amount값이 1보다 크기 때문에 갱신을 하지 않은 것이었다.

    해결

    조건 분기를 위해 새로운 변수를 추가했다. [SerializeField] private bool useAmountInput;

    해당 변수는 에디터에서 체크를 할 수 있으며, InputField를 사용하여 유저가 직접 값을 입력하는 케이스에 체크 해 두도록 한다.

    수정된 코드는 아래와 같다.

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class Withdraw : MonoBehaviour
    {
        [SerializeField] private int amount;
        [SerializeField] private bool useAmountInput; // 추가된 부분
        public InputField amountInput;
    
        public GameObject[] goSuccess;
        public GameObject popupObject;
        public Text AlertText;
    
        public DisplayText displayTextManager;
        public void OnClickButton()
        {
            if (useAmountInput) // 수정된 부분
                amount = int.Parse(amountInput.text);
    
            if (DataManager.Instance.Withdraw(amount))
            {
                displayTextManager.RenewDisplay();
                foreach (GameObject go in goSuccess)
                    go.SetActive(!go.activeSelf);
                return;
            }
    
            AlertText.text = "계좌 잔금이 부족합니다.";
            popupObject.SetActive(!popupObject.activeSelf);
        }
    }

    출금에서 발견했지만, 입금도 같은 구조이기 때문에 같이 수정 해 주었다.

    유니티의 json 등 파일 쓰기에 대해

    실시간으로 세이브 및 로드를 하는 경우, 파일 쓰기를 할 수 있는 경로가 극히 제한된다는 것을 알았다.

    Application.persistentDataPath을 데이터 저장 경로로 사용하는 케이스를 종종 볼 수 있다.

    나는 프로젝트 파일 근처에서 json파일을 열심히 찾아보다 보이지 않아 구체적인 경로를 검색 해 보았는데,

    C:\Users\[user name]\AppData\LocalLow\[company name]\[product name]

    위와 같은 복잡한 경로에 존재한다고 한다. 이게 어째서인고 하니..

    위 경로가 운영체제에서 앱이 사용할 수 있도록 허용한 경로라고 하여 유니티 실행 중 자유롭게 파일을 쓸 수 있는 경로인 것이다.

    그 외 아래와 같은 경로도 있는데,

    Application.dataPath
    Application.streamingAssetsPath

    각각 프로젝트 폴더 내부(Asset, StreamingAsset)를 반환하는데, 이러한 경로들은 파일을 수정하거나 작성 할 수 없다고 한다.

    3. 과제에 대해

    • 내일부터 팀 과제 수행, 과연 무슨 내용이 주어질지
    • 입문주차 및 숙련주차 주어졌던 강의 학습 및 복습

    4. 참고자료

    5. 듣고싶은 강의

    반응형
    COMMENT
     
    02
    07

    과정명 : 내일배움캠프 Unity 게임개발 3기

    전체진행도 : 31일차

    부분진행도 : Chapter4.1 - 4일차

    작성일자 : 2024.02.06(화)

    개발일지 목록 : 클릭


    1. 진행중인 과정에 대해

    내일 정오까지 개인과제를 제출해야 한다.

    시간이 얼마 없지만, 그래도 강의의 '이해'는 해야 된다고 생각하기 때문에 최대한 들으며 이해를 하고, 몇몇 포인트마다(슬슬 필요할 때마다) 자체 코드리뷰 시간을 가지기로 했다.

    이렇게 하여 강의를 모두 끝내지 못했을 경우, 저녁을 먹은 후 오후 7시에 과제에 진입한다.

    세부 시간 계획 및 실천사항은 아래에 작성.

    오늘은 시간에 쫓기는 상황이니만큼 Today I Learned 이라기보다 계획 및 실천사항에 중점을 두었다.

    2. 오늘 학습에 대해

    • 01시 ~ 03시 단기 목표, 7/13 인벤토리 강의를 마치고, 모든 스크립트에 대해 코드리뷰를 한다.
      • 02:45 7강 수강 완료, 현재 Damagable 관련 스크립트 세 개만 확인하면 일단 전체적인 구성은 파악한 것 같다.
      • DamageIndicator는 코루틴을 사용한다는 점 빼고는 어려운 점이 없다. 완료.
      • Campfire와 InteractionManager 을 확인하자.
      • private List<IDamagable> thingsToDamage = new List<IDamagable>(); IDamagable 인터페이스를 구현한 모든 객체를 포함
      • 03:05 1차 코드리뷰 완료.
    • 03시 ~ 05시 단기 목표, 8/13 아이템 장착 및 모션 강의를 마치고, 코드리뷰가 필요한지 결정한다. 분량이 많다.
      • 5시정도에 딱 맞추어 끝냈다. 흐름은 어떻게 알 것 같아서 코드리뷰는 추가로 하지 않았다.
    • 오전 5:40, 11/13강을 시작했다. 플레이어 인벤토리 이후는 난이도가 무척 할만해지고 내용도 매우 흥미로워 열심히 따라 배우는 중이다. 다시 한 강에 50분짜리로 분량이 꽤 되는 '적 생성과 로직' 파트이다. 지금까지의 흐름으로 보면 최소 두시간은 걸릴 것 같다.
    • 오전 8:00까지 취침 후, 오전 10시까지 11강 완주 목표. 달성한다면 오전 11시까지 13강 완주를 할 수 있을 것 같다.
    • 위 내용을 지키지 못하고 많이 쉼. 저녁 6:55, 12/13까지 완료하였다.
    • 짧고 효과 좋은 가성비 최강 포스트 프로세싱. Bloom 효과를 적용하였다.

    Bloom 효과를 적용한 카메라

    • 8:40 자료구조 관련 세션이 있었다.
      • 여러 상황에 맞게 Stack과 Queue, 배열과 리스트와 딕셔너리를 사용하면 좋다는 내용이었다.
      • 여러 장면이나 패널을 순차적으로 열고 닫아야 할 때는 Stack을 사용하면 좋을지도 모르고
      • 오브젝트 풀에는 Queue를 사용할 수도 있다.
      • 인벤토리 내 아이템을 표시하는 경우는 경우에 따라 다르지만 상황이 괜찮다면 딕셔너리를 사용하는 것이 계산복잡도 측면에서 좋다.
    • 마지막 13/13강인 오디오 파트는 잠시 내려두고 과제 제출 이후에 이어서 하기로 했다.

    Random 사용 시 오류(빨간 밑줄)가 나는 경우

    Random을 사용하려고 보니 에러 발생

    원인 : using System과 using UnityEngine 양 쪽에서 Random 클래스를 가지고 있기 때문에 충돌
    해결1. using System; 을 지운다.
    해결2. (채택) Random 대신 UnityEngine.Random 이라고 표기한다.

    3. 과제에 대해

    • 밤샘작업으로 아침 10시까지 개인과제 제출하기

    4. 참고자료

    5. GPT4 문답

    반응형
    COMMENT
     
    02
    05

    과정명 : 내일배움캠프 Unity 게임개발 3기

    전체진행도 : 30일차

    부분진행도 : Chapter4.1 - 3일차

    작성일자 : 2024.02.05(월)

    개발일지 목록 : 클릭


    1. 진행중인 과정에 대해

    강의지급 및 개인과제 3/5일차, 서바이벌 3D게임 강의를 학습중이고, 개인과제는 UI구성까지만 마치고 스크립트 작성을 보류중이다. 슬슬 밤샘각이 보인다. 강의가 어렵지만 굉장히 멋진 구조의 디자인을 하고 있어 보이기 때문에 확실히 학습하면 굉장히 도움이 될 것이다.

    + 오후에 핫식스 도핑하면서 버티던 도중에 눈이 번득 뜨이는 이벤트가 발생했다.

    갑자기 분위기 우수 TIL(Today I Learned)

    일단 개발일지 목록이 업데이트가 덜 되어 있어서 호다닥 작성했지만 나머지는...

    더보기
    막 3일전 질러놓은 게임글
    NSFW 프로젝트
    유익하지만 음원소스가 서브컬쳐
    가장 최근 글이 방주 관리 프로젝트
    최고 인기글 제목도 부끄러움
    도메인도 부끄러움

    이쯤 되면 그냥 당당해지기로 했다

    2. 오늘 학습에 대해

    아침 CodeSolve

    바쁘더라도 한 문제 정도는 30분정도 써서 풀어도 괜찮은 것 같다.

    다른 날과 마찬가지로 주석으로 상세 내용을 정리한다.

    전엔 하지 않았던, 솔루션을 미리 작성해두고 과정을 따라가는 방식을 해 보니 괜찮은 것 같다.

    코딩테스트 연습 > 2022 KAKAO BLIND RECRUITMENT > 신고 결과 받기

    using System;
    using System.Collections.Generic;
    
    public class Solution {
        public int[] solution(string[] id_list, string[] report, int k) {
            int[] answer = new int[id_list.Length];
    
            // 솔루션
            // Dict1 : {"{ID}":{받을 메시지 수}}
            // Dict2 : {"{ID}":{List<string> ID를 신고한사람 목록}}
            // 1. Dict1과 Dict2를 초기화
            // 2. foreach문으로 report 순회하며 Dict2를 채운다
            // 3. Dict2를 순회하며 List의 길이가 k 이상일 경우,
            //    해당 리스트를 키로 갖는 Dict1의 값을 모두 1 더한다
    
            // 1. Dict1과 Dict2를 초기화
            // (Dictionary 안의 자료형으로 List<> 그냥 써 봤는데 왜 되는거야...)
            Dictionary<string, int> dict1 = new Dictionary<string, int>();
            Dictionary<string, List<string>> dict2 = new Dictionary<string, List<string>>();
            foreach(string id in id_list){
                dict1[id] = 0;
                dict2[id] = new List<string>(){};
                // Console.WriteLine(dict2[id].Count);
            }
    
            // 2. foreach문으로 report 순회하며 Dict2를 채운다
            foreach(string msg in report){
                string[] parts = msg.Split(' ');
                string userA = parts[0];
                string userB = parts[1];
                if(!dict2[userB].Contains(userA))
                    dict2[userB].Add(userA);
            }
    
            // 3. Dict2를 순회하며 List의 길이가 k 이상일 경우,
            //    해당 리스트를 키로 갖는 Dict1의 값을 모두 1 더한다
            // 찾아보기: 사전형의 순회
            foreach(var item in dict2){
                if(item.Value.Count>=k){
                    foreach(string user in item.Value){
                        dict1[user] += 1;
                    }
                }
            }
    
            // 4. answer 배열에 dict1의 내용 옮기기
            for(int i=0;i<id_list.Length;i++){
                answer[i] = dict1[id_list[i]];
            }
    
            return answer;
        }
    }
    • Dictionary 안의 자료형으로 제네릭 (예:List<>) 을 사용 해 보았다.
      • Dictionary<string, List<string>> dict2 = new Dictionary<string, List<string>>();
    • 사전형의 순회법
      • foreach(var item in dict2){ //Item.Key나 Item.Value로 접근 }

    3. 과제에 대해

    - 주어진 강의 흡수(남은 게 많다. 큰일. 오늘은 밤샘이다. 그래도 방향성은 잡힌 것 같다.)

    - 개인과제 스크립트 부분 이어서 착수

    반응형
    COMMENT
     
    02
    02

    FileFlattener-and-Restorer 깃허브 리포지토리

    방주 파일을 다루는데, 복잡한 디렉터리 구조에 퍼져있는 모든 파일을 하나의 앨범에 모으기 위해 작성한 스크립트이다.

    • flatten_and_move.py

    역으로, 모았던 파일을 다시 원래 위치로 복원하기 위한 스크립트도 마련하였다.

    • restore_files.py

    현재 폴더의 구분자를 _문자로 설정하여 새로운 파일 이름을 정하고 한 폴더에 몰아두는 방식을 채택했는데, 원래의 파일 이름에 _ 문자가 있었다면 원래 경로로 복원하는 과정에서 큰 문제가 된다.

    flatten_and_move 사용 시 로그 파일을 남기고, 그걸 사용하여 복원하는 방식으로 바꾸어야 해결 할 수 있을 것으로 보이고 조만간 업데이트 할 예정이다.

    아래는 2024.02.02 에 작성된 README.md 의 내용이다.

    FileFlattener-and-Restorer

    이 프로젝트는 다양한 경로에 퍼져있는 파일들을 단순화하고 정리하는 파이썬 스크립트를 제공합니다. 스크립트는 파일 이름을 변경하고, 지정된 출력 디렉토리로 파일을 이동시키며, 작업 로그를 기록합니다.
    또한 원래 경로로 복원이 가능한 스크립트를 제공합니다.

    기능

    • 파일 평탄화 및 이동: 지정된 디렉토리 내의 모든 파일을 스캔하고, 파일 이름을 변경하여 지정된 출력 디렉토리로 이동시킵니다.
    • 원본 경로 복원: 변경된 파일 이름을 사용하여 원본 디렉토리 구조로 파일을 복원합니다.
    • 로그 기록: 모든 작업에 대한 로그를 Logs 디렉토리에 기록합니다.

    사용 방법

    ▷ flatten,move ▷

    ▷ restore ▷

    이 리포지토리를 클론하거나 직접 압축파일을 다운로드 받아 파일정리를 원하는 곳으로 위치시킨 후에 실행시켜 사용합니다.

    폴더 경로의 구분자() 를 언더바(_)로 치환하여 바뀌어질 파일이름으로 사용하기 때문에

    원래의 파일명에 언더바가 섞여있는 경우 오작동을 일으킬 가능성이 매우 크며, 특히 원래 경로로 복원이 어렵습니다!!!

    (현재 구현하지는 않았으나, 로그파일을 참조하는 방식으로 위 문제를 해결 할 수 있을 것으로 보입니다)

    image

    위와 같이 해당 폴더의 주소창에 cmd를 입력하여 명령 프롬프트를 실행합니다.

    파일 평탄화 및 이동

    flatten_and_move.py 스크립트를 실행하여, 현재 디렉토리 및 하위 디렉토리에 있는 모든 파일을 flatten 디렉토리로 이동시키고 이름을 변경합니다.

    python flatten_and_move.py

    원본 경로로 파일 복원

    restore_files.py 스크립트를 실행하여, flatten 디렉토리에 있는 파일을 원래의 디렉토리 구조로 복원합니다.

    python restore_files.py

    기여 방법

    풀 리퀘스트 또는 이슈 등록 환영합니다.

    반응형
    COMMENT