본문 바로가기
유니티3D

유니티3D - 3인칭 무빙 카메라 - 사이드 뷰 #1

반응형

지난 시간까지는 NPC와의 대화창에 대한 부분 최종 마무리하였습니다.

https://itadventure.tistory.com/428

 

유니티3D - 대화창에서 NPC 를 바라보는 카메라 #2

지난 시간에는 Scene(씬)에 카메라를 1대 추가로 세팅하여 캔버스 UI를 통해 월드의 특정 구역을 카메라가 보이는 화면을 띄우는 부분을 살펴보았습니다. 마치 CCTV처럼 말이죠 :) ※ 편의상 쉬운 이

itadventure.tistory.com

이번 시간에는 1인칭/3인칭 무빙 카메라에 대한 부분을 다뤄 볼텐데요.

마우스를 통해 사방을 돌려볼 수 있는 카메라를 의미합니다.

1/3인칭 전환이라면 지난번에 다루어 본적이 있는데요. 그 때는 단순히 막대기 플레이어였지요,

https://itadventure.tistory.com/400

 

유니티3D 플레이어 조작 #6. 1/3인칭 시점 전환

지난 시간에는 3인칭 시점 상태에서 플레이어 조작에 대해 알아보았습니다. itadventure.tistory.com/399 유니티3D 플레이어 조작 #5. 3인칭 플레이어 조작 지난 챕터에서는 3인칭 시점으로 플레이어를 바

itadventure.tistory.com

이번에는 약간 더 수정해서 요새 게임쪽에서 많이 활용되는 사이드 뷰를 바라보는 부분을 다뤄보도록 하겠습니다.

플래이어가 우측에 위치하기 때문에 전면 시야가 확보되면서도,
내 플레이어를 큼지막하게 볼 수 있는 장점이 있습니다.

직접 만든거라 성능적인 퍼포먼스는 좀 떨어질수는 있습니다 :)


이를 위해서 원래 설치된 카메라 스크립트를 바꿔치기해야 하는데요.

기존 카메라 스크립트를 삭제할수도 있지만 비활성화할수도 있습니다.
그래서 필요한 경우 원래 스크립트를 다시 활성화하여 사용할 수도 있겠지요.

Hierarchy(하이라치) 창에서 Main Camera 를 선텍하신 다음에,
Inspector(인스펙터) 창에서 Cam Control 스크립트 컴포넌트의 체크상자를 해제해 주세요.
이 것으로 이 카메라 스크립트는 사용이 되지 않습니다.

그리고 카메라 스크립트를 새로 작성합니다.
기존 카메라 스크립트와 다른 이름으로 스크립트를 하나 지어줍시다.

Assets - Scripts 폴더를 선택하신 다음.
우측 빈 공간에서 마우스 우클릭 - Create - C# Script 메뉴 선택,

CamController 라는 이름으로 이름을 지어주신 다음에,

더블클릭, 비주얼 스튜디오 창에서 아래 스크립트 내용을 입력해주세요.
Ctrl + S 단축키로 저장해 주신 다음에,

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

public class CamController : MonoBehaviour
{
    public GameObject player; // 바라볼 플레이어 오브젝트입니다.
    public float xmove = 2;  // X축 누적 이동량
    public float ymove = 25;  // Y축 누적 이동량
    public float distance = 1;

    private Vector3 velocity = Vector3.zero;

    private int toggleView = 3; // 1=1인칭, 3=3인칭

    private float wheelspeed = 10.0f;

    private Vector3 Player_Height;
    private Vector3 Player_Side;

    void Start()
    {
        Player_Height = new Vector3(0, 1.5f, 0f);
        Player_Side = new Vector3(-0.8f, 0f, 0f);
    }

    // Update is called once per frame
    void Update()
    {
        //  마우스 우클릭 중에만 카메라 무빙 적용
        if (Input.GetMouseButton(1))
        {
            xmove += Input.GetAxis("Mouse X"); // 마우스의 좌우 이동량을 xmove 에 누적합니다.
            ymove -= Input.GetAxis("Mouse Y"); // 마우스의 상하 이동량을 ymove 에 누적합니다.
        }
        transform.rotation = Quaternion.Euler(ymove, xmove, 0); // 이동량에 따라 카메라의 바라보는 방향을 조정합니다.

        if (Input.GetMouseButtonDown(2))
            toggleView = 4 - toggleView;

        if (toggleView == 3)
        {
            distance -= Input.GetAxis("Mouse ScrollWheel") * wheelspeed;
            if (distance < 1f) distance = 1f;
            if (distance > 100.0f) distance = 100.0f;
        }

        if (toggleView == 1)
        {
            Vector3 Eye = player.transform.position + Player_Height;
            Vector3 reverseDistance = new Vector3(0.0f, 0.0f, 0.5f); // 카메라가 바라보는 앞방향은 Z 축입니다. 이동량에 따른 Z 축방향의 벡터를 구합니다.
            transform.position = Eye + transform.rotation * reverseDistance; // 플레이어의 위치에서 카메라가 바라보는 방향에 벡터값을 적용한 상대 좌표를 차감합니다.
        }
        else if (toggleView == 3)
        {
            Vector3 Eye = player.transform.position + transform.rotation * Player_Side + Player_Height;
            Vector3 reverseDistance = new Vector3(0.0f, 0.0f, distance); // 카메라가 바라보는 앞방향은 Z 축입니다. 이동량에 따른 Z 축방향의 벡터를 구합니다.
            transform.position = Eye - transform.rotation * reverseDistance;           
        }
    }
}

