델리케이트는 메서드의 실행을 동적으로 결정할 때 사용할 수 있다.
여러 메서드를 등록해놓고 묶어서 사용할 수 있다. 매개 변수는 한 번만 넣으며, 입력값을 모두 동일하게 사용한다. 반환값은 마지막 메서드의 반환값을 사용한다.
delegate가 public이어도 담는 메서드들은 public이어야 다른 클래스에서도 사용 가능하다.
함수 포인터처럼 기능하므로 매개변수에 넣어서 여긴 네가 필요한 기능을 넣으라는 식으로, 이케아 느낌의 함수를 만들 때 사용할 수 있다.
대표적인 예시로 콜백 함수를 만들 때 사용한다. 네가 할 일이 다 끝나면 어떤 메서드를 호출해달라고 하는게 콜백이다. 여기서 '어떤 메서드'가 상황마다 다를 때, 델리케이트를 유용하게 사용할 수 있다. 매개변수에 델리케이트를 놓고 호출하면 된다.
이벤트라는게 따로 있는게 아니라 그냥 자료형으로 델리케이트 예시만 주고, 사용하는 건 사실상 델리케이트를 어떻게 쓰는지에 관한 것. 다만 중요한 차이점이 있긴 하다. 외부에서 이벤트를 직접 호출하진 못하고 구독과 해지만 가능하다. 내부에서만 해당 이벤트에 대한 invoke를 사용하여 호출할 수 있다. 외부에서 사용하려면 invoke가 담겨있는 메서드를 통해 간접적으로 호출해야 한다. 직접 호출이 불가능하기 때문에 이벤트에 등록힌 메서드들을 빠뜨리고 호출할 염려가 없다. 즉, 캡슐화의 이점을 지닌다.
델리케이트가 참조하는 객체와 메서드는 가비지 콜렉터의 영향을 받는다. 메모리 누수를 방지하기 위해 사용이 끝났디면 반드시 -=로 참조를 해지해야 한다. 특히 단기 생존 객체가 장기 생존 객체를 참조하는걸 주의.
ArgumentException: GetComponent requires that the requested component 'NoteBlockData' derives from MonoBehaviour or Component or is an interface.
자료형 갈아엎은거 반영을 안 해놔서 그랬던거
별거 아니었다
Judge를 나누는게 아니라
Raycast를 쏜 후에 중심 좌표 가져와서 그 사이 거리 계산하고 그거 기반으로 판정하면
굳이 판정 콜라이더 여러 개 나눌 필요 없다
/// <summary>
/// 노트 블럭 중심과의 거리를 계산하여 판정
/// </summary>
void Judge(RaycastHit hit)
{
float distance = Vector2.Distance(hit.collider.bounds.center, hit.point);
Debug.Log("Distance : " + distance);
switch (distance)
{
case float d when d < 0.02f:
Debug.Log("Perfect");
break;
case float d when d < 0.06f:
Debug.Log("Nice");
break;
case float d when d < 0.1f:
Debug.Log("Good");
break;
default:
Debug.Log("Bad");
break;
}
}
raycast 맞으면 이거 호출
나중에 판정 시각화도 구현하면 여기에서 호출

모든 튜토리얼이 내 씬에서 먹히지 않는다.
셰이더 그래프도 안되고 라이트도 안되고 아무것도 안됨. 빛이 안 남.
해결하려고 이것저것 찾아보다가, 일단 하얗고 투명한 스프라이트를 블럭 위에 씌우는 식으로 땜빵해놓기로 함. (그냥 취소. 일단 넣지 말기)
마지막 폴리싱 단계 때 진짜 빛나게 해보기. (빛 안 넣고 그냥 사라지게 해도?)
그리고 아트 좀 어떻게 깔끔하게 다듬어야 할듯.
색이라도 넣어볼까 하고 넣어본게 저꼴.
아무리 습작이라 해도, 해보고 싶지도 않게 만들만한 아트는 지양해야 하지 않을까...

mini metro를 레퍼런스 삼기로

