유니티 Unity

[Unity] 메탈슬러그 식 지형 구현 및 캐릭터 이동

에헤이머꼬 2022. 10. 1. 19:27
반응형


메탈슬러그 식이라고 표현했지만 사실 비슷한 류의 게임들은 많이 있습니다.
예를 들면 메이플도 그와 비슷한 류가 되겠죠.
핵심은 하나입니다.

"떨어질 때는 지형을 인식하지만 올라갈 때는 통과가 되어야 한다"


말로는 설명이 힘들것 같아 영상을 보여드리면


이런 식이죠
일단 떨어질때 지형을 인식하고 멈출려면 콜라이더 컴포넌트는 당연히 있어야 합니다
그런데 이 콜라이더를 어떻게 다룰 것인가가 중요하겠죠

저 같은 경우에는


이렇게 하위에 DetectCeiling Collider을 만들었습니다 (씬에서 녹색 박스로 보이는 부분)
이 경우는 천장을 감지해서 천장이 있으면 투영화 없으면 실체화를 수행하는 방식입니다.
(플레이어 Collider에 IsTrigger가 true일때 투영, false일때는 실체로 구분했습니다.)

처음에는 DetectGround Collider로 밑에 있는 땅을 감지하는 방식으로 진행하려고 했습니다. 위 그림에서 녹색 콜라이더 부분을 아래로 옮기고 감지하는 방식이죠.
밑에 땅이 없을때는 투영화를, 있을 때는 실체화를 하는 식으로요

하지만 문제가 생기더군요

아래로 떨어질 때는 당연히 투영화 상태이고 땅을 감지하면
실체화를 동작하는 로직을 구현했습니다.
그런데 빠른 속도로 떨어지면 실체화가 되기 전에 통과가 되더군요....
그래서 땅에 닿기 전에 실체화가 이미 이루어져야 겠구나 생각했습니다.
그리고 만든 것이 천장을 감지하는 방식입니다.



로직은 이렇습니다.

using Photon.Pun;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
public class CharacterBase : MonoBehavior
{
    public void Penetrate()
    {
        _collider2D.isTrigger = true; //투영화
    }

    public void Materialize()
    {
        _collider2D.isTrigger = false; // 실체화
    }
}
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

public class DetectCeiling : MonoBehavior
{
    [SerializeField] private CharacterBase _characterBase = null;

    private void Awake()
    {
        _characterBase = transform.parent.GetComponent<CharacterBase>();
    }

    private void OnTriggerEnter2D(Collider2D collision)
    //위에 천장을 감지하면
    {
        _characterBase.Penetrate(); // 투영화
    }
    private void OnTriggerExit2D(Collider2D collision)
    //위에 있던 천장에서 나오면
    {
        _characterBase.Materialize(); //실체화
    }
}


사실 이동이나 점프 로직도 들어가면서 훨신 복잡한데 핵심만 가져왔습니다.

혹시나 전체 로직을 보고 싶으신 분들은
https://github.com/WildCork/PumkinSniper/blob/main/PumkinSniper/Assets/Script/Character/CharacterBase.cs

GitHub - WildCork/PumkinSniper

Contribute to WildCork/PumkinSniper development by creating an account on GitHub.

github.com

https://github.com/WildCork/PumkinSniper/blob/main/PumkinSniper/Assets/Script/DetectCeiling.cs

GitHub - WildCork/PumkinSniper

Contribute to WildCork/PumkinSniper development by creating an account on GitHub.

github.com


여기를 참고하시면 됩니다.

참고로 플레이어가 땅 위를 이동할때 플레이어 Collider와 바닥 오브젝트의 Collider 사이에
OnCollisionEnter, OnCollisionExit 함수가 가끔씩 발생하는 동작 (버그?인지는 모르겠네용) 이 발생해서

DetectFloor 라는 스크립트를 만들어서 예외 처리를 해봤는데 잘 되더라구요

나중에 바닥 감지 로직도 한번 소개해보겠습니다!!

반응형