[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 3회차 미션 시작합니다.
이제 본격적인 유니티 게임 제작에 들어갑니다.
우왓 첫 시작이 디아블로입니다 ^^~ 자..잘.. 따라갈 수 있겠지요!?!?
우선 전체 진행 과정이 3단계로 나누어 정리되어 있습니다.
STEP 1 - 캐릭터 시스템
+ 사용자 입력
+ 캐릭터 이동
+ 애니메이션 설정
+ AI: AI는 유니티의 길찾기 및 상태머신을 구현.
+ 전투 시스템
STEP 2 - 레벨 디자인
+ 환경시스템
+ 광원 설정: 라이트 프로브, 리플렉션 프루브로 조명 기능 확장 예정..
+ 함정 이벤트 트리거
+ 퍼즐 이벤트 트리거
- 퀘스트에 따라 동적 네비게이션 처리에 대해서도 알아볼 예정.
STEP 3 - 게임 시스템 구현
+ 유지 인터페이스
+ 인벤토리 시스템
+ 상점 시스템
+ 퀘스트 시스템
선행 학습 요구 사항이 있습니다.
+ Unity 엔진에 대한 기본 사용 이해도
+ C#에 대한 기본 이해도
+ 게임 수학에 대한 기초 이해도
C#과 게임 수학은 이해하고 있지만, Unity 엔진에 대해서는 거의 초보 수준인데.. 게임 개발 교육 시작에서 기본 사용 이해도가 있어야 한다고 나옵니다 ㅠ.ㅜ; 기초 Unity 교육을 듣고 올걸 그랬나 싶지만.. 다른 기초 교육에서는 Unity 보다는 C# 등의 내용이 많다는 글을 보았었고 그래서 바로 넘어온 기억이 떠오릅니다.. 역시 열심히 따라가는 방법밖에는.. ㅋㅋ
오늘 진행 교육은 기본적인 사용자 입력과 캐릭터 이동입니다.
플레이어 캐릭터 구현하기
여러가지 방법이 있는데 각각 알아보고 RPG 게임에 맞는 캐릭터 구현을 선정하여 진행합니다.
RIGIDBODY: 게임 오브젝트를 물리엔진에서 제어하도록 하는 컴포넌트.입니다.
오브젝트에 가해진 힘에 의해서 계산됩니다. 충돌 처리를 위해 게임 클라이더 추가하여 처리할 것입니다.
+ RigidBody를 사용하는 이유: 실제 게임에서는 과장된 표현이 많아 RigidBody가 사용안되는 경우도 많지만
일단 기본적으로 물리엔진을 경험해보고 기본적인 템플릿을 만들어 보기 위한 것입니다.
+ RigidBodyCharacter 설정하기
+ RigidBodyCharacter.cs 구현하기
RigidBody를 이용한 Character GameObject 구성.
1. Capsule Mesh: 캐릭터 UI 추가.
2. RigidBody Component: 물리엔진 사용.
3. Capsule Collider: 출동 연산을 위해 추가.
4. RigidBodyCharacter.cs: 사용자 입력 및 이동 처리
Unity
갑자기 등장한 SC_RigidBodyCharacter 프로젝트!!! 헉 어쩌어쩌지.. 미리 구성해 놓은 것이라고 하시는데...
교육 자료를 찾아봐도 없고 어떻게 배치해야할지도 모르겠습니다 ㅠ.,ㅜ; 같이 따라 만들 수 있게 맞는 자료가 있었으면 좋았겠습니다. 그래도 캐릭터 이동 구현이므로 이해하는데 지장은 없을 것 같습니다.
뒤로 가면 갈수록 어려워질텐데 더 복잡한 에셋들을 사용할 때에도 찾아보기 어려울까 걱정되긴 합니다.
Layer Ground 및 계단과 Terrain이 추가된 상태로 시작합니다. Terrain 설정은 추후 다른 강의로 설명하신답니다.
1. Hierarchy에서 "Create Empty"하여 비어있는 "GameObject"를 추가합니다.
2. Inspecter에서 해당 오브젝트에 "Capsule Collider"를 "Add Component" 해줍니다.
3. Hierarchy에서 "GameObject"의 자식으로 "3D Object - Capsule" 오브젝트를 추가하고, 부모 "GameObject"의 이름을 "RigidBodyCharacter"로 변경합니다.
4. Hierarchy에서 "Capsule"을 선택하고, Inspect에서 "Capsule Collider" 우클릭하여 "Remove Component"하여 제거합니다. Capsule 자체의 충돌을 사용하지 않을 것이기 때문입니다.
5. Inspecter에서 "RigidbodyCharacter"의 Height를 "1" -> "2"로 변경하고, Center Y를 "0" -> "1"로 변경합니다. 이것은 캐릭터의 발끝이 항상 원점이 되도록 하기 위한 것입니다.
같은 이유로 "Capsule"의 Transform - Position - Y의 값을 "0" -> "1"로 변경합니다.
6. "RigidBodyCharacter"에 가장 중요한 "Rigidbody"를 "Add Component"하여 추가합니다.
Rigidbody 설정
+ Mass: 질량 설정인데 중력에는 영향을 받지 않습니다.
+ Drag: 공기저항값
+ Angular Drag: 회전을 할때의 기본값
+ Use Gravity: 중력 사용.
+ Is Kinematic: 물리엔진이 아닌 게임오브젝트 로직에 따라서 게임오브젝트를 이동할 것인가 여부.
+ Interpolate: 물리엔진에서의 애니메이션이 자연스럽게 보간할 것이지에 대한 설정.
+ Collision Detection: 충돌 처리를 연속적으로 할것인가 또는 특정한 경우에만 할 것인가 등의 설정.
+ Constraints
'- Freeze Position [ ]X [ ]Y [ ]Z
'- Freeze Rotation [V]X [ ]Y [V]Z - Y축 회전만 물리엔진에서 처리하고, X 및 Z축 회전은 하지 않겠다.
7. "RigidBodyCharacter"에 "Add Component" - "New Script"로 "RigidBodyCharacter" 추가합니다.
8. 이렇게 추가된 RigidBodyCharacter.cs 스크립트에서 캐릭터의 움직임을 구현해보겠습니다.
RigidBodyCharacter.cs
// 변수 추가.
public float speed = 5f;
public float jumpHeight = 2f;
public float dashDistance = 5f;
private Rigidbody rigidbody;
private Vector3 inputDirection = Vector3.zero;
void Start()
{
rigidbody = GetComponent<Rigidbody>();
}
void Update()
{
inputDirection = Vector3.zero;
inputDirection.x = Input.GetAxis("Horizontal");
inputDirection.z = Input.GetAxis("Vertical");
if (inputDirection != Vector3.zero)
{
transform.forward = inputDirection;
}
}
private void FixedUpdate() // 게임의 프레임과 상관없이 고정적으로 호출되는 함수.
{
rigidbody.MovePosition(rigidbody.position + inputDirection * speed * Time.fixedDeltaTime);
}
여기까지 완성하고 실행하면, 'WASD' 키로 'Capsule' 캐릭터가 움직이는 것을 확인할 수 있습니다.
캐릭터의 진행 방향을 알수가 없기에, 'Cube' Mesh를 추가합니다.
"Cube"의 Position X0, Y0.5, Z0.5, Scale은 모두 0.25로 설정하여 캐릭터의 코(?) 처럼 배치해줍니다. ^^
실행화면입니다.
이제 점프, 대시 구현입니다.
키 설정은 Input Manager에서 원하는 키로 설정하면 됩니다.
점프 구현입니다.
if (Input.GetButtonDown("Jump"))
{
Vector3 jumpVelocity = Vector3.up * Mathf.Sqrt(jumpHeight * -2f * Physics.gravity.y);
rigidbody.AddForce(jumpVelocity, ForceMode.VelocityChange); //물리엔진에 의해 입력된 Velocity가 자동계산됩니다.
}
대시는 Log 함수를 사용하여 자연스럽게 정지되는 느낌을 구현합니다. 개발 상황에 맞게 변경하면 됩니다.
if (Input.GetButtonDown("Dash"))
{
Vector3 dashVelocity = Vector3.Scale(transform.forward,
dashDistance * new Vector3((Mathf.Log(1f / (Time.deltaTime * rigidbody.drag + 1)) / - Time.deltaTime),
0,
(Mathf.Log(1f / (Time.deltaTime * rigidbody.drag + 1)) / - Time.deltaTime)));
rigidbody.AddForce(dashVelocity, ForceMode.VelocityChange);
}
실행하면 캐릭터의 점프 및 대시가 잘 행동하는 것을 확인할 수 있습니다.
문제점이라고 한다면 공중에서 점프할 때도 계속 점프가 가능하다는 점입니다.
땅에 있을 때만 점프하도록 루틴 변경.
땅에 있는지 체크하도록 하기 위해 변수추가.
private bool isGrounded = false;
public LayerMask groundLayerMask; // 땅에 있는지 확인하기 위해 Raycast를 사용할 것인데 이것의 효율을 위해 추가.
public float groundCheckDistance = 0.3f; // 땅 검사 최소 거리.
void CheckGroundStatus()
{
RaycastHit hitInfo; //충돌정보를 가져옴
#if UNITY_EDITOR //디버그 정보 표시.
Debug.DrawLine(transform.position + (Vector3.up * 0.1f),
transform.position + (Vector3.up * 0.1f) + (Vector3.down * groundCheckDistance));
#endif
if (Physics.Raycast(transform.position + (Vector3.up * 0.1f), // 발끝 살짝 위쪽에서 체크
Vector3.down, out hitInfo, groundCheckDistance, groundLayerMask))
{
isGrounded = true;
}
else
{
isGrounded = false;
}
}
이제 이 함수를 Update()의 최상단에서 호출하고, 점프 루틴도 수정을 해줍니다.
void Update()
{
CheckGroundStatus();
if (Input.GetButtonDown("Jump") && isGrounded)
{ .. }
}
마지막으로 Unity UI상에서 "RigidbodyCharacter"의 "Ground Layer Mask"를 "Ground"로 변경합니다. 다른 바닥 지형들이 "Ground"로 설정되어 있습니다.
실행하면 Ground에서만 Jump되는 캐릭터를 볼 수 있습니다.
역시 게임 개발로 들어가니 빨리빨리 진행되네요..
당연하겠지만 유니티의 기본 기능만해도 설명할 것이 많기 때문에 진도가 빠르지 않을까 생각은 듭니다.
열심.. 열심히 하는 수 밖에 없겠지요 ^^???
그래도 패스트캠퍼스 강의는 평생 수강이 가능하니 이번이 끝이 아니라 반복적으로 해본다는 마음으로 하나씩 천천히 진행해 보아야겠습니다.
패스트캠퍼스 - 올인원 패키지 : 유니티 포트폴리오 완성 bit.ly/2R561g0
'[컴퓨터] > 웹 | 앱 | 게임 개발' 카테고리의 다른 글
[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 6회차 미션 (0) | 2020.10.24 |
---|---|
[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 5회차 미션 (0) | 2020.10.23 |
[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 4회차 미션 (0) | 2020.10.22 |
[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 2회차 미션 (0) | 2020.10.20 |
[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 1회차 미션 (0) | 2020.10.19 |