obstacleSpawner.cs 가 적용된 obstacleSpawner 오브젝트입니다.
Obstacle 항목에는 electricObstacle 오브젝트가 들어있습니다.
electricObstacle 오브젝트입니다. 안에는 Move.cs 스크립트가 적용되어있습니다.
Move.cs 스크립트 입니다.
public void Update()
{
if(spedUpTimer > maxSpedUpTime)
{
spedUpTimer = 0;
speed += 100;
}
spedUpTimer += Time.deltaTime;
transform.position += Vector3.down * speed * Time.deltaTime;
}
라는 코드를 작성했고, 제 예상대로라면 10초 단위로 spedUpTimer가 0이되면서 speed 는 100씩 올라 10 -> 110 -> 210 이 되었어야합니다.
obstacleSpawner.cs 스크립트입니다. GameObject obstacle 항목에는 electricObstacle이 있습니다.
왜 안될까 싶어 전부 public void Update로 바꿨으나 변함이 없었습니다.
왜 장애물 오브젝트의 속도가 빨라지지 않는지에 대해 도움을 구하고자 글 올립니다.
electricObstacle 의 move 스크립트 안쪽 speed 를 로그로 봐도 10으로 고정되어있나요? 아니면 speed 가 증가하는데 실제 오브젝트의 속도가 안올라가는건가요?
Debug.Log("현재 속도는" + speed + "현재 spedUpTimer는" + spedUpTimer); 로 하니 spedUpTimer 부분이 뒤죽박죽으로 나옵니다. 이게 1초단위로 1.00씩 올라가는 걸로 알고 있는데 3초가 되기도 전에 3.3398 이런식으로 나오네요. speed는 10 으로 고정이 되어있습니다. 그런데 왜 이런건지를 모르겠네요. 장애물 생성 타이머와 변수 이름만 다르고 똑같이 했는데
디버그로그부터 찍어보고 어디가 어떻게 안되는지 확인부터 ㄱㄱ
Debug.Log("현재 속도는" + speed + "현재 spedUpTimer는" + spedUpTimer); 로 하니 spedUpTimer 부분이 뒤죽박죽으로 나옵니다. 이게 1초단위로 1.00씩 올라가는 걸로 알고 있는데 3초가 되기도 전에 3.3398 이런식으로 나오네요. speed는 10 으로 고정이 되어있습니다. 장애물 타이머인 maxTimer 가 2로 고정되어있어서 그런가 2초단위로 spedUpTimer 값이 0으로 되돌아가기는 하는데, 문제는 얘가 올라가는 수치도 초단위로 안 올라가고 1초만에 3.nnnn 5.nnn 이런식으로 이상하게 올라가네요
spedUpTimer += Time.deltaTime; Debug.Log(spedUpTimer); 왜 그런지는 저렇게 찍어서 관찰해보면 될꺼고... 업데이트는 프레임당 돌아가는놈이고 델타타임은 유튜브가면 아마 설명해주는영상있을텐데 그거봐 1초단위로 뭔가 하고싶다면 코루틴을 쓰는게 맘편할거임 혹은 업데이트로 1초를 쓰고싶다면 2초넘으면 0만들었던것처럼 1초넘으면 더해주던거 0만들고 다른 변수를 1올려주는식으로 해야지
근데 소수점은 어쩔수없는거긴한데 1초만에 3이나 5가올라가는거면 타임스케일 건든거아녀?
글고 답변기다리거나 여기저기 찾아다니지말고 GPT한테 코드복붙하고 질문하면 어지간한거 다 해결됨 궁금한거도 물어보면 바로바로 답변해주니까 그쪽이 공부할떄는 훨 나을꺼임
점수 UI를 보여주는 scoreManager.cs 스크립트에서 계산 방법을 10f * Time.fixedDeltaTime 으로 한거 외에 따로 건든건 없습니다. (이거는 잘 작동합니다.) 다음 obstacle이 생기는 maxtime을 1에서 5로 바꾸니 왼쪽 아래 로그갱신은 0~5까지 올라가지기는 하는데, 기록들 보면 중간중간 5를 뛰어넘다가 다시 0으로 나오거나 하는 등 문제가 있어보이네요. (0.765 5.765 0.768 5.768 번갈아 나옵니다.) 근데 이 5를 뛰어넘는 큰 수들도 10을 안 넘어가네요. 이 오브젝트들이 10초를 넘어서면 Destroy 되게 설정해서 그런지 모르겠지만 이상한건 분명 디버그는 spedUpTimer 인데 왜 다른 수치들을 보여주는건지 의문이네요.
카톡방에도 물어봤는데 코루틴 얘기 하시던데 코루틴을 한번 알아보겠습니다. 지금 같은 경우는 세세하게 업데이트가 아니고 그냥 10초 단위로 변경하는거니까요. chat GPT도 사용해봤는데 해결이 안되더라고요. 코딩 하실 때 chat GPT를 자주 사용하시는 편인가요?
업데이트가 프레임당돌아가니까 프레임과 프레임 사이만큼의 오차가발생하니까 딱떨어지게 계산이 안되는거임 시간은 계속 흐르는데 계산은 프레임마다 하니까 발생하는 오차 설명하기가 모호한데 물체를 쭉~미는거랑 툭툭툭 치면서 미는거랑은 다르잖아?
chat GPT는 코딩할때는 물론이고 다른거할때도 많이쓰지 3.5는 헛소리많이하니까 좀 그렇긴한데 4.0은 그래도 괜찮아 만약에 GPT한테 물어봤는데 정상적인 답변이나 완전 잘 못 된 답변을 한다면 질문을 잘 못 한것일 가능성이 높음
GPT 유료쓰고있으면 그냥 GPT홈가서 써도 되고 결제안했으면 뤼튼가서 4.0공짜로 써
그리고 너가 코드를 만들었는데 문제가 발생하고 질문해도 고치기 힘들다 그러면 무슨무슨 기능하는 코드만들어달라고하면 GPT가 열심히 만들어주니까 그거보고 짜놓은거랑 비교하면서 고쳐나가도 됨
답변해주셔서 감사합니다. 무슨 자신감으로 지금까지 게임 개발하는 걸 미뤘는지 잘 모르겠네요. 더 열심히 하겠습니다.
나도 초보라 틀린 내용 많을수도있으니까 정확한 내용들은 별도로 찾아보는걸 추천함
void Update 엔 transform.position += Vector3.down * speed * Time.deltaTime; 만 남기고 스피드를 올리는 부분은 void FixedUpdate 에 옮겨서 해보세요. Update 는 매 프레임 마다 호출 되기에 렉 같은 것이 발생해서 프레임 갱신이 늦어지면 그만큼 호출이 늘어납니다. 극단적인 예시로 3초간 화면이 멈췄다 치면 그 3초간 Update 가 Call 되지 않으므로 spedUpTimer 가 늘어나지 않게되고 그 사이 10초 사이클이 들어가 있었다면 그만큼 오차가 생길겁니다
호출이 -> 호출 간 간격이
진짜 적은 오차로 시간 간격을 구하려는거면 Stopwacth 클래스의 사용도 고려해보세요
https://learn.microsoft.com/ko-kr/dotnet/api/system.diagnostics.stopwatch?view=net-7.0
아 그리고 FixedUpdate 에 옮긴 애들은 Time.deltaTime 을 Time.fixedTime 으로 바꿔야합니다
이따 집 돌아와서 다시 한번 시도해보겠습니다. 설명 감사합니다!