본문 바로가기
개발일지/코드 기록

유니티2D 캐릭터를 따라다니는 카메라와 영역 설정

by 개발자 슈니 2022. 9. 26.
728x90
반응형

카메라가 캐릭터를 따라다니는 스크립트

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraCtrl : MonoBehaviour
{
    public float cameraMoveSpeed = 5; // 캐릭터를 따라다니는 카메라의 속도

// 카메라의 경계선을 그려주기 위해 맵의 크기를 구해야한다
// 인스펙터창에서 조정할 수 있도록 퍼블릭으로 선언
    public Vector2 center; 
    public Vector2 mapSize; 

    GameObject player; // 카메라가 따라다닐 캐릭터

// 카메라의 높이와 폭을 받아오기 위한 변수 선언
    float height; 
    float width; 

     void Awake()
    {
// 카메라가 따라다닐 캐릭터의 레퍼런스를 연결해 줬다
        player = GameObject.Find("Player"); 
    }

    void Start()
    {
// 컴포넌트가 실행됨과 동시에 카메라의 높이와 폭을 받아 변수에 저장한다
        height = Camera.main.orthographicSize;
        width = height*Screen.width / Screen.height;
    }

// 캐릭터를 따라다니는 카메라의 이동은 업데이트 함수보다 레이트 업데이트 함수에서
// 처리를 해주는게 더 좋다
     void LateUpdate()
    {
// 플레이어의 위치와 카메라의 위치를 뺀 값을 벡터3 변수에 저장하여 방향을 나타낸다
        Vector3 dir = player.transform.position - this.transform.position;
// 카메라가 x축, y축으로 움직일때, 이동 속도만큼 서서히 이동시키기 위함
        Vector3 moveVector = new Vector3(dir.x * cameraMoveSpeed * Time.deltaTime, dir.y * cameraMoveSpeed * Time.deltaTime, 0.0f);
        this.transform.Translate(moveVector); // 위에서 구한 방향과 거리만큼 카메라를 움직인다

// 카메라가 영역 밖으로 벗어나지 못하게 해주는 코드

        float lx = mapSize.x - width;
        float clampX = Mathf.Clamp(transform.position.x, -lx + center.x, lx + center.x);

        float ly = mapSize.y - height;
        float clampY = Mathf.Clamp(transform.position.y, -ly + center.y, ly + center.y);

        transform.position = new Vector3(clampX, clampY, -10f);
    }

// 카메라의 경계 영역을 그려 눈에 보이게 함
     void OnDrawGizmos()
    {
        Gizmos.color = Color.red; // 색상은 빨강색으로 그린다
        Gizmos.DrawWireCube(center, mapSize * 2); // 네모 모양으로 대칭 맞게 
    }
}

주석으로 설명을 달았는데 내 생각이기 때문에 정확하게 맞는진 모르겠다^^

그래도 동작은 잘 되니까~

728x90
반응형

댓글