Ch 10. 낭떠러지 추락

Date:     Updated:

카테고리:

태그:

케이디님의 [유니티 강좌] 리듬 게임 유튜브 강의를 듣고 정리한 필기입니다. 😀
🌜 강의 들으러 가기 Click

🚀 낭떠러지 추락

바닥에 보이지 않고 아주 큰 콜라이더를 두고, 추락하여 이 콜라이더에 닿으면 다시 부활시키는 이런 식으로 구현하면 된다!

📜PlayerController

bool isFalling = false; // 추락 중인지

Vector3 originPos = new Vector3(); // 추락하고 나면 원래 위치로 부활시켜야 하므로 기억하기 위해

Rigidbody myRigid;

    void Start()
    {
        myRigid = GetComponentInChildren<Rigidbody>(); // 이 스크립트가 붙는 빈 오브젝트인 Player의 자식 큐브에 Rigidbody가 있다. 큐브인 자식에게서 Rigidbody 가져옴.
        originPos = transform.position; // 부활 포인트이자 시작 위치. 부활 포인트가 여러개면 그때 그때마다 새롭게 세팅하고 저장해서 기억시켜놓으면 될 것 같다.
    }


    void Update()
    {
        CheckFalling(); // 혹시 추락중은 아닌지 체크

        if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.D) ||
            Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.S))
        {
            // 추락 중이 아닐때만 큐브가 이동,회전,반동을 할 수 있다. !isFalling
            if (canMove && s_canPressKey && !isFalling)
            {
                Calc();

                // 판정 체크 : Perfect, Cool, Good, Bad 일 때만 True
                if (theTimingManager.CheckTiming())
                {
                    StartAction();
                }
            }
        }
    }

    void CheckFalling()
    {
        if (!isFalling && canMove) // 완전히 멈추고 체크 + 떨어지는 중이 아닐 때만 체크하도록
        {
            // '!' 주목! 플레이어에서 아래로 Raycast를 쐈을 때 아무 것도 없다면 추락 중인것이다. 
            // 추락 중이 아니라면 스테이지의 Plate 와 충돌되야 정상이다.
            if (!Physics.Raycast(transform.position, Vector3.down, 1.1f))
            {
                Falling();
            }
        }
    }

    // 추락 중이라면 물리적으로 추락하도록 자식 큐브의 중력 활성화, 물리 활성화
    void Falling()
    {
        isFalling = true;
        myRigid.useGravity = true;
        myRigid.isKinematic = false;
    }

    // 이제 추락이 끝나서(밑에 깔린 Deadzone Collider에 충돌) 부활해야 한다면 
    // 자식 큐브의 중력 다시 비활성화, 물리 비활성화
    // 원래 위치로 리셋
    // ✨떨어진건 Rigidbody가 붙어있는 자식 큐브이고 부모인 빈 오브젝트는 원래 위치 그대로에 있다. 따라서 자식 큐브도 다시 부모 위치에 붙여주어야 하므로 localPosition을 원점으로 리셋하는 것이다.
    public void ResetFalling()
    {
        isFalling = false;
        myRigid.useGravity = false;
        myRigid.isKinematic = true;

        transform.position = originPos;
        realCube.localPosition = Vector3.zero;
    }


📜 DeadZone

image

image

빈 오브젝트 DeadZone을 만들고 대빵 큰 Box Collider를 붙인다. 플레이어가 추락하여 이 곳에 닿으면 다시 원래 위치로 부활시키기로 함.

public class DeadZone : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            other.GetComponentInParent<PlayerController>().ResetFalling();
        }
    }
}

데드존의 콜라이더가 “Player”와 충돌했다는 것은 Player의 자식인 realCube와 충돌했다는 것이다. realCube의 부모인 Player의 📜PlayerController를 호출하여 ResetFalling() 함수 호출로 부활.



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Unity Lesson 4 카테고리 내 다른 글 보러가기

댓글 남기기