SingSing 개발 일지(2)

권태하·2024년 10월 2일
0
post-custom-banner

구현하려 했던 것은 캐릭터 컨트롤러 컴포넌트를 이용해서 플레이어 오브젝트는 계속해서 전진하고, 이동하는 도중 오브젝트를 만나면 이동 반대방향으로 팅겨나오는 효과였다.

캐릭터를 rigidbody로 이동시켰을 때, 이동하는 방향이 틀어지거나 방향 전환을 했을 때 원하는 결과가 안 나올 것이라 생각해서 캐릭터컨트롤러를 이용해보려 했는데, 팅겨나오는 효과는 어떻게 구현해야할 지 몰라서 rigidbody를 팅기는 오브젝트에만 넣어줘서 AddForce를 넣어봤다.

    private void OnCollisionEnter(Collision other)
    {
        // 충돌한 오브젝트의 레이어가 Player인 경우
        if (other.gameObject.CompareTag("Player"))
        {
            // 팅겨내는 방향을 계산
            refletionDir = (other.transform.position - transform.position).normalized;

            // 팅겨내는 힘을 가함
            other.gameObject.GetComponent<Rigidbody>().AddForce(refletionDir * reflectionPower, ForceMode.Impulse);
        }
    }
    
    
    ======
    
    private void MovePlayer()
    {
        characterController.Move(Vector3.forward * moveSpeed * Time.deltaTime);
    }    

하지만 이 방식으로는 캐릭터의 전진만 있을 뿐 팅겨나오는 효과는 적용되지 않았다.

어떤식으로 접근해야할 지 감이 오지 않아서 gpt검색을 해본 결과

CharacterController의 Move 함수로 움직이는 물체는 Rigidbody의 AddForce로 밀어내는 것이 어렵습니다. CharacterController는 물리 엔진과 독립적으로 작동하며, Rigidbody와 상호작용하지 않습니다. 따라서 CharacterController를 사용하는 객체를 밀어내려면 다른 방법을 사용해야 합니다.

이를 해결하기 위해 다음과 같은 방법을 사용할 수 있습니다:

CharacterController의 Move 함수를 사용하여 직접 위치를 업데이트합니다.
충돌 시 CharacterController의 속도를 변경하여 밀어내는 효과를 구현합니다.
Pseudocode
충돌 시 CharacterController의 속도를 계산합니다.
CharacterController의 Move 함수를 사용하여 새로운 위치로 이동합니다.

CharacterController와 Rigidbody는 같이 쓰기 어렵다는 것을 알게 되었다.

이를 토대로 코드를 수정해봐야겠다.

항상 게임 타입에 따라 어떤 컴포넌트를 사용해서 캐릭터를 움직이게 하느냐가 고민거리가 되는 것 같다.

profile
스터디 로그
post-custom-banner

0개의 댓글