유니티로 돌아와서 이 스크립트를 Main Camera 에 넣어 줍시다.
3박자로 진행하시면 되는데요. 다시 상기시켜 드리자면,

1) 스크립트를 넣을 오브젝트를 선택합니다. 여기서는 Main Camera 오브젝트가 됩니다.
  참고로 Inspector 창을 미리 맨 아래로 스크롤시켜 놓으면 편리합니다.
2) 이 스크립트를 마우스로 클릭한 다음, 마우스를 놓지 말고
3) Inspector 창의 빈 공간에 스크립트를 드래그합니다. 

이어서 플레이어를 이 스크립트 컴포넌트에서 참조할 수 있도록 속성을 넣어주어야 합니다.

이 때도 Jammo Player 오브젝트를 마우스로 클릭, 마우스를 떼지 말고
( 마우스를 떼는 순간 Inspector 창에는 카메라의 속성이 아닌 Jammo Player 오브젝트의 속성으로 바뀌어 버리기 때문입니다. 혹여라도 바뀐 경우라도, 다시 Main Camera 를 선택후 진행해주시면 됩니다. )
Cam Controller 스크립트 컴포넌트의 Player 속성에 드래그해서 넣어 주셔야 합니다.

이어서 2가지 옵션을 조정해봅시다.
현재 선택된 Main Camera 의 Inspector 창에는 Camera 컴포넌트 내에 Clipping Planes - Near 라는 옵션이 있는데요.
이 값을 0.01로 조정해주세요.

이 수치는 너무 가까운 거리나 너무 먼거리의 물체는 잘려서 보이지 않게 하는 기능입니다.
그런데 근접 거리를 왜 조정하냐구요?

이번 스크립트에는 1인칭 시점 모드 보기 기능도 들어 있는데요.
근접거리를 커팅할 경우 NPC가 아래와 같이 보일 위험성이 있어서입니다.
너무 근접한 거리에 오브젝트가 위치할 경우 잘라서 커팅하기 때문이지요.
호러 가상세계를 만들 일은 없지 않습니까 ? :)

Near 를 0.01로 바꾼 경우는 카메라가 비추는 영역은 아래와 같기 때문에 위와 같은 위험성은 거의 없습니다.

또 하나의 옵션을 조정해 봅시다.
바로 자모 로봇의 속도인데요.
멀리서 볼 떄는 빨라도 컨트롤이 수월하지만 근접거리에서는 사실 컨트롤이 거의 불가합니다.
( 혹시 크레이만 그럴까요.. )

Hierarchy 창에서 Jammo Player 오브젝트을 선택하신 다음에
Inspector 창에서 Movement Input 스크립트 컴포넌트의 Velocity 속성을 5~10정도로 변경해 주세요.

자, 이제 플레이를 시작해봅시다.
처음에는 아래와 같은 화면이 나올텐데요,
자모 로봇이 화면중앙이 아닌 우측에 위치해 있습니다.

이 것은 카메라가 자모로봇 뒷 부분이 아닌 좌측을 비추기 때문입니다.
자모로봇이 이동할 때도 카메라는 계속 이 구도를 유지하며 따라다니는 것이지요.

첫번째 조작법은 3인칭 무빙 컨트롤인데요.
마우스를 우클릭 후 드래그해보시면 다른 방향의 시점을 바라보게 될겁니다.
하늘방향이든 땅 방향이든지간에요.

두번쨰 조작법으로 마우스 중앙 버튼을 한번 클릭하면, 1인칭 시점이 되어 자모로봇 플레이어가 보이지 않게 될텐데요.
한번 더 클릭하면 다시 3인칭 시점으로 변경이 됩니다.

1인칭 시점에서는 카메라가 자모 플레이어의 눈 앞으로 이동하기 떄문에,
플레이어의 모습은 시야에서 사라집니다. 카메라 뒤에 있으니 비추지 않는 것은 당연하지요

세번쨰 조작법은 3인칭 모드에서만 작동하는데요.
마우스 휠을 돌려보면 카메라가 플레이어로부터 가까워 졌다가 멀어졌다 할 것입니다.

거리를 멀리 하니 플레이어가 콩알만하게 보이는군요 :)

이번 스크립트의 내용 영상입니다.

https://www.youtube.com/watch?v=kf7j8invChU 

스크립트 설명은 다음 게시글에 이어서 진행하겠습니다.
필요하신 분에게 도움이 되셨을지요?
오늘도 여기까지 읽어 주셔서 감사합니다 :)


다음 게시글. 3인칭 무빙 카메라 - 사이드 뷰#2. 설명편

https://itadventure.tistory.com/430

 

유니티3D - 3인칭 무빙 카메라 - 사이드 뷰 #2. 설명편

지난 게시글에서는 자모로봇 플레이어의 카메라 조작 방식을 변경하는 부분을 다뤄보았었는데요. https://itadventure.tistory.com/429 유니티3D - 3인칭 무빙 카메라 - 사이드 뷰 #1 지난 시간까지는 NPC와

itadventure.tistory.com

 

반응형