본문 바로가기
유니티3D

유니티3D(Unity3D) 플레이어 조작 #1

반응형

지난 시간의 중력#2에 이어 이번에는 플레이어 조작에 대해 다루어 보도록 하겠습니다.

itadventure.tistory.com/394

 

유니티3D(Unity3D) - 중력#2

지난 챕터에서는 물체의 중력에 대해 알아보았습니다 itadventure.tistory.com/393 유니티3D(Unity3D) 중력#1 지난 시간에는 유니티3D 1인칭 시점 조작 #2 에 대해 다루어 보았습니다 itadventure.tistory.com/390..

itadventure.tistory.com

지난 시간에 다루었던 리지바디 컴포넌트는 물리적인 움직임이 필요한 사물에는 적합하지만
캐릭터의 안정적인 이동 목적에는 그리 적합하지 않은데요.

그보다는 유니티3D는 '캐릭터 컨트롤러'라는 컴포넌트가 있습니다.
이 캐릭터 컨트롤러는 가상공간에서 보통 플레이어 캐릭터로 많이 사용되기도 하지만,
NPC 로 사용될 수도 있습니다.

지난번에 다루었던 1인칭 시점 조작과 상반된 개념인데요.

itadventure.tistory.com/390

 

유니티3D(Unity3D) 1인칭 시점 조작 #2

이번 시간에는 지난 시간에 이어 1인칭 시점 조작의 이동편에 대해 다루어 보겠습니다. 3D 가상공간에서 1인칭 시점으로 거리를 걷는 것은 현실과 아주 유사합니다. 만일 내가 바라보는 방향이

itadventure.tistory.com

카메라는 가만히 있고 키보드로 플레이어 물체의 이동을 조작하는 것입니다.
다만 이 컴포넌트를 그냥 물체에 적용한다고 물체를 바로 조작할수 있는 것은 아닙니다.
그래서 약간의 스크립트가 추가되어야 합니다.

캐릭터 컴포넌트 없이 스크립트만 가지고 제어한다면, 글쎄요..
가능하긴 하겠지만, 경사진 오르막길을 올라가는 등의 행동은 힘들겁니다.
캐릭터 컴포넌트는 관련 기능이 이미 들어 있거든요.

자, 들어가보실까요?


1. 유니티를 실행, 3D 프로젝트를 선택하여 생성합니다.

 

2. GameObject - 3D Object - Cube 를 선택하여 큐브를 생성, 속성을 적용합니다.  
  총 3개의 큐브를 만들어 각각 아래와 같이 적용해 주세요.

Scene 창에서의 결과 화면은 아래와 같으실 겁니다.
제일 위에 있는 큐브는 플레이어로 사용할 거라 날씬하게 했습니다 :)

3. 이제 제일 위에 있는 물체에 캐릭터 컴포넌트를 적용할 겁니다.
해당 물체가 선택된 상태에서 Inspector 창을 맨 아래쪽으로 스크롤시킨 후,
Add Component - Physics - Character Controller 컴포넌트를 선택해 주세요.

그리고 바로 위에 있는 Box collider 를 삭제해줍니다.
캐릭터 컴포넌트가 적용되면 박스 충돌체크는 필요가 없기 때문입니다.

이제 이 물체는 캐릭터 컨트롤러 컴포넌트가 적용되었습니다만,
이 자체로는 아무런 작동을 하지 않습니다.

이는 캐릭터가 준비가 된 것뿐이지 이를 제어할 수단은 전혀 없기 때문인데요.

4. 키보드로 이 물체를 조작하는 스크립트를 작성해보겠습니다.
프로젝트 창에서 아셋 폴더 부분을 마우스 우클릭, Create - Folder 를 선택하여 Scripts 폴더를 만들어 주세요.

그리고 생성된 Scripts 폴더를 선택하고 오른쪽 빈 공간에서 마우스 우클릭, Create - C# Script 를 선택,
이름은 PlayerController 로 지어 줍니다.

결과화면은 아래와 같습니다.

스크립트를 더블클릭하여 비주얼 스튜디오를 실행한 다음 아래와 같이 스크립트 내용을 넣어 주세요.
유니티에서 비주얼 스튜디오 사용에 대한 안내는 아래에 간단히 나와 있습니다.

itadventure.tistory.com/389

 

유니티3D(Unity3D) 1인칭 시점 조작 #1

현실에서 우리는 거울이나 또는 반사 물체를 통하지 않고는 나의 모습을 볼 수가 없습니다. 내가 볼 수 있는 것은 나의 눈을 통해 보여지는 사물들 뿐이지요. 가상공간 또한 나의 눈을 통해 보듯

itadventure.tistory.com

스크립트 내용은 아래와 같습니다.

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

