프로그래머입니다.

Posted
Filed under 개발/BMS player
2017. 12. 03 수정
롱노트 관련 기능이 수정된 0.98.1을 올립니다.
파일 링크
릴리즈 노트

근황글 위주로 올렸던 그 BMS구동기입니다. 현재 컨셉으로는 최종버전이라고 할 수 있겠네요.

ZeroBMS Player 0.98.1
Codename Babysoul
BGM : Zero Entropy - by TETZn

--- 소개.
ZeroBMS는 유니티와 C# 기반의 BMS 구동기입니다.
BMS폴더안에 있는 BMS, BME, BML파일을 찾아서 재생합니다.
BMS폴더안에 폴더가 여러단계 있어도 최종 단계 기준으로만 정렬합니다.
샘플 및 테스트용 패턴이 하나 있습니다.


--- 각 화면별 조작
종료는 Alt+F4로도 할 수 있습니다.
-메뉴 화면-
각 메뉴에 설명이 있습니다.
옵션은 선곡화면에서도 사용 할 수 있습니다.

-선곡 화면-
선곡화면에서 마우스 휠을 움직이거나 곡 제목을 클릭하면 선택됩니다. (아직 키보드는 지원하지 않습니다.)
Tap키를 누르면 패턴(난이도)을 바꿀 수 있습니다.
Enter키를 누르면 플레이 화면으로 넘어갑니다.
A키를 누르면 오토플레이를 켜고 끌 수 있습니다.
B키를 누르면 배경 동영상을 켜고 끌 수 있습니다.
F키를 누르면 초당 프레임 수를 바꿀 수 있습니다. 기본 60.
R키를 누르면 이미지파일로 된 BGA의 해상도를 바꿀 수 있습니다. 로딩의 거의 전체가 이 작업에 쓰이므로 줄이면 눈에 띄게 빨라집니다. 기본 864(1:1)
H키를 누르면 배속을 0.5 단위로 조절할 수 있습니다.
G키를 누르면 EX EZ / EZ / NM / HD / EX HD 순서로 게이지를 고를 수 있습니다.
S키를 누르면 HIDDEN / SUDDEN / MIDDLE 순서로 화면을 가릴 수 있습니다

