ㄴ유니티(Unity) 2d 물리 게임 이동충돌
ㄴ유니티(Unity) META-INF/kotlinx_coroutines_core.version
ㄴ유니티(Unity) Rigidbody2d의 Addforce와 밀림방지
ㄴ유니티(Unity) - 아이폰, 안드로이드 권한 세팅 화면으로 이동하기
ㄴ유니티 (Unity) - Button의 OnClick Listener 사용법
ㄴ유니티(Unity) 프로젝트 점프게임 만들기 : [7] 플랫폼 생성
카메라 이동
넓은 공간을 사용하는 게임을 만들 때 카메라를 이동하여 맵의 이곳저곳을 살펴봐야 하는 경우가 생깁니다. 이때 드래그로 카메라를 움직이는 기능은 필수요소가 됩니다. 자주 사용되지만 다시 만들기 귀찮은 카메라 이동 로직을 공유합니다.
----
----
단순한 카메라 움직임
단순하게 카메라만 움직이기 위해서는 프레임마다 드래그 한 위치 값을 카메라에 대입시켜 주면 됩니다.
[SerializeField] Transform camTransform;
void Update () {
camTransform.position = Input.mousePosition;
}
하지만 카메라의 움직임이 부드럽지 못하고 순간이동하는 어색한 연출을 하게 됩니다.
그렇기 때문에 카메라가 터치한 위치로 바로 이동하는 것이 아닌 드래그 한 만큼만 이동하도록 해야 자연스러운 움직임을 보입니다.
Vector3 dragPrePos;
Vector3 camPrePos;
bool isPressed = false;
void Update()
{
if (Input.GetMouseButtonDown(0)){
dragPrePos = Input.mousePosition;
camPrePos = camTransform.position;
isPressed = true;
}
if (Input.GetMouseButtonUp(0)){
isPressed = false;
}
if (isPressed){
var movePos = new Vector3(Input.mousePosition.x - dragPrePos.x, Input.mousePosition.y - dragPrePos.y, dragPrePos.z);
camTransform.position = new Vector3(camPrePos.x + movePos.x, camPrePos.y + movePos.y, camPrePos.z);
}
}
이렇게 하면 드래그 한 만큼만 카메라가 이동하기 때문에 화면이 자연스럽게 움직이게 됩니다.
물리를 적용한 오브젝트를 사용 시
만약 오브젝트에 Rigidbody를 사용하여 FixedUpdate를 통해 이동을 갱신하고 있는 게임이라면 Update와 갱신 싱크가 맞지 않아 오브젝트가 렉 걸린 것처럼 움직이는 것을 볼 수 있습니다. 이런 때에는 Input에 대한 정보를 Update 함수에서 처리하고 위치 갱신은 FixedUpdate에서 처리해 주면 됩니다.
void Update()
{
if (Input.GetMouseButtonDown(0)){
dragPrePos = Input.mousePosition;
camPrePos = camTransform.position;
isPressed = true;
}
if (Input.GetMouseButtonUp(0)){
isPressed = false;
}
}
void FixedUpdate ()
{
if (isPressed){
var movePos = new Vector3(Input.mousePosition.x - dragPrePos.x, Input.mousePosition.y - dragPrePos.y, dragPrePos.z);
camTransform.position = new Vector3(camPrePos.x + movePos.x, camPrePos.y + movePos.y, camPrePos.z);
}
}
드래그 속도 조절
여기까지만 해도 무난하게 카메라 이동을 연출할 수 있지만 조금 더 화면을 천천히 움직이고 싶다면 movePos 값에 offset 값을 더해주면 됩니다.
if (isPressed)
{
var movePos = new Vector3(Input.mousePosition.x - dragPrePos.x, Input.mousePosition.y - dragPrePos.y, dragPrePos.z) * Time.deltaTime * 0.5f;
camTransform.position = new Vector3(camPrePos.x + movePos.x, camPrePos.y + movePos.y, camPrePos.z);
}
Time.deltaTime 값을 곱해주고 여기에 적절한 수치를 곱해주면 됩니다. 저는 0.5f를 곱해주었습니다.
'Programming > 유니티' 카테고리의 다른 글
유니티 (Unity) 자동 줄바꿈 flowlayout extention (0) | 2024.11.13 |
---|---|
유니티 Unity UI 삼각형 그리기 (0) | 2024.11.08 |
유니티(Unity) Rigidbody2d의 Addforce와 밀림방지 (0) | 2024.10.14 |
유니티(Unity) 2d 물리 게임 이동충돌 (0) | 2024.10.10 |
유니티(Unity) - 아이폰, 안드로이드 권한 셋팅 화면으로 이동하기 (0) | 2024.09.05 |