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