새소식

🎮 Game Dev (게임개발)/PC (데스크탑, 노트북, 터치패널)

[3D 액션게임] 01.플레이어 이동

  • -

🔔 유튜브 크리에이터 골든메탈님의 유니티강의 3D 쿼터뷰 액션게임 [BE5] 를 보고 공부하여 작성한 게시글입니다! 🔔

🧷 00. 게임을 만들기에 앞서

더보기
귀여운 주인공

게임을 만들기 쉽게 재료들을 만들어서 공유해주시고 유튜브에 강의도 올려주신 크리에이터분께 정말 감사드립니다.  3D로 된 게임을 만들어 본다는 것에 설렘에 부푼 마음을 안고, 강의를 따라가며 게임을 만들어 보며 저의 실력이 점점 커지는 것을 느끼기 위해 모르는 것 없이 정확하게 알아가며 따라해 볼 심산입니다.  이후에는 이 게임을 어떻게 내가 변화할 수 있을까를 구상해본 결과 네트워킹까지 연결 하여 친구들을 초대하여 나만의 게임으로 다시 재탄생 시킬까 합니다. 그리고 제가 다른 분들의 블로그들을 통해 도움을 받는 만큼 제 글을 보면서 다른 분들도 도움이 되어 가면 좋겠고, 피드백 남겨주시면 감사하겠습니다.

 

 

🧷 01. 에셋 준비

📦 에셋 스토어 : http://u3d.as/2mLK

 

1. 위 링크를 타고 들어가 내 에셋추가하기 누릅니다.

2. 유니티로 돌아와, Window- Package Manager - Packages:My Assets - Import 클릭 해줍시다!

 

 

🧷 02. 플레이어 기본 설정

 

- 기본 바닥, 벽 추가

 

  • Cube로 내가 원하는 바닥, 벽 생성
  • 새로만든 Material에 Tile Textures을 추가,  Material의 Albedo 옆 작은 쌍동그라미 클릭 후 _Tile Texture 선택 후 원하는 색상 선택 (저는 밝은 연녹색 느낌으로 D7F3A7을 골랐습니다.)
  • 쿼터뷰 느낌을 주기 위해 카메라가 등진 방향 Mesh Renderer 해제

 

- 플레이어 기본 설정

 

: 플레이어는 " Assets/QuarterView 3D Action BE5/Prefabs/Player.prefab " 에서 옮겨줍니다.

 

 

 

  • Rigidbody(물리효과)- Capsule Collider(충돌체)- Script(로직, 뇌) 플레이어 생성시 가장 중요한 이 세가지를 추가시켜줍시다.
  • Rigidbody의 Collision Detection을 Continuous로 바꿨습니다.
  • Rigidbody - Constraints - Freeze Rotation X, Z 설정 (관성에 대한 쓰러짐을 방지하기 위해)

벽의 물리충돌은 fixed update여서 플레이어의 update transform 이동과 프레임률이 달라서 무시되는 경우가 있어서

player rigidbody의 collsion detection을 continuous로 올려줍니다(cpu 더 쓰긴합니다).

 

근데 아직도 플레이어가 뚫고 가더군요,, 아마 이부분은 다시 찾아봐야할듯 합니다.

 

  • 캡슐처럼 생긴 귀여운 주인공이기에 Capsual Collider의 범위를 설정해줍시다.

 

 

- 플레이어 이동

 

: 플레이어의 스크립트에 이동 기능을 넣어봅시다!

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

public class Player : MonoBehaviour
{
    public float speed;
    float hAxis;
    float vAxis;
    Vector3 moveVec;

    void Update()
    {
        // 키보드입력에 따라 0 ~ 1로 변환 left right up down
        hAxis = Input.GetAxisRaw("Horizontal"); 
        vAxis = Input.GetAxisRaw("Vertical");
        
        // x y z
        moveVec = new Vector3(hAxis, 0, vAxis).normalized;

        // transform
        transform.position += moveVec * speed * Time.deltaTime;
        
        
        transform.LookAt(transform.position + moveVec);
    }
}

 

  • Input.GetAxisRaw() : 키보드 입력값이 들어갈 때 정수로 변환

