Game Development, 게임개발/개발

카메라 크기에 맞춰서 경계 설정하기, Boundary [Unity]

게임이 더 좋아 2021. 4. 14. 04:33
반응형
728x170

 

나는 슈팅게임을 하는데 필요했고

뭐 다른 이유로도 화면 밖의 것들을 지우고 싶을 때가 많을텐데 

플레이어가 보는 카메라는 항상 존재하니까

그 크기에 맞춰서 짠다면 괜찮지 않을까? 

이 스크립트를 어디에다도 쓸 수 있지 않을까???

알아보자

 

**해당 카메라는 Orthogonal이어야 적용되도록 만들었다.

 

 


 

나는 이렇게 경계를 설정하려고 한다.

 

1. 카메라의 크기를 구한다.

2. 해당 오브젝트의 위치를 경계와 비교한다.

3. 경계에서 벗어나지 못하게 제약을 둔다.

 

 

 


 

 

변수들, variables

    [Header("Set in Inspector")]
    public float radius = 1f;
    public bool keepOnScreen = true; // this allow object to go through boundary when it's false

    [Header("Set Dynamically")]
    public bool isOnScreen = true;
    public float camWidth;
    public float camHeight;



    [HideInInspector]
    public bool offRight, offLeft, offUp, offDown;


 

 

초기화,Initializing

    void Awake()
    {
        // get a value by multiplying aspect
        camHeight = Camera.main.orthographicSize;
        camWidth = camHeight * Camera.main.aspect;
    }

 

 

또한 LateUpdate를 이용하여 해당 오브젝트에서 일어난 Update의 연산들이 방해하지 못하도록함.

void LateUpdate()
    {
        Vector3 pos = transform.position;
        isOnScreen = true;
        offRight = offLeft = offDown = offUp = false;

        if(pos.x > camWidth - radius)
        {
            pos.x = camWidth - radius;
            isOnScreen = false;
            offRight = true;
        }
        if (pos.x < -camWidth - radius)
        {
            pos.x = -camWidth - radius;
            isOnScreen = false;
            offLeft = true;
        }
        if (pos.y > camHeight - radius)
        {
            pos.y = camHeight - radius;
            isOnScreen = false;
            offUp = true;
        }
        if (pos.y < -camHeight - radius)
        {
            pos.y = -camHeight - radius;
            isOnScreen = false;
            offDown = true;
        }

        // the object have to be in the boundary
        isOnScreen = !(offRight || offLeft || offDown || offUp);
        if(keepOnScreen && !isOnScreen)
        {
            transform.position = pos;
            isOnScreen = true;
            offRight = offLeft = offDown = offUp = false;
        }

    }

 


 

이 스크립트를 이용해서 3가지 기능을 얻었다.

 

해당 오브젝트가 어느 위치로 나갔는지 확인이 가능

offRight, offLeft, offDown, offUp

 

카메라의 크기에 따라 런타임 중에 할당

 

Radius라는 offset을 이용해서

실제 경계에 닿지 않더라도 경계 안에서 또는 경계 밖에서 경계에 닿았다고 판단 가능

-> 예를 들어 자연스러움을 위해서 적 비행기는 사용자 화면 밖에 나갔을 때 터지는 것이 좋다

 

 

경계 짠

 

728x90
반응형
그리드형