public class PlayerController : MonoBehaviour
{
    public CharacterController SelectPlayer; // 제어할 캐릭터 컨트롤러
    public float Speed;  // 이동속도
    private float Gravity; // 중력   
    private Vector3 MoveDir; // 캐릭터의 움직이는 방향.

    // Start is called before the first frame update
    void Start()
    {
        // 기본값
        Speed = 5.0f;
        Gravity = 10.0f;
        MoveDir = Vector3.zero;
    }

    // Update is called once per frame
    void Update()
    {
        if (SelectPlayer == null) return;
        // 캐릭터가 바닥에 붙어 있는 경우만 작동합니다.
        // 캐릭터가 바닥에 붙어 있지 않다면 바닥으로 추락하고 있는 중이므로
        // 바닥 추락 도중에는 방향 전환을 할 수 없기 때문입니다.
        if (SelectPlayer.isGrounded)
        {
            // 키보드에 따른 X, Z 축 이동방향을 새로 결정합니다.
            MoveDir = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
            // 오브젝트가 바라보는 앞방향으로 이동방향을 돌려서 조정합니다.
            MoveDir = SelectPlayer.transform.TransformDirection(MoveDir);
            // 속도를 곱해서 적용합니다.
            MoveDir *= Speed;
        }
        // 캐릭터가 바닥에 붙어 있지 않다면
        else
        {
            // 중력의 영향을 받아 아래쪽으로 하강합니다.
            // 이 때 바닥에 닿을 떄까지 -y값이 계속 더해져서 마치 중력가속돠 붙은 것처럼 작용합니다.
            MoveDir.y -= Gravity * Time.deltaTime;
        }
        // 앞 단계까지는 캐릭터가 이동할 방향만 결정하였으며,
        // 실제 캐릭터의 이동은 여기서 담당합니다.
        SelectPlayer.Move(MoveDir * Time.deltaTime);
    }
}

 

파일을 저장해 주신 다음에, 다시 유니티로 돌아옵니다.
비주얼 스튜디오 창을 여는데 시간이 오래 걸리기 때문에 작업이 끝나기 전까지 비주얼 스튜디오 창은 닫지 않는 것을 추천합니다.

지금 생성한 이 스크립트는 아셋 창에 있는데 아셋 창에서는 스크립트가 작동하지 않습니다.
그러니 꼭 Scene 에 있는 물체에 스크립트를 적용해야 합니다.
직접 플레이어 물체에 적용하는 방식과, 별도의 조작전용 물체를 만드는 방법이 있는데,
이번 시간에는 전자에 대해 다룹니다.

플레이어로 사용할 목적의 물체를 선택, 
Inspector 창을 맨 아래로 스크롤하고 금방 만든 스크립트를 드래그해 넣습니다.
스크립트를 직접 물체에 드래그해도 됩니다.
다만, 그렇게 할 경우 실수로 스크립트가 2번 드래그하는 경우가 있어 컴포넌트가 2번 적용될 수 있습니다.
예상치 못한 결과를 가져올 수 있습니다.

 

마지막으로 Inspector창에서 추가된 컴포넌트의 SelectPlayer 우측의 동그라미를 선택, 

플레이어로 사용할 물체를 선택해 주세요.

이제 플레이를 시작하시면, 키보드로 물체를 조작해서 이동할 수 있으며 오르막길도 문제없이 올라갑니다.

오른쪽으로 계속 이동하면 하단 큐브에 딱 착지합니다.

이는 캐릭터 컨트롤러와 스크립트의 합작품인데요.
소스에 상세하게 주석을 달아 놓았으니 관련 부분을 참조하시면 도움이 되실 것 같습니다.

참고로 캐릭터가 언덕을 올라가는 부분은 스크립트에서 이동방향만 지시하면,
캐릭터 컨트롤러가 알아서 처리하는 부분이며,
캐릭터가 땅에 닿아 있는지 판단하는 부분 역시 캐릭터 컨트롤러에서 지원하는 기능입니다.

다음 시간에는 플레이어 캐릭터의 점프에 대해 살펴보겠습니다.

필요하신 분께 도움이 되셨을지 모르겠습니다 :)
오늘도 여기까지 읽어 주셔서 감사합니다.


인간의 지혜는 한계가 있으나 하나님께 의지하는 사람은 허락하심 속에 무한의 지혜를 얻을 것입니다 :)

깊도다 하나님의 지혜와 지식의 부요함이여
그의 판단은 측량치 못할 것이며
그의 길은 찾지 못할 것이로다

롬11:33


다음 챕터 플레이어 조작#2

itadventure.tistory.com/396

 

유니티3D 플레이어 조작 #2.점프와 행글라이더

행글라이더를 타본 적이 있으신가요? 크레이는 타본 적이 없습니다. 위험해서 아무나 할건 못되고 체력도 받쳐주어야 가능한 일이지 않습니까? 도전해서 안될건 없지만 크레이는 그쪽은 적성이

itadventure.tistory.com

 

반응형