톤만 낮췄는데 나쁘지 않아진듯. ㅈ같은 보노보노 색깔 치우고 배경은 하얀색으로만 하자.
using UnityEngine;
using UnityEditor;
public class SpriteColorChanger : EditorWindow
{
private Color targetColor = Color.white; // 변경할 색상
private GameObject parentObject; // 부모 오브젝트
[MenuItem("Tools/Sprite Color Changer")]
public static void ShowWindow()
{
GetWindow<SpriteColorChanger>("Sprite Color Changer");
}
private void OnGUI()
{
GUILayout.Label("Sprite Color Changer", EditorStyles.boldLabel);
// 부모 오브젝트 선택
parentObject = (GameObject)EditorGUILayout.ObjectField("Parent Object", parentObject, typeof(GameObject), true);
// 색상 선택
targetColor = EditorGUILayout.ColorField("Target Color", targetColor);
if (GUILayout.Button("Change Colors"))
{
ChangeSpriteColors();
}
}
private void ChangeSpriteColors()
{
if (parentObject == null)
{
Debug.LogError("Parent Object is not set!");
return;
}
// 모든 하위 SpriteRenderer 찾기
SpriteRenderer[] spriteRenderers = parentObject.GetComponentsInChildren<SpriteRenderer>();
if (spriteRenderers.Length == 0)
{
Debug.LogWarning("No SpriteRenderers found under the selected object.");
return;
}
int changedCount = 0; // 변경된 SpriteRenderer 개수
foreach (SpriteRenderer sr in spriteRenderers)
{
// 색상이 검정색인지 확인
if (sr.color == Color.black)
{
Undo.RecordObject(sr, "Change Sprite Color"); // Undo 기록
sr.color = targetColor; // 색상 변경
EditorUtility.SetDirty(sr); // 변경 사항 저장
changedCount++;
}
}
Debug.Log($"Changed color of {changedCount} SpriteRenderer(s) from black to {targetColor}.");
}
}

gpt 신의 가호로 순식간에 블럭들 색깔 변경 완료.
훨씬 나아졌다.
스테이지 불러올 땐 게임 매니저에 등록된 이름에 해당하는 .etude 파일에 있는 정보를 불러옴.
첫 음표대로 방향키 누르면 음악 시작되며 게임 시작.
각 노트를 지날 때 방향키를 한 번 누를 수 있음.
한 블럭에 여러 방향이 있어 헷갈릴 수 있는데, 현재 눌러야 하는 블럭이 아니면 구분감 주기
노트를 지나지 않을 때 누르면 게임 오버. 아무 키나 누르면 처음으로.
틀린 방향키를 눌렀다면 게임 오버.
맞는 방향키를 눌렀다면 음표가 가볍게 아래로 내려갔다 옴. (나중에 구현)
(누르는 효과를 내기 위해 평소엔 그림자 오브젝트 있다가 눌리면 그림자 오브젝트 잠시 비활성화?(성능에 지장 간다면 다른 방법 고려)(애초에 들이는 시간 대비 효용 크지 않을듯))
방향키를 누르지 못하고 넘어갔다면 게임 오버. 이를 위해 상시 raycast를 쏘며 순서에 맞는 블럭을 지나쳤는지 안 지나쳤는지 판정. (콜라이더 enter 이벤트를 활용하는게 성능 좋을지?) hit한 collider를 가진 오브젝트의 부모에서 순서 정보를 얻어낸다.
중앙과의 거리를 계산한 뒤 해당 방향대로 플레이어 이동 방향 변경 및 위치 변경
예를 들어 플레이어가 오른쪽으로 가고 있는데 위를 가리키는 블록의 중앙과의 거리가 1 남아있었다면,
중앙 아래 1만큼 떨어진 곳으로 위치 변경.
최종 목적지에 도착하면 끝. 트로피 모양 아이콘, 점수, 메뉴나 다음 스테이지 아이콘? (네모 창 안에 들어있으면 안됨)
튜토리얼 스테이지를 따로 두기. 튜토리얼 스테이지와 곡 3개 정도까지 만들고 사람들 반응 봐서 더 만들지 말지.
곡 고르는 메뉴는 악보 느낌이면 좋겠음.
맵 에디터와 게임 매니저가 맵 로딩이라는 로직을 공유하기 때문에, 맵 로더를 새로 오브젝트로 빼내서 스크립트를 달아줄 것.
그리고 나서 맵 에디터와 게임 매니저에 각각 맵 로더를 자식으로 붙인 뒤 레퍼런스로 달아주면 맵 로더의 메서드 사용 가능.

비상비상 멀쩡히 잘 돌아가던거 쪼개려니까 어지럽다
내일 해야할듯