[Unity]08.좀비 서바이버 따라하기 #2 - 캐릭터 이동과 시네머신 추적 카메라

안녕하세요 유랑입니다.



실력향상을 위해서 오늘도 책을 따라하면서 공부하겠습니다.

궁금하신점 있으시면 댓글로 남겨주세요^^




1. 좀비 서바이버



이번 강의는 레트로님께서 만든 예제이며,

교재를 구입하시면 자세한 내용을 배우실 수 있습니다.

저는 책을 구입하였고, 스킬업을 위해서 복습겸 글을 올리겠습니다.



깃허브 사이트 => 깃허브

유튜브 사이트 => 유튜브







1-1) 캐릭터 이동 구현 - ㉠스크립트 추가



캐릭터 이동을 위한 스크립트를 추가해 주겠습니다.

PlayerInput과 PlayerMovement를 추가해 주세요^^






<PlayerInput>


플레이어의 입력을 감지하고 이를 다른 컴포넌트에 알려줍니다.

프로퍼티 문법을 통해 값은 내부에서만 할당이 가능합니다.


 

using UnityEngine;

// 플레이어 캐릭터를 조작하기 위한 사용자 입력을 감지
// 감지된 입력값을 다른 컴포넌트들이 사용할 수 있도록 제공
public class PlayerInput : MonoBehaviour {
    public string moveAxisName = "Vertical"; // 앞뒤 움직임을 위한 입력축 이름
    public string rotateAxisName = "Horizontal"; // 좌우 회전을 위한 입력축 이름
    public string fireButtonName = "Fire1"; // 발사를 위한 입력 버튼 이름
    public string reloadButtonName = "Reload"; // 재장전을 위한 입력 버튼 이름

    // 값 할당은 내부에서만 가능
    public float move { get; private set; } // 감지된 움직임 입력값
    public float rotate { get; private set; } // 감지된 회전 입력값
    public bool fire { get; private set; } // 감지된 발사 입력값
    public bool reload { get; private set; } // 감지된 재장전 입력값

    // 매프레임 사용자 입력을 감지
    private void Update() {
        // 게임오버 상태에서는 사용자 입력을 감지하지 않는다
        if (GameManager.instance != null && GameManager.instance.isGameover)
        {
            move = 0;
            rotate = 0;
            fire = false;
            reload = false;
            return;
        }

        // move에 관한 입력 감지
        move = Input.GetAxis(moveAxisName);
        // rotate에 관한 입력 감지
        rotate = Input.GetAxis(rotateAxisName);
        // fire에 관한 입력 감지
        fire = Input.GetButton(fireButtonName);
        // reload에 관한 입력 감지
        reload = Input.GetButtonDown(reloadButtonName);
    }
}


<PlayerMovement>


플레이어 입력에 맞춰 플레이어 캐릭터를 이동하고 적절한 애니메이션을 재생합니다.

물리 정보 갱신을 위해 FixedUpdate()를 사용하였습니다.



using UnityEngine;

// 플레이어 캐릭터를 사용자 입력에 따라 움직이는 스크립트
public class PlayerMovement : MonoBehaviour {
    public float moveSpeed = 5f; // 앞뒤 움직임의 속도
    public float rotateSpeed = 180f; // 좌우 회전 속도


    private PlayerInput playerInput; // 플레이어 입력을 알려주는 컴포넌트
    private Rigidbody playerRigidbody; // 플레이어 캐릭터의 리지드바디
    private Animator playerAnimator; // 플레이어 캐릭터의 애니메이터

    private void Start() {
        // 사용할 컴포넌트들의 참조를 가져오기
        playerInput = GetComponent();
        playerRigidbody = GetComponent();
        playerAnimator = GetComponent();
    }

    // FixedUpdate는 물리 갱신 주기에 맞춰 실행됨
    private void FixedUpdate() {
        // 회전 실행
        Rotate();
        // 움직임 실행
        Move();

        // 입력값에 따라 애니메이터의 Move 파라미터값 변경
        playerAnimator.SetFloat("Move", playerInput.move);
    }

