https://www.youtube.com/watch?v=WkMM7Uu2AoA&list=PLO-mt5Iu5TeYkrBzWKuTCl6IUm_bA6BKy&index=1
1. 준비하기
3D Project생성 후 상단바 Window > Package Manager에서 에셋 패키지를 Improt하기
2. 지형 만들기
3D Object > Cube 로 땅 만들기
●이때 색이 어둡다면 빛이 켜져있는지 확인 Window > Rendering > Lightning 에서 Generate Lightning 클릭
Cube의 Scale을 조절하여 지형 생성
Cube를 생성 후 조절해 벽 4개 생성
오브젝트 복사 : Ctrl + D
안쪽 벽을 안보이게 하기 위해 안쪽 벽의 Mesh Renderer 해제
●Mesh Renderer : 눈에 보여지게 하는 렌더러
Material 폴더 생성 후 안에 Plane 이름의 Material 생성
Albedo 옆 원을 눌러 텍스쳐 이미지 선택(Tile)
●문제 : 타일 하나가 바닥을 다 차지 함
●방법 : Tiling 숫자를 늘려서(10) 텍스쳐를 타일형태로 배치한다.
3. 플레이어 만들기
●프리펩 : 게임 오브젝트를 에셋으로 보관한 형태
플레이어 프리팹을 하이어라이키로 드래그
●플레이어에게 필요한 컴포넌트 : Collider + Rigidbody + Script
Rigidbody 추가
Capsule Collider 추가
Capsule Collder의 Center값 조절
●이떄 마우스를 가져다 대고 누른채로 드래그로 수치를 조절할 수 있다.
Script 폴더 생성 후 Player이름의 Script 생성
4. 기본 이동 구현
◆Input Axis 값을 받을 전역변수 선언
public class Player : MonoBehaviour
{
public float speed;
float hAxis;
float vAxis;
}
●speed는 유니티에서 조절을 위해 public 선언
●비 선언시 private
◆키보드 마우스 입력을 확인
void Update()
{
hAxis = Input.GetAxisRaw("Horizontal");
vAxis = Input.GetAxisRaw("Vertical");
moveVec = new Vector3(hAxis, 0, vAxis).normalized;
transform.position += moveVec * speed * Time.deltaTime;
}
●GetAxisRaw : Axis 값을 정수로 반환하는 함수
●Horizontal과 Vertical은 Edit > Project Setings > Input Manager에 정의되어 있다.
●normalized : 방향 값이 1로 보정된 벡터 (대각선 이동 속도 균일화)
●transform 이동은 꼭 Time.deltaTime을 곱할것
관성에 의한 쓰러짐은 Rigidbody Freeze Rotation (x,z)으로 해결
Transform 이동은 물리 충돌을 무시하는 경우가 발생
▷FixedUpdate와 Udate의 프레임이 다른데
▷충돌 판정은 FixedUpdate에서 실행되고 플레이어는 Udate기준으로 이동한다.
▷따라서 Rigidbody의 Collision Detection을 Continuous로 변경 해주어 해결한다.
▷▷CPU 성능을 써서 활발한 물리적 충돌 감지를 늘려준다는데... 잘 모르겠다... 나는 여전히 뚫고 지나간다.
5. 애니메이션
애니메이션 폴더 생성 후 Animator Controller, Player 생성
Player의 자식 Mesh Object에 Animator을 할당합니다.
Models 폴더에 Player.FBX 에서 Idle, Run, Walk 드래그 드랍
▷.FBX : 각종 정보들이 구분되어 저장되는 3D 포맷
MakeTransition 쌍방향 연결
bool 타입 Prameter, isRun, isWalk 생성
파라메터를 Condition에 사용하여 Transition완성하기
(Exit TIme 체크해제, Transition Duration 0.1 설정)
(파라미터는 각 상황에 맞게 설정)
◆스크립트에 애니메이션 설정
public class Player : MonoBehaviour
{
...
Animator anim;
void Awake()
{
anim = GetComponentInChildren<Animator>();
}
void FixedUpdate()
{
...
anim.SetBool("isRun", moveVec != Vector3.zero)
...
}
}
●GetComponentInChilder<Animator>() : 자식에서 <Animator>를 할당.
●SetBool("변수",값) : 애니메이션 파라메터 값 설정
◆Shift를 눌렀을 때를 구현
▷Input Manager에서 사이즈를 늘리고 늘어난 항목을 Name : Walk , Positive Button : left shift 로 설정 Alt positive 삭제
public class Player : MonoBehaviour
{
...
bool wDown;
...
void FixedUpdate()
{
...
moveVec = new Vector3(hAxis, 0, vAxis).normalized;
transform.position += moveVec * speed * (wDown ? 0.3f : 1f) * Time.deltaTime;
anim.SetBool("isRun", moveVec != Vector3.zero);
anim.SetBool("isWalk", wDown);
...
}
}
●삼항연산자 : 조건문 ? (true일 때 값) : (false일 때 값)
6. 기본 회전 구현
public class Player : MonoBehaviour
{
void FixedUpdate()
{
...
transform.LookAt(transform.position + moveVec);
...
}
}
●LookAt : 지정된 벡터를 향해서 회전시켜주는 함수 (Transform, Vector3 사용 가능)
7. 카메라 이동
쿼터뷰 느낌이 나도록 마케라 위치, 회전 변경
◆카메라 이동을 위한 스크립트 Follow 생성
=public class Follow : MonoBehaviour
{
public Transform target;
public Vector3 offset;
void Update()
{
transform.position = target.position + offset;
}
}
●따라갈 목표와 위치 오프셋을 public 변수로 선언
●target에 Player 드래그 드랍, 유니티에서 offset 설정
8. 느낌 살리기
Create Empty > WorldSpace 안에 바닥과 벾을 자식으로 넣고 45도 회전
원하는 벽과 오프셋 설정
깃허브 올리기
Commit : ver 1.15
Description : Sound System
https://github.com/mekain80/CloneCode_GoldMetal3D
'게임개발 > 3D_골드메탈_클론코딩' 카테고리의 다른 글
[클론코딩_골드메탈_3D] 5. 아이템 먹기 & 공전물체 만들기 (0) | 2023.07.15 |
---|---|
[클론코딩_골드메탈_3D] 4. 드랍 무기 입수와 교체 (0) | 2023.07.07 |
[클론코딩_골드메탈_3D] 3. 아이템 만들기 (0) | 2023.07.07 |
[클론코딩_골드메탈_3D] 2. 플레이어 점프와 회피 (0) | 2023.07.07 |