본문 바로가기
3D 콘텐츠 제작/[위저드 히어로] 제작 일지

[위저드 히어로 01] 플레이어 이동 및 카메라 조정

by 잰쟁 2023. 9. 24.
728x90

 

1. 플레이어 이동

 

 

 

다운 받은 에셋들 중에서 프리팹을 지정하여 게임씬으로 가져온 후 Player 스크립트 부착하기

스크립트 전반을 관리할 Main 오브젝트와 스크립트 생성하기

 

 

 

- Player이동을 위해

Player, Main 스크립트 아래와 같이 작성

 

 

Player 스크립트

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

public class Player : MonoBehaviour
{
    //private Vector3 inputVec;
    private Animator anim;
    public float speed = 5f;

    void Awake()
    {
        this.anim = this.GetComponent<Animator>();
    }

    //이동 메서드
    public void Move(Vector3 dir)
    {
        //애니메이션
        this.anim.SetInteger("State", 1);
        //이동하기
        this.transform.Translate(Vector3.forward * this.speed * Time.deltaTime);
        //회전하기
        float angle = Mathf.Atan2(dir.x, dir.z) * Mathf.Rad2Deg;
        this.transform.localRotation = Quaternion.AngleAxis(angle, Vector3.up);
    }

    //정지 메서드
    public void Idle()
    {
        this.anim.SetInteger("State", 0);
    }
}

 

Main 스크립트

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

public class Main : MonoBehaviour
{
    [SerializeField]
    private Player player;

    void Start()
    {
        
    }

    void Update()
    {
        float x = Input.GetAxisRaw("Horizontal");
        float v = Input.GetAxisRaw("Vertical");
        Vector3 dir = new Vector3(x, 0, v).normalized;

        if(dir != Vector3.zero)
        {
            this.player.Move(dir);
        }
        else
        {
            this.player.Idle();
        }
    }
}

 


 

 

2. 카메라 지정

: Cinemachine 사용!

 

**Cinemachine : 코딩 없이 카메라의 움직임을 손쉽게 제어할 수 있는 유니티 패키지.

 

 

Window -> Package Manager -> Cinemachine 다운

 

 

- Hierarchy -> Cinemachine -> Virtual Camera 선택하여 추가

 

 

- Main Camera에 자동적으로 'CinemachineBrain'이 부착됨!

 

( **CinemachineBrain : 씬에 있는 액티브 가상 카메라를 모두 모니터링 함.)

 

 


 

 

카메라 위치 지정해주기

 

 

- Virtual Camera에서 아래와 같이 설정해주기

 

**Follow : 가상 카메라가 함께 따라 이동할 게임 오브젝트를 지정

**Vertical FOV : 타겟과의 거리 지정

 

 

결과

 

 

 


 

 

 

3. 조이스틱으로 Player 이동시키기

 

 

처음 방법

 

Window -> Input System -> Samples에 들어가서

 

On-Screen Controls를 설치후 거기의 'Stick' 이라는 프리팹을 조이스틱에 부착하여 사용했는데

자꾸 이동이 되지 않는 오류가 발생하였다

 

 


 

 

수정 방법

 

Window -> Package Manager -> 'Input System' 설치

 

Project -> Input Actions 추가 후 이름을 'Player'로 저장 

 

'Player' Input Action에 아래와 같이 설정

 

 

Player에 'Player Input' 추가한 후 아래와 같이 설정

(설정한 Scheme가 Mobile만 있으므로 그냥 Any로 설정함.

Auto-Switch도 마찬가지인 이유로 켜도 되지만 꺼둠.)

 


 

조이스틱 생성하기

 

 

UI -> Image를 생성하고 적당한 조이스틱 스프라이트를 부착후 

'On-Screen Stick' 컴포넌트를 추가한 후 아래와 같이 설정해준다.

(위의 사진처럼 Player Input Action - Move를 'Left Stick[Gamepad]'로 설정했으므로 똑같이 설정)

 

 

 

 


 

 

Player 스크립트 생성 후 아래와 같이 작성

 

 

InputSystem을 사용하기 위해 네임스페이스에 아래와 같이 추가!

using UnityEngine.InputSystem;

 

 

Player 스크립트

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


public class Player : MonoBehaviour
{
    private Vector3 dir;
    public float speed;
    private Animator anim;


    private void Awake()
    {
        this.anim = this.GetComponent<Animator>();
    }

    void Update()
    {
        if(dir != Vector3.zero)
        {
            //이동
            this.transform.Translate(Vector3.forward * this.speed * Time.deltaTime);
            //회전
            this.transform.rotation = Quaternion.LookRotation(dir);
            //이동 애니메이션
            this.anim.SetInteger("State", 1);
        }
        else
        {
            //정지 애니메이션
            this.anim.SetInteger("State", 0);
        }
    }

    //Input Action에 설정해둔 Action으로 이동하게 함
    void OnMove(InputValue value)
    {
        Vector2 input = value.Get<Vector2>();

        //value가 0이 아니면 (input값을 받고 있다면)
        if (value != null) 
        {
            //Vector2 값을 Vector3로 변환
            dir = new Vector3(input.x,0,input.y);
            Debug.Log(dir);
        }
    }
}

 

 

 

실행 결과