반응형
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
반응형
그리드형
'Game Development, 게임개발 > 개발' 카테고리의 다른 글
static과 static public 의 차이, 정적 변 [Unity] (2) | 2021.04.18 |
---|---|
Unity에서 들이면 좋은 습관 [ Unity] (0) | 2021.04.15 |
투사체 경로 흔적 남기기, ProjectileTrail [ Unity] (4) | 2021.04.11 |
마우스 입력 받아서 이용하는 4가지 방법[Unity] (0) | 2021.04.10 |
Invoke로 인한 문제점 [Unity] (0) | 2021.04.08 |