Ch 10. 낭떠러지 추락
Categories: Unity Lesson 4
Tags: Unity Game Engine
케이디님의 [유니티 강좌] 리듬 게임 유튜브 강의를 듣고 정리한 필기입니다. 😀
🌜 강의 들으러 가기 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
빈 오브젝트 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() 함수 호출로 부활.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
Leave a comment