    // 입력값에 따라 캐릭터를 앞뒤로 움직임
    private void Move() {
        // 상대적으로 이동할 거리 계산
        Vector3 moveDistance =
            playerInput.move * transform.forward * moveSpeed * Time.deltaTime;
        // 리지드바디를 이용해 게임 오브젝트 위치 변경
        playerRigidbody.MovePosition(playerRigidbody.position + moveDistance);
    }

    // 입력값에 따라 캐릭터를 좌우로 회전
    private void Rotate() {
        // 상대적으로 회전할 수치 계산
        float turn = playerInput.rotate * rotateSpeed * Time.deltaTime;
        // 리지드바디를 이용해 게임 오브젝트 회전 변경
        playerRigidbody.rotation =
            playerRigidbody.rotation * Quaternion.Euler(0, turn, 0f);
    }
}



1-2) 캐릭터 이동 구현 - ㉡입력 매니저



상단 메뉴 Edit => Projects Settings => Input을 실행시키면 

PlayerInput에서 설정한 입력축과 입력버튼을 확인가능합니다.






Reload라는 입력은 없으니 Size를 늘리고,

이름과 버튼 값을 변경하여 만들어 주시면 됩니다ㅎㅎ





키보드를 이용해 이렇게 움직이는걸 확인 할 수 있습니다^^






1-3) 시네머신 추적 카메라 - ㉠시네머신



시네머신은 카메라 추적을 쉽게 제어하도록 도와줍니다.

애니메이션, 영화, 다양한 장르에서도 사용한다고 하네요.

시네머신을 이용해 플레이어 추적 카메라를 만들어 보겠습니다!!!







1-4) 시네머신 추적 카메라 - ㉡브레인 카메라



브레인 카메라는 게임 월드를 촬영하는 "진짜" 카메라입니다.

씬에는 하나만 존재하면 MainCamera에 다음과 같이 컴포넌트를 추가해 주겠습니다.







1-5) 시네머신 추적 카메라 - ㉢가상 카메라



상단 메뉴 Cinemachine => Create Vitual Camera를 클릭해 가상 카메라를 추가해 주세요.

가상 카메라는 여러 개 존재할 수 있으며, 

브레인 카메라는 가상 카메라 중 하나를 골라 활성화된 카메라로 사용합니다.






가상 카메라의 이름은 Follow Cam으로 변경해 주세요.





그리고 Follow와 Look At에 플레이어 오브젝트를 넣어주겠습니다.


* Follow : 할당된 게임 오브젝트를 따라다닙니다.(위치 변경)

* Look At : 할당된 게임 오브젝트를 주시합니다.(회전 변경)





가상 카메라에 플레이어를 넣어주고 나면 붉은색과 푸른색의 영역이 보이게 됩니다.

영역은 스프토존, 하드 리밋, 데드존이라고 불리며 

카메라의 자연스러운 추적을 구현하는데 사용됩니다.


* 소프트존(파란색), 카메라가 부드럽게 회전합니다.

* 하드 리밋(빨간색) : 카메라가 빠르게 회전합니다.

* 데드존(가운데) : 카메라가 회전하지 않습니다.





가상 카메라의 시야각과 파라미터를 설정해 주겠습니다.

시야각은 카메라가 한 번에 볼 수 있는 각도를 뜻합니다.





Aim 파라미터를 설정해 주겠습니다.

Tracked Object Offset은 추적 대상과의 거리를 결정,

소프트존을 0으로 함으로써 지연시간 없이 캐릭터를 즉시 조준하게 설정하였습니다.





플레이어가 움직이면 이렇게 카메라가 추적을 하게 됩니다.








2. 마무리



오늘 강의는 여기까지입니다.

좀비 서바이버를 따라하면서 캐릭터 이동과 시네머신 기능까지 만들어 보았습니다.

책이랑 순서나 내용이 다를 수 있습니다.

감사합니다.




수업자료: 좀비 서바이버 따라하기 #2 - 캐릭터 이동과 시네머신 추적 카메라




댓글

Designed by JB FACTORY