#30 카메라 마스킹 / 움직이는 플레이드

국기웅·2024년 5월 29일

유니티에서는 Culling Mask기능을 통해 원하는 물체만 렌더링하고, 혼합시킬 수 있다.
활용 방도가 많을 것 같아 조금 찾아보았다.

정확한 정의는 다음과 같다
: 카메라가 렌더링 할 오브젝트의 레이어를 포함하거나 제외합니다. 오브젝트의 레이어를 인스펙터에 할당해야 합니다.
Unity Doc

즉, 내가 렌더링할 레이어를 골라주면, 해당 부분만 카메라에 표시될 수 있다는 것이다.

위 이미지에서 Cutting Mask에서 레이어를 설정해 줄 수 있다.

Clear Flags를 통해 어느 부분을 클리어 할지 그 여부를 결정할 수 있다.
여러 대의 카메라를 생성하여 각각 다른 Depth를 할당할 수 있다.Depth에 따라 카메라의 그려지지는 순서가 결정된다.

이를 통해 무기 장착 UI를 구현할 수 있다.

카메라 1

카메라 2

두 카메라를 합성하여 화면을 표시할 수 있다.

위 기능을 통해 분할 화면 2인 플레이를 만들 수 있을 것 같다.

움직이는 플레이트

플레이트가 이동할때, 플레이어가 그 위를 올라가고, 같이 자연스럽게 이동하는 코드를 만들어보았다.

기본적으로 플레이트는 animator를 통해 움직인다.
내가 작성한 코드는 아래와 같다

public class MovingPlate : MonoBehaviour
{
    Vector3 plateFirstLoc;
    Vector3 DeltaLocation;

    private void OnEnable()
    {
        plateFirstLoc = this.transform.position;//현재 위치 저장

    }
    private void FixedUpdate()
    {
        DeltaLocation = plateFirstLoc - this.transform.position;//각 프레임마다 위치의 변화량 계산
        plateFirstLoc = this.transform.position;
    }


    private void OnCollisionStay(UnityEngine.Collision collision)
    {
        //맞닿은 물체의 위치를 변화량만큼 이동 -> 발판과 같은 변화량을 지니게 됨
        collision.transform.position += new Vector3 (-DeltaLocation.x,-DeltaLocation.y, 0.0f);
    }

}

시작시 현재 위치를 작성한다
Fixed Update는 일정프레임마다 실행되는 부분이다
여기서 각 위치의 변화량을 계산한다. 이건 해당 플레이트의 위치 변화량이고, 시간단위가 있으므로 속도를 의미한다.

그렇다면 위에 있는 물체에 각 프레임마다 해당 변화량(1프레임간 움직인 거리 = 속도*시간(1프레임) )을 곱해주는 것으로 자연스러운 움직임을 만들 수 있다.

다만 실제로 실행하면서 걱정된 부분은, 위에 일반적인 물체를 올려놓았을때이다. 이때 물체의 y축이 진동하는 모습을 보았다.
중력에 대한 영향과 관련이 있는 것 같은데 해결하지는 못했다.

profile
게임개발호소인

0개의 댓글