어제 새벽에 글 올렸던 갤럼인데 근본적인 해결법은 못 찾았지만 원인은 알게되서 기분이 좋다 :)
수정한 코드
위 스크린샷에 보면 이동하는 지형들이 있는데 이놈들의 도착시간을 같게 만들려는 게 목적이었음.
문제는 MoveTowards 함수의 속도값에 있었는데, 두 오브젝트의 '거리/속도값'의 미세한 차이가 1피직스프레임의 시간오차를 만들어내는 경우가 있다는 게 문제였음. 오브젝트1이 특정지점에 있을때 오브젝트2도 특정지점에 있어야 되는데 1프레임씩 계속 밀리다보면 나중엔 두 오브젝트의 위치가 전혀 의도치 않은 지점까지 어긋나버리게 되서. :(
일단 원인은 알았으니 일단 문제 없게 해결은 가능할 것 같은데 근본적인 해결책은 모르겠다 ㅎㅎ
그래도 갤럼들이 이런저런 댓글들 많이 달아줘서 문제 해결에 아주 큰 도움을 받았음. 고마워! :D
이거 해결책 없어 무리수랑 유한소수랑 만날일 없듯 다른사람이 말한 것 처럼 시간 조절해서 맞추는 수 밖에 없음
ㅇㅇ 그래서 Time.time 체크하면서 시간세팅할라고. :D
아마 부동 소수 문제 때문에 차이가 커지는 것 같아 컴퓨터의 한계니 어쩔수 없는듯
var t = Mathf.Clamp(누적시간 / 이동에 걸리는 시간); 현재시간 위치 = Vector3.Lerp(시작위치, 목표위치, t); 이런식으로하면 시간에 맞춰서 위치 고정되지않을까?
앗!?
대신 이렇게하면 시간에 약간씩 오차가 생기겠지만, 적어도 이동하는 지형끼리는 어긋날 일이 없을거같아
Mathf.Clamp 써본적이 없어서 뭔가 보고옴. 이렇게 하면 시간오차도 없을 거 같은데!? 속도 기준으로 이동하는게 아니라 시간 기준으로 이동하니까 딱 좋아보이는데!? 바로 바꿔본다.
Clamp01 인데 내가 실수함!
클램프 2,3인자에 0, 1 붙여서 테스트 해봤었음. 클램프01쓰면 더 간편해지는구나!
여기에 가속같은거 주고싶으면, AnimationCurve 하나 만들어두고, Lerp(시작위치, 목표위치, curve.Evaluate(t)) 이런식으로 하면 평균속도는 같지만 가속붙는거 같은 움직임 구현할 수 있어. 나도 비슷한 문제 했어서 혹시 필요할까 해서 덧붙임
와우 땡큐!! 추락해서 플레이어를 찍어누르는 지형도 계획하고 있었는데 고맙다!
dotween 있으면 사용하는게 가장 마음편하긴 한데
dotween은 실무에서도 많이 쓰는 에셋이니 배워두면 연출이나 그런거 엄청 편함
어떤건 코드로 쓰고 어떤건 닷트윈으로 쓰고 그러면 나중에 더 헷갈릴 것 같아서 쳐다도 안 봤었는데 함 고려해봐야겠네. 닷트윈도.
dotween 진짜 써보니까 편하던데 단순한 지연 호출 하나 하려고 코루틴 새 거 만들 필요도 없고