안의 키보드 변수값은 Edit - project Settings - Input manager에서 변경할 수 있습니다.

"Horizontal" : left right , "Vertical" :  up down

 

  • Vector3(x, y, z).normalized : 보정으로 대각선 이동시에도 같은 속도
  • transform.position = 벡터값 * 속도 * 델타타임, 실제 오브젝트 위치

Time.deltaTime을 꼭 넣어줘서 프레임보정을 해줍시다!

 

 

- 플레이어 회전

 

  • LookAt 함수를 써서 회전을 편하게 해봅시다.
transform.LookAt(transform.position + moveVec);

 

 

🧷 03. 플레이어 애니메이션

 

- 애니메이션 추가하기!

: 플레이어에 애니메이션 컨트롤러를 추가해봅시다!

 

  • player 오브젝트 속 자식오브젝트인 Mesh Object에 animator를 넣어줍니다. (Animator Controller은 새로 만들었습니다.)

Animator

왜 Mesh Object인지는 일단은 강의를 더 진행해가봐야 알듯 하지만 Mesh Object(자식 오브젝트) 로컬 영역이고 GameObject(부모)는 월드 기준에서 변경된다고 하네요.

 

  • animator controller에 자세들을 넣습니다.

 

: Assets/QuarterView 3D Action BE5/Models/Simple Player.fbx 경로의 Idel(기본자세), Walk, Run을 끄집어 연결시켜줍니다. (.FBX : 3D 포맷들의 각종 정보들이 있는 집합체)

 

  • 각 애니메이션의 Transition을 설정합니다. (우클릭 Make Transition)

: Parameters로 Bool 변수의 isWalk, isRun 추가 후, 각 애니메이션 conditions에 맞게 설정

Has Exit Time 체크 해제 (현재 동작에서 빠져나가는 시간)

Transition Duration 0.1 로 설정

 

그리고 애니메이션 속도를 자기 입맛대로 바꿔줍시다~

 

- 애니메이션 연결하기

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

public class Player : MonoBehaviour
{
    public float speed;
    float hAxis;
    float vAxis;
    bool rDown;
    Vector3 moveVec;

    Animator anim;

    void Awake()
    {
        anim = GetComponentInChildren<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        // 키보드입력에 따라 0 ~ 1로 변환 left right up down
        hAxis = Input.GetAxisRaw("Horizontal"); 
        vAxis = Input.GetAxisRaw("Vertical");
        rDown = Input.GetButton("Run");
        // x y z
        moveVec = new Vector3(hAxis, 0, vAxis).normalized;

        // transform
        transform.position += moveVec * (rDown ? 1.3f : 1f) * speed * Time.deltaTime;

        // animator
        anim.SetBool("isWalk", moveVec != Vector3.zero);
        anim.SetBool("isRun", rDown);

        // Rotation
        transform.LookAt(transform.position + moveVec);
    }
}
  • rDown은 키보드 입력 받기위해 Edit - Project Setting - Input Manger 에서 Run 을 하나 추가해줍니다.
  • rDown을 통해 걸을때는 1f 속도, 뛸때는 1.3f를 해줍니다.
  • 플레이어의 animator을 받아오기 위해 GetComponentInChildren<Animator>() 가져옵시다.  (Object의 Mesh Object에서 받아오는 것이기 때문에 플레이어 자식에서 받아와야합니다)
  • animator의 isWalk, isRun 입력 조건을 설정해줍시다.

 

🧷 04. 카메라 이동

 

- 메인 카메라 스크립트 추가

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

public class Follow : MonoBehaviour
{
    public Transform target;
    public Vector3 offset;

    void Update()
    {
        transform.position = target.position + offset;
    }
}

 

 

 

- Target에 플레이어 넣고 입맛따라 Offset 변경

 

 

 

 

 

출처: 골든메탈님 유튜브

https://www.youtube.com/watch?v=WkMM7Uu2AoA&list=PLO-mt5Iu5TeYkrBzWKuTCl6IUm_bA6BKy 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.