위 스샷와 같은 이동하는 지형이 있어. 나는 대각선하고 직선하고 속도 맞출때,
대각선의 경우에는 속도를 1.41421만큼 배수로 잡아주면 아주아주 근소한 오차만 있을 줄 알았거든?
근데 2싸이클 돌기도 전에 육안으로 오차가 잡히더라고.
x축 기준으로 직선 1만큼 이동하는거랑 같은 거리를 대각선으로 이동하려면 루트2만큼 이동하면 되는거니까 정확도를 위해서 소수점 5번째자리까지 적용시킨거였는데...
코드는 이래.
awake에선,
- 이동할 최초 nextPosition 잡아주고
fixedUpdate에선
- 만약 대기시간이 남아있으면 남은 대기시간만큼 대기하고 아니면 nextPosition으로 지정한 speed로 이동.
- 만약 nextPosition에 도착했으면 다음 nextPosition 갱신하고 대기시간 리셋.
- - - - - - -
speed 기준속도가 1초에 그리드1칸 움직이는 거거든? 내가 어디서 뭘 잘못했길래 오차가 저렇게 크게 나는걸까?
속도를 소수점 다섯째자리까지 맞췄으면 오차가 육안으로 보일때까지 꽤 긴 시간이 필요할거라고 생각했는데 아닌가;;
뭔가 조언 좀... @_@
저것들 움직임이 정확해야 내가 의도한 방향대로 플레이를 이끌어갈 수가 있는거라 중요한데 잘 모르겠다.
구글에 unity Vector normalized 로 검색해
그럼 이동에 쓰는 함수 자체를 바꿔보는 게 낫다는 얘기? 지금 쓰는 함수는 벡터가 아니라 두 지점 특정해서 이동하는 방식인데
1.41421 배수로 했을때 오차가 얼마나 나오는지 계산부터 해봐라. 작은 오차도 누적되면 생각보다 크다
오차는 0.000003562 정도 나옴. 여섯째자리부터 버림으로 적용시킨거라서. 내가 의도한것보다 실제론 저만큼씩 덜 이동한다는건데 그러면 24초만에 육안으로 보일정도로 오차가 생기면 안되는거 같아서 이해가 안돼서 질문한거.
speed가 몇임?
다 다름. 근데 대각선인 경우 직선속도에서 1.41412배 해서 적용시켰어.
speed를 모두 1로 하면 대각선 이동시 오차생김?
아 내가 말을 헷갈리게 했구나. 지금 문제는 스크린샷 속 이동지형의 도착시간을 모두 동일하게 맞추고 싶은거임.
내가 알기로는 MoveTowards 함수의 3번째 패러미터가 속도라서 대각선이던 말던 3번째 패러미터만 같으면 속도가 같은 걸로 알고 있음
속도는 같지. 근데 거리가 루트2만큼 차이가 나서. 그거 맞춰주려고 속도도 그만큼 배수를 준건데
도착시간을 동일하게 맞추고 싶다는걸 못 봤네 내가 잘못 이해함 ㅈㅅ
보니까 속도가 원으로 같은게 아니라 타일이 대각선 타일도 한칸이동처럼 느껴지면 좋겠다는거 같은데 그러면 x랑 y의 이동을 각각 계산해서 합하는 방식이 있음
내가 잘못이해한거면 무시해도됨
1.41412로 나눠야지 왜 곱함 (0,1) speed 1이면 1초동안 이동거리 1이고 (1,1) speed 1이면 이동거리 1.41412인데 그럼 speed에 그만큼 곱하면 더 빨라지지
ㅇㅇ 그래야 똑같이 1초만에 둘 다 목표지점에 도착하잖아.
너 대각선 이동할때 speed 몇으로 잡았냐?
1.41412
아니 대각선 이동할때 1.41412 말고 기본 speed 말야
(0, 0) → (1, 0) 으로 갈때 속도 : 1 (0, 0) → (1, 1) 으로 갈때 속도 : 1.41412 이렇게 해야 둘이 같은 시간에 도착지점에 도착하자너.
기본속도 없어. 인스펙터창에서 바로 입력하는 식으로 해놨엉.
2싸이클 돌기도 전에에서 2싸이클 도는 시간은 얼마인데?
24초
야 잠깐. 니가 원하는게 (0,0)에서 (1,0)으로 가는 것하고 (0,0)에서 (1,1)로 가는 것하고 똑같은 시간 나오게 하는거야?
ㅇㅇ 맞아!
1.41412면 6째 자리가 0.000003이잖아. 여기다가 60프레임이랑 24초 곱하면 0.00432 나오네. 이 정도면 오차를 눈으로 확인할 수 없어야 하는데?
그래서 이상해서 질문글 쓴거;; 코딩에서 오류가 있나해서.
(거리 / 시간) = 초당 속력 초당 속력 * time.deltaTime = 프레임 당 속력
거리는 출발 하기 전에 구하고, 시간은 인스펙터에서 지정하면 됨
거리, 시간 분해해서 입력해도 똑같은게 거리가 대각선이라 1.41412 적용해야댐. 내가 애초에 1.41412를 적용한게 거리가 직선대비 1.41412배라서 그런거니까.. ㅠ
게시글에 쓴 코드처럼 방금 테스트 해봤는데 난 왜 잘되지
여태 내 눈이 잘못됐던건가 ㅋㅋ 동시에 여러개 확인하다보니 실수했나 다시 봐야겠네 나도;;
그런데... 사선 이동이 전부 45도야? 무슨 게임이고 어떤 규칙인지 모르겠지만 지나가다 생각하는 수준으로 말해보자면, 도착 시간이 중요하다면 이동시간을 먼저 계산하고 프레임이나 기준시간으로 나눠서 기준 틱마다 특정 위치로 옮겨주면 되긴할텐데 말한대로 무슨 규칙들이 있는 게임인지 몰라서...
ㅇㅇ 사선은 모두 45도로 제한할 계획이야. 지금 그렇게 바꿀까 생각중이야. 지금은 경로1개짜리 지형만 보여줬는데 나중엔 경로가 여러개짜리인 것들이 있어서 경로마다 속력이 달라지는걸 피하려고 속도로 풀어보려고 했던건데 정확성이 더 중요하니까
시간 기준으로 코드를 다시 짜는 게 더 나을 것 같다. ㄹㅇ
1.41421를 왜 곱해야하는지 모르겠음... 처음 위치랑 이동 하려는 방향(각도)만 정해지면 속도가 동일하면 어떤 각도이던지 간에 똑같은 이동거리가 나와야 정상임
목표지점까지의 거리가 1짜리와 √2(1.41412...)짜리 모두 1초 후에 목표지점까지 가려면 속도도 √2배 해줘야 두 오브젝트의 출발과 도착이 같아지잖아.
Normalized 하면 되는데
일단 디버그로 속도 1.41412의 경우에 한칸 이동하는데 정확히 몇초 걸리는지 체크해보자 하나 궁금한게 있는데 내가보기엔 1.41412로 실행시킬 때 도착지점과 플랫폼 지점이 ==로 비교되면 일치하는 경우가 안나올것 같은데 저 코드가 돔? 그러니깐, 대각선 길이가 엄청 길어졌을때는 오차가 0.000001 이상으로 나와서 도착해도 불일치 뜰 것 같은데 만약 movetowards가 마지막 남은 이동이 0.000001이고 스피드가 1이여도 0.000001 이동하는 방식으로 작동한다면, 피직스프레임 하나만큼의 오차가 계속해서 생기는게 맞음.
1. 일치는 아무런 문제 없이 항상 됨. 코드는 문제 없이 돔. 2. 지금은 코드를 '시간을 입력하고 속도는 내부에서 계산하는 식'으로 수정했는데 불규칙한 특정 속도에서 1피직스프레임씩 도착시간이 지연되는 문제가 있네. 지연문제 없는 시간끼리 조합해서 사용하거나, 지연문제 있는 시간끼리 조합해서 사용하면 타이밍 어긋나는 문제는 해결 가능하긴 한데 근본적인 해결책은 모르겠네;; 나도 처음 문제 생겼을때 Time.time으로 시간 체크를 해봤었는데 한가지 경우만 해본대다가 그땐 지연문제 없는 시간세팅이어서 문제를 발견 못했었네;; 덕분에 문제가 뭔지는 알아서 답답한 게 좀 풀렸다.
루트2를 내림 하지 말고 올림해서 쓰면 일단은 되지 않을까 싶음 지금은 만약 루프를 3회 돌아서 도착해야 하는데, 3회 돌았을때 거리가 살짝 부족해서 4회 도는거잖아. 2회 돌고, 1회 이동거리보단 덜 남았지만, 그래도 남은 거리 1회 더 도니깐 정확히 3회 돌게 될 것 같아
그런데 올림을 하던 내림을 하던 모든 경우의 수를 커버하는건 불가능하니까 이 문제는 다른 함수로 바꿔쓰지 않는 이상 안고 가야하는 문제가 아닌가 싶어. 시간 체크하면서 그때그때 맞춰가면서 쓸라구. @_@
이동을 위한 Transform처리를 한 후에 실제로 이동된 거리를 한번 로깅해봐 실제로 1.414배로 잘 나오고 있으면 눈의 착각이던가 뭔가 다른곳에서 위치를 치고있던가 하는 거일듯
유니티 내부에서 작은 숫자는 프레임단위로 잘라냄 rigidbody쓰면 알 수 있는데 특정 각도로 박치기 시키면 대각선으로 들어온 방향이 무시되는 현상이있는데 작은 수치는 무시하게 설정되있어서그래
생각해봤는데 어떤 대각선이던지 간에 동일한 시간으로 맞추려면 x 축 이동거리 y 축 이동거리 식을 따로 쓰고 x 측 속도에 sprt(x^2+y^2)/ x 를 곱하고 y측 속도에 sprt(x^2+y^2)/y 를 곱하면 될 것 같음
사용함수 바꿔서 해결함
https://gall.dcinside.com/mgallery/board/view/?id=game_dev&no=56269&_rk=zx3&page=1