-플레이 화면-
플레이키는
1P는 LShift SDF space JKL
2P는 O0P-[=] RShift (키보드 오른쪽 위 O 부터)
3,4번 키를 누르면 배속이 0.1 단위로 조절됩니다.
`키를 누르면 하단의 사운드 스펙트럼이 노오력게이지 기록과 상호 전환합니다.
Esc를 누르면 선곡 화면으로 돌아갑니다.
곡이 끝난뒤 5초뒤에 결과 화면이 나오고 여기서 Esc를 누르면 돌아옵니다.
(배경음악이 노트가 끝난 시간 + 6초 보다 길 경우 짤립니다.)
게이지 증감은 있으나 결과가 저장되진 않습니다.


--- 0.98 이후로 달라진 점.
롱노트 틱콤보 지원
DP 노트 사라지는 문제 수정 (판정에 버그가 아직 조금 있습니다.)
폭탄노트 보이도록 수정
선곡창에서 60프레임으로 고정되던 버그 수정
백그라운드 오브젝트가 UI를 뚫고 나오는 문제 수정.
배경음악 데이터 경로 수정
프로그램의 배경음악 작곡가 정보 표시(이게 빠졌더군요 ...)


--- preRelease에 비해 달라진 점.
롱노트 삭제.
RANDOM 및 IF등 지원
잌스퍼트 모드 추가
하단 미터 중 노오력 인디케이터 추가
EX EZ / EZ / NM / HD / EX HD 게이지 추가
메인 메뉴 추가
결과 화면 요소 추가
옵션 창 추가
선곡화면 곡 제목 출력
디자인 부분 수정
일반 플레이시 POOR 판정이 안되거나 충돌하는 버그 수정
기타 버그 수정 및 설계 변경


--- 차기 버전 계획
목록 출력방식을 BMS 개별 및 폴더별 출력 선택가능


--- 기획 또는 아이디어들
bmson 지원
온라인 랭킹
연습 모드
MISS 화면 추가(특허문제로 지원 불가능)
폴더 제목 정리
지능적 난이도 판정
멀티스레딩(BGA로딩 및 판정)


--- 메모
BMS내의 파일 확장자와 실제 확장자가 다를 경우 검색 알고리즘에 문제가 있어 예외처리 없이 강제검색.
파일이 없을 경우에는 임시처리.
투명노트 파싱 지원여부 불투명.


2017. 10. 29. 10: PM
Twitter @Hot_Limit, BMS.BeForU.net
2017/12/03 01:47 2017/12/03 01:47
Posted
Filed under 개발/BMS player

개요.
유니티엔진, BASS.net 라이브러리, BMS 기반의 음악게임.
배속, 변속, 일시정지등 일반적인 건반류 음악게임에 있는것들은 얼추 구현. 롱노트의 판정은 아직.

포맷.
이쪽 계열에서 가장 많이 쓰이는 BMS(Be-Music Script)포맷을 사용했다. 그 중 BME BML 등의 바리에이션과 롱노트 및 7키 등 일부 필수적으로 필요하다 판단되는 확장 명령어를 우선적으로 지원했다. 곡이 멈추거나 속도가 바뀌거나 폭탄노트 등의 부분도 처리된 상태. 그때 그때 다른 노트를 내려보내는 #IF 와 RANDOM 등은 아직 미지원.

유니티엔진.
유니티엔진에서는 NGUI를 이용하여 메뉴와 효과등을 구현했다. 화면 표시와 노트가 떨어지는 것은 배경효과 등을 위해서 3D로 구현했는데, Vector3의 좌표 중 남는 z값에 노트의 타이밍을 넣어서 메모리를 조금이라도 아껴보려고 했다.

사운드 라이브러리. (BASS.net + BASS)
유니티 내부가 아닌 런타임 상에서 실시간으로, 다양한 포맷의 음악파일을 읽기 위해서 별도의 사운드 라이브러리(BASS)를 사용 했다. 또한 화면 하단의 스펙트럼을 구현하기 위해 해당 사운드 라이브러리의 WASAPI(Windows Audio Session API)를 이용하여 윈도우의 사운드를 받아옴. 향후 이 API를 이용하여 사운드카드와 직접, 단독연결하여 음질 향상도 가능하다.

영상 처리.
동영상 재생은 총 두가지로 첫 번째 방식은 과거 BMS 극 초기에 제안된 방식으로, 정해진 타이밍에 비트맵 이미지를 계속 바꿔주면서 기본 2장, 확장 포함 3장의 레이어 이미지 BGA로 처리된다. 단, 검은색(#000000)컬러와 없는 파일(예외처리 별도로 해야함)은 투명색 처리, 정식 규격은 256x256의 정사각형 비트맵. 유니티 엔진상에서 바로 불러오면 이미지도 깔끔하지 않을 뿐 더러 포맷도 BMP,JPG,PNG 등등 다양하게 쓰고있고, 검은색도 투명하게 바로 바꿀 수 없다. 또한 90년대 말 당시의 용량 절약 목적으로 가로만 256으로 맞추고 세로는 이미지가 표시되는 높이까지만(256이 안되는) 표시하도록 하는 등 명확하게 만들어지지 않은 파일이 많다. 때문에 C#에 있는 이미지 프로세싱을 이용하여 로드 -> 사이즈를 정사각형에 맞춤 -> 검은색을 투명화 -> 이미지 확대 및 내장 알고리즘으로 화질 개선 -> 캐시폴더에 저장 하는 절차를 거치게 된다... 두 번째 실행부터는 캐시검사로 시간 단축. 멀티스레딩을 적용하면 더 단축되겠지.
두번째 방식은 일반 동영상 방식인데, 시작시간만 정해져있고 이후로 별 작업이 없다. 에셋을 이용했다.

잡설.
4월에 회사 취직 이후로는 야근이다 뭐다 하기도 했고 지치기도 했어서 거의 잡지 않고 있던 프로젝트였지만 마음을 다 잡고 다시 개발 재개. 그렇게 어려워했던 롱노트도 의외로 쉽게 넘어가고 있고, 판정과 자잘한 것들만 잡으면 첫번째 목표였던 BM98 수준까지는 거의 도달. 영상에서는 플레이 화면 밖에 없는데, 현재 최종적으로 9월중에 한번 주위사람들과 소박한 베타를 하고 10월 추석기간동안 UI를 좀 더 만들고 몇가지 미완 혹은 BM98에는 없지만 나중에 추가할 기능들은 정리를 하는 작업을 해서 첫 버전을 내놓을 생각이다.
취미생활로 달려왔던 프로젝트이지만 이제 첫단추의 끝이 보이기 시작해서 마감이구나 싶다. 사실 더 하고 싶고 될 것도 같지만 기존처럼 작업한다해도 올해 안에는 릴리즈는 하지 않을 것 같다. 내년엔 이걸 하고 있을지 한다면 얼마나 할지? 궁금하다. 현실이 허락한다면 계속 진행해서 LR2수준까지 끌어올리고 세대교체를 하는 나름 큰? 목표를 가지고 있었다. 조금 더 형편이 좋았다면 더 빨랐겠지만 아쉽게도 그정도는 아니라 아주 천천히 가는걸로. 영상은 차후에 메뉴화면과 다 합쳐서 다시 업로드를 해야 할 것 같다.
2017/09/14 00:03 2017/09/14 00:03
Posted
Filed under 개발/토막글
웹에서 Dictionary에 대해서 검색하면 거의 대부분 foreach와 KeyValuePair를 이용한 루프가 대부분이다.그러나 유니티에서 foreach를 쓰는건 전혀 권장되지 않기때문에 '꼭 이것뿐인가?' 하는 고민을 많이 했었다. 겨우 찾았는데, 역시나 C#은 친절한 언어니까 준비가 되어있다!

public static Dictionary<string, string> dicSample
    = new Dictionary<string, string>();        
var enumerator = dicSample.GetEnumerator();
while (enumerator.MoveNext())
    {
          string key = enumerator.Current.Key; // 키는 이렇게
          string value = enumerator.Current.Value; // 값은 이렇게
    }
    


이렇게 쓰면 foreach는 피할 수 있다. 또한 여기서는 주제와는 맞지 않아 끝에 메모만 하지만 Dictionary를 생성할 때 생성자 안에 주는 값을 빈칸으로 두지말고 IComparer 를 만들어서 넣어주면 향후 Dictionary간 비교를 할 때도 garbage가 생기지 않으므로 비교 할 일이 있다면 꼭 그렇게 하자. 그리고 GetEnumerator()가 꼭 Dictionary에만 한정된 것도 아니니 이곳저곳 찾아보자.
2017/08/27 13:41 2017/08/27 13:41
Posted
Filed under 개발/토막글
빌드시간이 되게 오래 걸릴때 값 하나 바꿔놓고 빌드하고 하나 바꾸고 빌드하고 하는게 너무 비효율적인 것 같아서 이렇게 해봄.

유니티 기준.

string path = Application.persistentDataPath + "/test.txt"; // 경로 입력.   
string text = System.IO.File.ReadAllText(path);
if (text.Equals("0"))
{
    //Plan A
}
else (text.Equals("1"))
{
    //Plan B
}
  


대충 이런 식으로 분기를 처리하면 test.txt 파일의 내용만을 바꾸는 것으로 한 번의 빌드로 여러가지 안을 처리할 수 있다. 이걸로 줄인 시간이 한 몇 일 될 것 같다. 한 파일에 옵션을 여러개 주려면 ReadAllText 대신에 ReadAllLines 를 이용하여 string 배열로 받아서 처리해도 될 것이다.

단, 간편히 정하는 방식이므로 이걸 임시적 이상으로 사용하는건 매우 지저분하기에 추천하지 않음.
2017/08/26 23:07 2017/08/26 23:07
Posted
Filed under 개발/토막글
UnityEditor.EditorBuildSettingsScene[] scenes 
     = UnityEditor.EditorBuildSettings.scenes;
// 윗부분은 EBSScene 전체가 하나이고 아래는 EBS.scenes 임. 길어서 헷갈릴 수 있음.

string scenePath = UnityEngine.SceneManagement.SceneManager.GetActiveScene().path;
for (int i = 0; i < scenes.Length; i++)
{
    if (scenes[i].path.Contains(scenePath))
    {
        Debug.Log(scenes[i].path);
        Debug.Log(scenePath);

        _isBuildInScene = true;
    }
}

          

2017/08/26 22:51 2017/08/26 22:51
Posted
Filed under 컴퓨터/토막글
시작메뉴 - 실행
혹은 시작버튼 옆에 있는 검색창에다가 로컬 정책 편집 (혹은 gpedit.msc) 검색

사용자 구성 - 관리템플릿 - 바탕화면 - Aero 흔들기 창 최소화 제스쳐 마우스 제스처 사용 안 함 더블클릭.
"사용"으로 바꾸고 확인 또는 적용 해서 닫고 나옴.
"사용 안 함" 이나 "구성되지 않음" 이 아니라 사용 으로 해야 Aero Shake가 꺼진다.
사용 안 함을 사용한다 라고 해야 하는데 헷갈릴 지도 모르겠다.
2017/08/12 19:40 2017/08/12 19:40
Posted
Filed under 개발/토막글
managedheap used, reservedUnused
아마 후자가 GC 일어나면 삭제가 되는 부분이다.

실제로 힙메모리를 체크하려면, 현재까지의 힙을 체크하고, 그 다음에 특정 함수를 실행하고나서 다시 힙을 체크하고 하는 식으로 하면 얼마나 걸리는지 체크할 수 있겠다.
2017/08/05 21:48 2017/08/05 21:48
Posted
Filed under 개발/토막글
https://docs.unity3d.com/Manual/CommandLineArguments.html

공식 매뉴얼 페이지지만, 가끔씩 검색어가 기억이 안나곤 해서 메모해둔다.
주로 폰게임이 타겟이니까
-buildTarget android
-force gles30
같은 옵션을 자주 쓰는 편이다.
2017/07/30 14:50 2017/07/30 14:50
Posted
Filed under 컴퓨터/토막글
cURL 에러
업데이트 및 다운로드 (자동설치) 오류 <- 권한 문제
아바타 설정 -> 그라바타 쓰라는데, 그건 서비스형 이야기였고 플러그인으로 해결해야 했다.
위의 다운로드 설정후에도 "임시 폴더를 찾을 수 없습니다." 라고 나왔던 것. <- 권한문제인데, 윈도우 시스템 임시폴더보단 외부에 별도로 폴더를 만들었다.
한글로 업로드가 안되던것 <- 플러그인 깔았다.

주말에 좀 디테일하게 나눠서 정리해야지.
2017/06/29 00:48 2017/06/29 00:48
Posted
Filed under 컴퓨터/토막글
WP HTTP Error: cURL error 35: error:04091068:rsa routines:INT_RSA_VERIFY:bad signature
라는 에러가 계속 났었다.
설치환경은
윈도우 서버 2016 (IIS 10), php 5.6, mariaDB 10.1  전부 x64.

아무리 찾아도 답이 안나오고 설정도 뭐 하라는거 이것저것 다 넣어봤는데도 허사.
혹시나... 하고 PHP를 5.5로 다운그레이드 하니까 아주 멀쩡하게 잘 돌아간다.
워드프레스 이벤트에는 RSS 오류로 같은 오류가 계속 있었는데, 워드프레스를 영어로 설정할 때는 제대로 나왔다. 아마 캐시가 된 듯. 어차피 세팅을 하나도 못 했으니 전부 날리고 재설치 하니 제대로 뜬다. 정말 주말 다 날리고 짬짬히 계속 찾아봤는데 이런 호환성 문제였다니.. 게다가 php 5.6 이하 쓰는 사람들이 훨씬 많으니 별 말이 없었지. 에휴.
텍스트큐브가 훨씬 좋은데, 뭐든지 유료에다 한국에 맞는 세팅도 따로 해야하는 워드프레스에 비하면...

요약.
wordpress 에는 php 5.5를 쓰자.
2017/06/26 23:43 2017/06/26 23:43