일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Unity
- 게임
- 델리게이트
- 확장메서드
- 리듬게임
- AR게임
- 짐벌락
- 소규모프로젝트
- callbyvalue
- C#
- 1인개발
- 인터페이스
- AR세팅
- github
- 깃허브
- ExtensionMethod
- Euler
- 리듬게임에디터
- 레이캐스트
- 병맛게임
- ar
- raycast
- 게임제작
- 게임개발
- ARProgect
- 유니티
- callbyreference
- Quaternion
- AR Foundation
- 로케트
- Today
- Total
Ssssong += Dev
[리듬게임] 리듬게임 에디터 제작 - 3 본문
라인렌더러 계산해서 롱노트도 구현하였다.
라인을 그리려 삼각함수에.... 길이, 각도 구하는 거 좀 머리가 복잡했는데
차근차근 해 보았다.
기본 원형 그리기 함수는 이렇다. 구글링해서 찾아서 좀 변형했는데 출처가 기억 안나서.... 찾으면 추가해야지.
public void DrawCircle(int steps, float radius, int startPoint, int endPoint)
{
circleRenderder.positionCount = Mathf.Abs(endPoint - startPoint);
for (int currentStep = 0; currentStep < circleRenderder.positionCount; currentStep++)
{
float circumferenceProgress = (float)(currentStep + startPoint + steps/2) / steps;
float currentRadian = circumferenceProgress * 2 * Mathf.PI; //시작 지점 + 길이
float xScaled = Mathf.Cos(currentRadian);
float yScaled = Mathf.Sin(currentRadian);
float x = xScaled * radius;
float y = yScaled * radius;
Vector3 currentPosition = new Vector3(x, y, 0);
circleRenderder.SetPosition(currentStep, currentPosition);
}
}
노트에는 bpm이 있고 그에 따라서 일정 시간 마다 노트가 생성된다.
문제는 롱노트를 그릴 때에 라인의 길이를 구해야 하는데, 그러려면 노트가 1단계마다 얼마나 회전하는지를 구해야 했다.
어떻게 하지? 하고 당황스러웠는데 차근차근 적어서 생각해보니 생각보다 쉬운 문제였다.
디자이너의 머리를 개발자의 머리로 바꾸기 쉽지 않다...
*문제 : 한 노트는 다음 노트가 나올 때 까지 얼마나 회전하는가?
1. 노트는 60d/bpm 초 마다 생성된다.
2. 노트가 회전하는 거리는 60d/bpm * 속력이다.
3. 노트는 프레임 당 speed * Time.deltaTime 만큼 회전한다.
4. 초당 프레임 갯수는 1.0f/Time.deltaTime이다.
5. 따라서 회전속력은 초당 speed 이다.
결론 : 노트는 1단계마다 60d/bpm * speed 만큼 회전한다.
에디터에서 찍은 노트를 게임으로 불러오는 것 까지 제작하였다.
에디터에서 노트를 찍고 save를 누르면 이렇게 텍스트 파일이 생성되고
게임파일에서 이를 불러와서 노트를 찍는다.
+ ARProject 2주간 진행 후 데이터 저장 부분을 Json 방식으로 변경하였다.
SaveLoad.cs
private void JsonSave(string fileName)
{
SaveData saveData = new SaveData();
WriteLineInfo(saveData.leftDial, noteLines[0]);
WriteLineInfo(saveData.leftNormal, noteLines[1]);
WriteLineInfo(saveData.rightNormal, noteLines[2]);
WriteLineInfo(saveData.rightDial, noteLines[3]);
path = Path.Combine(Application.dataPath, fileName + ".json");
string json = JsonUtility.ToJson(saveData, true);
File.WriteAllText(path, json);
}
void WriteLineInfo(List<string> noteLineList, GridSetting grid)
{
for(int i =0;i<grid.gridLines.Count;i++)
{
if(grid.gridLines[i].GetComponent<LongNote>().note != null)
{
string lineText = i.ToString();
if(grid.gridLines[i].GetComponent<LongNote>().guideLine != null)
{
lineText += ";startLine";
noteLineList.Add(lineText);
LongNote endLine = grid.gridLines[i].GetComponent<LongNote>().guideLine.GetComponent<LineEdit>().endPoint;
lineText = endLine.lineNum.ToString();
lineText += ";endLine";
noteLineList.Add(lineText);
i = endLine.lineNum + 1;
}
else
{
noteLineList.Add(lineText);
}
}
}
}
NoteManager.cs
private void LoadJson(string fileName)
{
path = Path.Combine(Application.dataPath, fileName + ".json");
SaveData saveData = new SaveData();
string loadJson = File.ReadAllText(path);
saveData = JsonUtility.FromJson<SaveData>(loadJson);
ReadFile(saveData.leftDial, noteCreators[0]);
ReadFile(saveData.leftNormal, noteCreators[1]);
ReadFile(saveData.rightNormal, noteCreators[2]);
ReadFile(saveData.rightDial, noteCreators[3]);
}
private void ReadFile(List<string> savedNote, NoteCreator noteCreator)
{
if (File.Exists(path))
{
foreach(string note in savedNote)
{
noteCreator.noteList.Add(note);
}
}
}
로드 기능 추가할 때 파일을 선택해서 가져올 수 있도록
fileName을 string 변수로 빼 두었다. 지금은 test로 임시로 저장 및 불러와진다!
'개발 > 리듬게임에디터' 카테고리의 다른 글
[리듬게임] 리듬게임 에디터 제작 - 4 (0) | 2022.06.17 |
---|---|
[리듬게임] 리듬게임 에디터 제작 - 2 (0) | 2022.05.18 |
[리듬게임] 리듬게임 에디터 제작 (0) | 2022.05.16 |
[리듬게임] 동작 테스트 (0) | 2022.05.14 |
[리듬게임] Bezier 곡선 , 코루틴 (0) | 2022.04.10 |