[Unity][3D-Game] Tower Defense Game (5)

suhan0304·2023년 11월 28일
0
post-thumbnail

강의영상 (7)


개발

카메라 조종

카메라를 원하는 입력에 맞춰 움직이고 확대 및 축소 되도록 Main Camera에 Camera Controller를 추가하고 아래와 같이 작성한다.

CameraController.cs

using UnityEngine;

public class CameraController : MonoBehaviour
{
    public float panSpeed = 30f; //평면으로 카메라가 움직이는 속도
    public float panBorderThickness = 10; //화면을 움직일 마우스 테두리 위치 굵기
    void Update()
    {
        if(Input.GetKey("w") || Input.mousePosition.y >= Screen.height - panBorderThickness) //w 입력 시 or 마우스가 화면의 상단 (y 좌표 - panBorderThickness) 바깥쪽에 있을 때
        {
            transform.Translate(Vector3.forward * panSpeed * Time.deltaTime, Space.World); //앞 방향으로 이동
            //deltaTime : 프레임에 상관없이 일정한 거리를 이동하도록 설정
            //Space.World : 세계 좌표를 기준으로 이동하도록 설정 - 회전을 무시하고 이동
        }
        if (Input.GetKey("s") || Input.mousePosition.y <= panBorderThickness) //s 입력 시 or 마우스가 화면의 하단 (panBorderThickness) 바깥쪽에 있을 때
        {
            transform.Translate(Vector3.back * panSpeed * Time.deltaTime, Space.World); 
        }
        if (Input.GetKey("d") || Input.mousePosition.x >= Screen.width - panBorderThickness) //d 입력 시 or 마우스가 화면의 오른쪽 (x 좌표 - panBorderThickness) 바깥쪽에 있을 때
        {
            transform.Translate(Vector3.right * panSpeed * Time.deltaTime, Space.World); 
        } 
        if (Input.GetKey("a") || Input.mousePosition.x <= panBorderThickness) //a 입력 시 or 마우스가 화면의 왼쪽 (panBorderThickness) 바깥쪽에 있을 때
        {
            transform.Translate(Vector3.left * panSpeed * Time.deltaTime, Space.World); 
        }

    }
}

위처럼 키 입력 + 마우스의 위치에 따라 Camera의 transform을 Translate로 이동 시킨다.

Translate : 해당 좌표값만큼 현재 좌표에 더해서 이동시킨다.

  • Update 안에 Translate 사용 시 매 프레임마다 해당 Translate의 Vector 값만큼 이동한다.

카메라 제어 활성/비활성화

ESC 키를 눌러 카메라 움직임을 끄고 킬 수 있도록 제어해서 원하면 카메라를 고정 시킬 수 있도록 설정한다.

CameraController.cs

private bool doMovement = true;

void Update()
{
    if (Input.GetKeyDown(KeyCode.Escape)) //ESC 키를 눌러 doMovement를 부울을 변경할 수 있다.
        doMovement = !doMovement;         //ESC 키를 눌러 카메라 움직임을 껐다 켰다 할 수 있다.

    if (!doMovement) //doMovement가 False이면 카메라를 움직이지 않는다.
        return;
        
	~~(생략)~~
 }

카메라 회전 제어

카메라의 높이에 따라 카메라를 회전 시켜서 맵이 항상 잘 보이도록 로직을 구현한다.

//카메라 높낮이 및 회전 제어
//스크롤은 GetKey처럼 누름, 안누름과 같이 2가지 경우가 아니라 속도를 값으로 반환한다. (아래 방향은 음수, 위 방향은 양수)
float scroll = Input.GetAxis("Mouse ScrollWheel");

Debug.Log(scroll);

Vector3 pos = transform.position;

pos.y -= scroll * 1000 * scrollSpeed * Time.deltaTime; //휠 반환 값 * 속도 * 프레임-시간 보정
//스크롤 휠 값은 매우 작기 때문에 1000을 곱해준다.

pos.y = Mathf.Clamp(pos.y, minY, maxY); //pos.y의 값은 minY와 maxY값 사이로 고정시킨다.

transform.position = pos; //위치 조정

Mathf.Clamp(float, min, max) : 최소 / 최대값을 설정하여 float 값이 범위를 넘지 않도록 한다.


결과물

profile
Be Honest, Be Harder, Be Stronger

0개의 댓글