Unity_Metaverse

[Unity] 플레이어 만들고, 오브젝트 이동시키기 (키보드 입력 값)

channnnii 2022. 6. 22. 16:07

플레이어 만들기

Hierarchy에서 우클릭을 한 후, 3D 오브젝트 추가하기  →   이름은 "Capsule" 에서 "Player"로 수정합니다.

 

 view를 보면, 캡슐이 바닥 아래로 내려가 있는 것을 볼 수 있습니다.

 

따라서 Transform의 포지션 y값을 수정해줍니다.

→  캡슐러의 기본 크기는 2m이므로, 반틈을 더 올리기 위해 +1

 

 

 

 

 

 

수정한 후의 모습!!

 

 

 

 

 

 

 

 

 

 

C# 스크립트 컴포넌트 

컴포넌트란, 인스펙트(Inspector) 뷰의 모든 항목들을 말합니다.

사운드, 물리법칙, 콜리더, 트랜스폼, 스크립트 등 다양한 컨포넌트가 있습니다.

unity에서 3D오브젝트가 어떤 컴포넌트를 가지고 있느냐에 따라 기능이라 역할이 달라질 수 있습니다.

 

먼저 Project뷰에 Script 폴더를 하나 만들어주고, 안에 Control C# 스크립트를 만들어줍니다.

 public class Control : MonoBehaviour{  } 에서

class 이름이 unity에 만들어줬던 스크립트 파일의

이름과 동일한지 확인해주기!!

 

 

 

 

 

 

 

 

 

 

게임 오브젝트 이동 

public class Control : MonoBehaviour
{
    private float h = 0.0f;
    private float v = 0.0f;
    private float moveSpeed = 10.0f;
    private Transform playerTr;
    // Start is called before the first frame update
    void Start()
    {
    	playerTr = GetComponent<Transform>();
    }
    // Update is called once per frame
    void Update()
    {
        h = Input.GetAxis("Horizontal");
        v = Input.GetAxis("Vertical");
        Debug.Log("H:" + h.ToString() + ",V:" + v.ToString());
    }
}

1. Player 3D 오브젝트를 이동시키기 위해서 h, v 두 개의 변수를 사용합니다.

    1) private float h = 0.0f;

    2) private float v = 0.0f;

 

2. moveSpeed는 "Player"가 이동하는 속도입니다.

    1.0f값이 천천히 걷는 속도이고, 10.0f는 뛰어가는 속도입니다.

 

3. 트랜스폼을 저장할 변수  →   private Transform playerTr;

 

4. 게임 오브젝트 이동 준비.

    Start( )함수는 해당 스크립트가 연결된 3D 오브젝트가 씬뷰에 등장 후 처음 한번 실행되는 함수 입니다.

    playerTr = GetComponent<Transform>( );  는,

    연동되어 있는 3D 오브젝트의 트랜스폼의 백터 정보(위치, 회전, 크기)를 가져와 "playerTr" 변수에 저장합니다.

 

     Update( )함수게임 화면이 새로 그려질 때마다 실행되는 유니티 이벤트 메소드입니다.

      h = Input.GetAxis("Horizontal");
      v = Input.GetAxis("Vertical");
      Debug.Log("H:" + h.ToString() + ",V:" + v.ToString());  에서

 

      input은 유니티에서 입력장치 정보를 관리하는 클래스입니다.

      GetAxis( )함수를 사용해서 입력값을 인자 값으로 호출하면 해당 입력 값을 받아올 수 있습니다.

 

5. Hierarchi 뷰에서 "player"의 인스펙트 뷰에 "Control" 스크립트를 드래그해서 추가해줍니다.

 

6. 게임오브젝트 이동

void Update()
{
    h = Input.GetAxis("Horizontal");
    v = Input.GetAxis("Vertical");
    Debug.Log("H : " + h.ToString() + "V : " + v.ToString());
    playerTr.Translate(new Vector3(h, 0, v) * moveSpeed * Time.deltaTime);
}

마지막 줄의   playerTr.Translate(new Vector3(h, 0, v) * moveSpeed * Time.deltaTime);

  1) playerTr : 이동시킬 3d오브젝트 대상

  2) Translate : Translate(이동할 벡터 좌표 * 속도 * 프레임 사이의 시간)로써 자연스럽에 이동시켜 주는 역할을 합니다.

 

7. 실행해보면 "Player" 오브젝트가 자연스럽게 이동하는 것을 볼 수 있습니다.

 

 

 

컴포넌트 캐시 처리

Update 함수는 매 프레임마다 한 번씩 호출되는 함수로서 항상 최적화에 주의를 기울여야 합니다.

예를들어 게임이 실행되는 디바이스가 30프레임일 경우, Update 함수는 1초에 30번이 호출됩니다.

 따라서 조금이라도 부하가 걸리는 함수 또는 잘못된 로직은 자제해야 합니다.

 

특히 이동 로직은 Tansform 컴포넌트의 position 속성을 조금씩 변경하는 것으로 매 프레임마다 Transform 컴포넌트에 접근하는 방식은 바람직하지 않습니다.

 

따라서 Update 함수에서 접근해야 할 컴포넌트는 Awake 함수나 Start 함수에서 미리 함수를 할당한 후 Update에서 사용하길 권장합니다.

 

 

키보드 입력값 받기

 

상단 메뉴의 editor 에서

Project Settings에서 input!!