이 부분은 스크립트만으로 판단한다.
보통이라면 오브젝트의 velocity로 확인을 할 테지만 래그돌이 잠깐 부딪혀서 일시적으로 속도가 0에 가까워지는 경우가 있을 것이고 거의 멈췄으나 경사면이라서 넘어지는 경우도 있을 것이다.
잠깐만 생각해보면 멈췄는지 확인하려면 반드시 일정 시간 동안 움직임이 없는지 확인해야 한다.
래그돌에는 여러 신체에 rigidbody가 있는데 팔이나 발 같은 경우 미세한 떨림이 발생할 수 있다.
따라서 몸의 움직임이 가장 적을 것으로 예상되는 pelvis나 spine을 rigidbody로 하는 것이 좋겠다.
public Vector3 originPosition;
private int stopCount;
private IEnumerator EnumCheckIsGoatStop()
{
while (true)
{
if (originPosition!=null)
{
//이전 저장위치와의 거리차이가 거의 없는 경우
if ((spine.transform.position - originPosition).magnitude < 0.01f)
{
// Debug.Log(stopCount);
//카운트 증가
stopCount++;
//카운트가 10번 연속으로 증가하면 멈춤상태
if (stopCount > 10)
IsGoatStop = true;
else
IsGoatStop = false;
}
else
{
IsGoatStop = false;
stopCount = 0;
}
}
originPosition = spine.transform.position;
yield return new WaitForSeconds(0.01f);
}
}
위의 스크립트는 originPosition에 현재 위치를 저장하고 코루틴이 돌기전에 이전 위치와 비교해서 위치 차이가 0.01f 이하라면 정지라고 1회 카운트를 해준다.
그리고 0.01초 뒤에 다시 코루틴을 시작해서 이번에도 이전 위치와 현재 위치 차이가 0.01 이하라면 정지 카운트에 1을 더해준다.
만약 위치 간의 차이가 0.01보다 크면 정지 카운트를 0으로 초기화하고 정지 판단 불 변수 IsGoatStop을 false로 한다.
만약 더 정밀한 정지 판단을 원한다면 if ((spine.transform.position - originPosition).magnitude < 0.01f) 에서 0.01f를 더 낮은 수치로 바꾸면 되겠다.
그리고 정지 판단이 되기까지 가장 빠르면 0.01초 x 10 => 0.1초의 시간이 소요되는데 더 빠르게 판단을 하고 싶다면
yield return new WaitForSeconds(0.01f);의 0.01f의 값을 더 낮은 수치로 바꾸면 되겠다.
rigidbody 오브젝트가 생성되고 나서 StartCoroutine("EnumCheckIsGoatStop");를 통하여 코루틴을 실행하면 되겠다.
유니티 ragdoll 발사하기 글 모음
'Unity > 강좌' 카테고리의 다른 글
유니티 ragdoll 발사하기 - 7. 래그돌 고장 방지 (0) | 2019.08.18 |
---|---|
유니티 ragdoll 발사하기 - 6. 래그돌 멈추기 (0) | 2019.08.18 |
유니티 ragdoll 발사하기 - 4. 래그돌이 날아갈 때 한쪽 축으로만 이동되게 하기 (0) | 2019.08.17 |
유니티 ragdoll 발사하기 - 3. 래그돌 발사하기 (0) | 2019.08.17 |
유니티 ragdoll 발사하기 - 2.래그돌 만들기 (2) | 2019.08.17 |