
copilot이 debug 소리 듣자마자 자동완성으로 고봉밥을 만들어줬다

부검 시작

일시정지하면서 보다보니까 판정용 플레이어가 팍 하고 튀는 프레임이 있었다.
이동 로직 때문인 거 맞는듯?

그냥 죽어서 되돌아가는 프레임을 찍었던 걸수도 있구나
isInBox가 True로 돼있는거 보니까 맞는듯
일시정지 계속 때리면서 보는데, 콜라이더에 초근접할때까지만 해도 아무일도 없다가
콜라이더에 닿는 순간 죽어버림.

죽었을 때 hitIndex를 찍어보니 둘 다 -1.
그 말은 굉장히 이상하다.
콜라이더에 닿지도 않았는데 게임 오버가 되어버렸다는 뜻.
isInBox를 누군가가 true로 바꿔버렸다는 건데...
// 이번에 쳐야할 블럭에 진입
if (hit1Index == missionBlockIndex || hit2Index == missionBlockIndex)
{
if (!isInBox)
{
Debug.Log("InBox");
if (hit1Index == missionBlockIndex) missionBlockCollider = hit1.collider;
else missionBlockCollider = hit2.collider;
missionBlockScript = missionBlockCollider.GetComponentInParent<NoteBlock>();
missionKeyType = missionBlockScript.requiredKeys;
isInBox = true;
keyInput = 0;
EndBlockCheck();
}
}

누군가가 InBox를 두번이나 true로 만들어버린다.

두번째 InBox는 되돌아가면서 호출된 InBox로 보임.
이동 로직 바꾸기 전엔 멀쩡하게 작동하던 실패 판단 로직이 말썽을 일으킨다는게 뭔가 이상해서
if (AudioSettings.dspTime - lastBlockStartTime < 0) Debug.Log("음악이 되감기 되었습니다.");
이걸 넣어봤는데, 안 잡힘. 덜덜거리면서 간다고 하더라도 적어도 뒤로 가는 일은 없다는 뜻.
그런데 InBox 때는 hitIndex가 1인게 잡혔으면서
GameOver 프레임에는 hitIndex가 둘 다 -1이라는게 뭔가 이상하다.

float newX = (float)(nowBlockPos.x + (nextBlockPos.x - nowBlockPos.x) * delta_dspTime / (missionBlockScript.noteDuration * (60f / bpm)));
float newY = (float)(nowBlockPos.y + (nextBlockPos.y - nowBlockPos.y) * delta_dspTime / (missionBlockScript.noteDuration * (60f / bpm)));
알았다.
완전히 눈뜬 장님이었구나.
콜라이더에 닿으면 missionBlockScript가 업데이트되잖음?
근데 그걸 위치에 써버리면 콜라이더에 닿자마자 계산이 망가져버리잖음?
nowBlock 하기로 했던 건 어따 팔아먹었던 거임?
private void player_move()
{
// nowBlockPos와 nextBlockPos를 포함하는 1차 함수를 만들어서, delta_dspTime에 따른 플레이어 위치를 계산
float newX = (float)(nowBlockPos.x + (nextBlockPos.x - nowBlockPos.x) * delta_dspTime / (nowNoteDuration * (60f / bpm)));
float newY = (float)(nowBlockPos.y + (nextBlockPos.y - nowBlockPos.y) * delta_dspTime / (nowNoteDuration * (60f / bpm)));
transform.position = new Vector3(newX, newY, transform.position.z);
}
고쳤다.
void ChangeBlock()
{
GameObject SelectedBlock = ObjectSelector.GetComponent<ObjectSelector>().selectedObject;
if (SelectedBlock == null)
{
Debug.Log("No selected block. Change failed.");
return;
}
int targetIndex = SelectedBlock.GetComponent<NoteBlock>().noteBlockIndex;
// InstantiateBlockAndStoreInformation(); // 새 블럭 생성
// DuplicateBlockData(SelectedBlock); // 정보 복사
UpdateBlockDataInList(targetIndex); // 리스트 정보 갱신
// ObjectSelector.GetComponent<ObjectSelector>().selectedObject = NewBlock;
// 선택된 블럭과 이후 블럭 모두 삭제 후 새로 생성
WipeBlocksFromTheBlock(SelectedBlock);
spawnPosition += GetDisplacement(NoteNameDropdown.options[NoteNameDropdown.value].text, NoteDirectionDropdown.options[NoteDirectionDropdown.value].text);
// RegenerateBlocksFromTheIndex(NewBlock.GetComponent<NoteBlock>().noteBlockIndex);
RegenerateBlocksFromTheIndex(targetIndex);
}
의문사 디버깅하면서 실험하다가 편집에서 버그나길래 고침.
주석 친 부분들이 assignReference 등 문제를 일으켰다.
필요없는 부분들 날리고 리스트 정보 갱신하고 새로 만들어내는 것만 했더니 고쳐짐.

이제 의문사는 안하는데, 아크로바틱을 하시기 시작하신다.
// 경로의 계산 기준점을 노트 길이만큼 이동시킨다
if (missionBlockScript != null)
{
double noteDuration = missionBlockScript.noteDuration * (60f / bpm);
lastBlockStartTime += noteDuration;
nowNoteDuration = (float)noteDuration;
}
이거 아니면
private void player_move()
{
// nowBlockPos와 nextBlockPos를 포함하는 1차 함수를 만들어서, delta_dspTime에 따른 플레이어 위치를 계산
float newX = (float)(nowBlockPos.x + (nextBlockPos.x - nowBlockPos.x) * delta_dspTime / (nowNoteDuration * (60f / bpm)));
float newY = (float)(nowBlockPos.y + (nextBlockPos.y - nowBlockPos.y) * delta_dspTime / (nowNoteDuration * (60f / bpm)));
transform.position = new Vector3(newX, newY, transform.position.z);
}
이거 문제일텐데