Get it on Google Play


Wm뮤 :: 유니티 플랫폼 훅

블로그 이미지
가끔 그림그리거나 3D모델링하거나
취미로 로봇만드는
퇴직한 전자과 게임프로그래머
2020.3.48f1 , 2022.3.6f1 주로 사용
모카쨩
@Ahzkwid

Recent Comment

Archive


2023. 8. 23. 10:46 Unity

 

 

 

검색해보면 여러가지 나온다

바닥오브젝트에 Parent 시키라느니

바닥오브젝트에 포지션값을 계산해서 추적시키라느니

심지어 AI도 이런 개소리를 한다

 

결론부터 말하자면

다 개소리고 그냥 유니티 물리엔진이 기본으로 지원해준다

 

 

근데 잘 보면 스피어는 각도추적이 안 되고 덩그러니 있는걸 볼수 있다

캡슐도 같은 문제다

아마 충돌면이 점이라서 마찰력 0으로 가정하나본데

당연히도 캐릭터들도 캡슐콜라이더를 많이 쓰기 때문에 같은 현상이 생긴다

(대체 언놈이 캡슐콜라이더 쓰라고 선동하고 다닌거지)

 

아무튼 그래서 해결방법

 

발이 닿는 부분에 박스콜라이더를 깔아준다

박스콜라이더가 위아래로 길쭉한 이유는 납작하게 하니 땅에 박힐때도 있드라

아이스크림 콘모양이 되어야 한다

 

 

 

Y축만 풀어주자

 

 

 

플랫폼 설정 차례다

그리고 가끔 패스이동등을 위해 좌표이동을 쓰는것들이 있는데

하단과 같이 치환해주면 된다

 

 

1안

velocity 이동

외력이 가해지면 날아가버리는 단점이 있다

더보기
private void FixedUpdate()
{
    //if (Time.time>1)
    {
        (var pos, var rot) = ProgressToPayloadPosition(progress);

        //rot= Quaternion.Lerp(payload.transform.rotation, rot, 0.1f);
        if (Vector3.Distance(payload.transform.position, pos)>2f)//2이상 이동은 텔레포트로 간주
        {
            payload.transform.position = pos;
            payload.transform.rotation = rot;
        }
        else
        {
            rot= Quaternion.Lerp(payload.transform.rotation, rot, 0.05f); //러프 반영

            var velocity = pos - payload.transform.position;
            //velocity는 초당 이동이므로 프레임당 이동으로 바꾸어주어야 한다고 하는데 어째선지 fixedDeltaTime을 넣으면 급가속으로 위치가 튄다
            //그래서 drag를 넣을까 했는데 얼마만큼 영향준다고도 안 써있고해서 그냥 퍼센테이지로 깎기로 함
            velocity /= Time.fixedDeltaTime;
            velocity *= 0.2f;
            payload.GetComponent<Rigidbody>().velocity = velocity;

            var angularVelocity = (rot * Quaternion.Inverse(payload.transform.rotation)).eulerAngles;
            angularVelocity.x = Mathf.DeltaAngle(0, angularVelocity.x);
            angularVelocity.y = Mathf.DeltaAngle(0, angularVelocity.y);
            angularVelocity.z = Mathf.DeltaAngle(0, angularVelocity.z);
            //얜 그냥 난리 부르스 추길래 fixedDeltaTime 안 넣음, 알고보니 맥스가 7이고 어째 얜 프레임당 기준인듯?
            payload.GetComponent<Rigidbody>().angularVelocity = angularVelocity;
        }


    }
}

 

그리고 가급적 플랫폼 질량을 높여두고

angular drag때문에 원하는 위치에 미반영 되는걸 막기위해 가급적 0으로 두자

 

 

 

2안

애니메이션 피직스를 사용

첫번째는 물리적인 이동이지만

이건 애니메이션이라 예정 좌표 말고 다른곳으로 가지 않는다

 

 

 

3안

이녀석에 페이로드에 제일 적합했다

애니메이션으로 균일한 이동속도는 만들기 어려우니까

(var pos, var rot) = ProgressToPayloadPosition(progress);

if (Vector3.Distance(payload.transform.position, pos) > 2f)//2이상 이동은 텔레포트로 간주
{
    payload.transform.position = pos;
    payload.transform.rotation = rot;
}
else
{
    pos = Vector3.Lerp(payload.transform.position, pos, 0.05f); //덜컹거림 방지
    rot = Quaternion.Lerp(payload.transform.rotation, rot, 0.05f); //덜컹거림 방지
    payload.GetComponent<Rigidbody>().MovePosition(pos);
    payload.GetComponent<Rigidbody>().MoveRotation(rot);
}

 

 

적용된 모습

 

 

 

 

'Unity' 카테고리의 다른 글

유니티 킬로그  (0) 2023.08.28
유니티 웨이포인트식 자율주행  (0) 2023.08.19
ugui에 3d 넣기  (0) 2023.08.13
posted by 모카쨩

  • total
  • today
  • yesterday

Recent Post

저사양 유저용 블로그 진입