[컴퓨터]/웹 | 앱 | 게임 개발

[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 4회차 미션

BOOX 2020. 10. 22. 02:26

[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 4회차 미션 시작합니다.

 


Character Controller를 이용한 캐릭터 이동/점프/대시 구현

 


CharacterController를 이용한 캐릭터 구현입니다.

캐릭터콘트롤러는 물리엔진을 사용하지 않고 GameObject에 대한 움직임을 Logic으로 쉽게 처리할 수 있도록 해줍니다. 충돌 처리를 위해서 자체 Collider도 포함하고 있습니다.

Rigidbody하고의 가장 큰 차이점은 Step Offset과 Slope Limit의 설정입니다.

Step Offset은 계단과 같이 캐릭터가 올라갈 수 있는 높이를 말하고, Slope Limit은 캐릭터가 올라갈 수 있는 경사도를 설정할 수 있는 기능입니다.
물리엔진을 사용하지 않기 때문에 중력하고 이동속도 같은 계산법을 직접적으로 구현해야 합니다.



CharacterController를 이용한 Character GameObject 구성

구성 Component들:
+ Capsule Mesh - 캐릭터 UI 표시
+ CharacterController Component - 캐릭터 이동 회전 및 충돌 처리
+ ControllerCharacter.cs - 사용자 입력 및 이동 처리

 

 

기본 구성은 Rigidbody 테스트와 거의 동일하게 설정해 줍니다.
근데 Cube를 코로 생각했는데... Eye!! 눈입니다. ㅎㅎ 머 개발자 설정하기 마음이지만요. 

"GameObject"를 "ControllerCharacter"로 변경하고 진행합니다.
"ControllerCharacter"를 선택하고 가장 중요한 "Character Controller" 컴포넌트를 추가해 줍니다.
Center Y 값을 "0" -> "1"로 설정합니다. Capsule Mesh의 Position Y값도 "1'로 설정하여 Collider를 맞추어 주도록 합니다.

+ Slop Limit: 45
+ Step Offset: 0.3
+ Skin Width: 0.08 - 캐릭터 컨트롤러와 다른 Collider가 부딪혔을 때 겹칠 수 잇는 값
+ Min Move Distance: 0.001
+ Radius: 0.5
+ Height: 2

이제 스크립트를 작성해 보도록 합니다.
"Add Component"에서 "New Script"로 하여 "ControllerCharacter"를 생성합니다.
추가되었으므로 더블클릭하여 연동된 Editor가 실행되기를 기다립니다. Rigidbody 때와 마찬가지로 이동/점프/대시를 구현할 예정입니다.
기능이 거의 동일하므로 Rigidbody 때 만든 변수들을 동일하게 사용합니다. 복사->붙여넣기..
중력과 이동속도 관련된 변수는 추가됩니다.

 

 

 

 

ControllerCharacter.cs

private Rigidbody rigidbody; 를
private CharacterController characterController; 로 변경합니다.

중력을 처리하기 위한 변수를 추가합니다.
public float gravity = -9.81f;

저항값을 처리하기 위해 변수를 추가합니다.
public Vector3 drags;

// 점프, 대시, 저항력 계산용 변수
private Vector3 calcVelocity;

rightBody = GetComponent<rigitbody>(); 를
characterController = GetComponent<CharacterController>();로 변경합니다.

Update() 함수 최상단에서 사용한 CheckGroundStatus() 함수를 그대로 사용해도 되지만 CharacterController 자체에서 제공하는 isGrounded를 활용할 수 있습니다.

CheckGroundStatus(); -> isGrounded = characterController.isGrounded; 로 변경합니다.

 


땅에 도착했을 때는 중력값을 받지 않도록 코드를 수정해 줍니다.
if (isGrounded && calcVelocity.y < 0) calcVelocity.y = 0;

이동 처리를 위한 Vector3 설정 및 적용.
Vector3 move = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
characterController.Move(move * Time.deltaTime * speed);
if (move != Vector3.zero)
{
  transform.forward = inputDirection;
}

점프 코드를 수정해 줍니다.
if (Input.GetButtonDown("Jump") && isGrounded)
{
  calcVelocity.y += Mathf.Sqrt(jumpHeight * -2f * Physics.gravity.y);
}


대시도 마찬가지로 작업해 주고, 가장 중요한 중력값 계산하는 코드를 작성합니다.

 


여기까지 작업하면 스크립트에 대한 작업은 완료되었습니다.
이 상태로 실행하면 잘 동작하는 것을 확인할 수 있는데요. 대신 점프를 하면 엄청난 점프 신공을 보여줍니다. ㅋㅋㅋ Unity의 기본 중력값이 9.81이 아니기 때문입니다.
아래와 같이 설정값을 변경해 줍니다.

 

 


CharacterController와 Rigidbody는 꼭 별개로 사용되어야 하는 건 아니고 조합해서도 사용 가능합니다. 

자 이제 실행을 해보면 Rigidbody 작업 때와 같은 결과를 확인할 수 있습니다. 이동/점프/대시 모두 잘 동작합니다.

 

 

 

 

 

 



이제 NavMesh를 사용하는 캐릭터를 구현해보도록 하겠습니다.

 


NavMesh를 사용하기 위해서는 NavMeshAgent를 사용해야 합니다.
NavMeshAgent는 Unity 내부의 길찾기 시스템을 사용할 수 있게 해주고, 장애물 설정하여 캐릭터 피하기 및 길찾기 우선수위로 비용 계산도 가능하도록 해줍니다. 그리고 이 방식은 Click & Move에도 적합한 방식입니다.

 


NavMeshAgent를 이용한 Character GameObject 구성
구성 Component들:
+ Capsule Mesh - 캐릭터 추가
+ CharacterController Component - GameObject의 이동/회전 로직 및 충돌
+ NavMeshAgent - 길찾기 시스템을 이용하기 위한 Component
+ AgentControllerCharacter.cs - 사용자 입력 및 이동 처리.

 

 

Window - AI - Navigation을 추가하고, Radius / Height / Step Height / Max Slope의 값을 Capsule 캐릭터와 동일한 값으로 설정합니다.

Navigation의 [Object]를 선택하고 Scene Filter를 "Mesh Renderers"로 선택합니다.
그리고 Navigation을 적용할 GameObject들을 선택합니다.

Generate OffMeshLink는 점프라던지 순간이동 또는 다른 행동을 설정할 수 있는 것입니다.
여기서는 사용하지 않을 것이므로 Uncheck합니다.

 


그리고 컨테이너 3개에는 걸어들어갈 수 없어야 하므로, "Not Walkable"을 설정합니다.

 

 

좀더 명확한 위치 및 확인을 위해서 많긴 하지만 이미지를 많이 삽입하였습니다.

 

 

Terrain도 마찬가지로 Generate OffMeshLink를 Uncheck하고, Navigation Area를 "Walkable"로 설정합니다.


Bake - Navigation Mesh를 좀더 상세하게 설정하고 빌드할 수 있습니다.
현재는 기본으로 두고 "Bake"를 클릭하면 Navigation Mesh가 생성된 것을 확인할 수 있습니다.

 


ControllerCharacter를 선택하고 "Nav Mesh Agent" 컴포넌트를 추가합니다.
여기까지 설정은 완료되었고 스크립트 작업을 진행합니다.

Steering 값들은 내부 에이전트 Mesh가 이동할 때 사용되는 Velocity를 계산하기 위해 사용되는 값들입니다.
Obstacle Avoidance는 물체를 피해갈 때 얼마의 값들을 기준으로 피할 것인지 설정하는 것입니다.
Path Finding은 길찾기 관련된 설정을 하는 값들입니다.


기존 Controller Character를 그대로 사용하며 확장하는 형태로 만들것이므로 "Controller Character" 스크립트를 더블클릭하여 Editor를 실행합니다.



ControllerCharacter.cs

클릭 앤 무브 방식이므로 기존 변수값들중 불필요한 변수들을 제거합니다. 그리고 NavMeshAgent 및 Camera를 추가합니다.

 


void Start()
{
  characterController = GetComponent<CharacterController>();
  agent = GetComponent<NavMeshAgent>();
  agent.updatePosition = false; // Agent의 이동 시스템을 사용하지 않겠다. CharacterController의 이동 시스템으로 움직일 것이므로..
  agent.updateRotation = true; // Agent의 회전 시스템 사용.
  
  camera = Camera.main;
}

클릭 앤 무브 방식으로 처리할 것이라서 Update() 내용을 모두 제거하고 새로 작성합니다.

void Update()
{
  if (Input.GetMouseButtonDown(0))
  {
    Ray ray = camera.ScreenPointToRay(Input.mousePosition); // Make ray from screen to world

    RaycastHit hit;
    if (Physics.Raycast(ray, out hit, 100, groundLayerMask) // Peeking에 대한 체크 거리가 너무 멀면 Performance에 영향이 크기 때문에 100 정도로 설정.
    {
      Debug.Log("We hit " + hit.collider.name + " " + hit.point);
  
      agent.SetDestination(hit.point); // Agent가 알아서 이동 시작.
    }

    if (agent.remainingDistance > agent.stoppingDistance) // 가야할 거리가 남았다.
    {
      characterController.Move(agnet.velocity * Time.deltaTime);
    }
    else
    {
      characterController.Move(Vector3.zero);
    }
  }
}


Agent의 이동방향으로 캐릭터의 이동방향을 맞추어 주기 위해 LateUpdate() 함수를 구현합니다.
private void LateUpdate()
{
  transform.position = agent.nextPosition;
}

 

여기까지가 작업 완료입니다. NavAgent를 사용하기 때문에 정말 쉽게 코드가 작성되는 신비함을 느껴볼 수 있습니다.



저번에 샘플 예제가 없다고 하였는데 제가 잘못 알고 있었네요. ^^;;;
강의 자료에 해당 샘플 예제가 모두 포함되어 있었고 실행도 잘 되는 것을 확인하였습니다. ㅎㅎ
이제 앞으로의 교육 진행을 조금은 마음 편히 따라 갈 수 있을 것 같습니다.

지금까지의 내용을 실제 유니티로 실행하고 테스트 해 본 화면입니다.

 


잘 되네요~

여기까지 쉴틈 없이 따라 하고 있는데요.. 솔직히 강의 들으면 들을수록 너무 좋네요..
완전 따라가기 어렵지 않을까.. 챕터 몇개 대략 봤을 때도 불안감이 앞서있었는데요..
차근히 하나하나 듣고 따라해보니 정말 됩니다.. 기가막히게 좋네요. 
패스트캠퍼스 정말 대단합니다. 이런 좋은 강의를 착한 가격에 들을 수 있다니.. 감사할 따름이네요.

 

패스트캠퍼스 - 올인원 패키지 : 유니티 포트폴리오 완성 bit.ly/2R561g0

 

유니티 게임 포트폴리오 완성 올인원 패키지 Online. | 패스트캠퍼스

게임 콘텐츠 프로그래머로 취업하고 싶다면, 포트폴리오 완성은 필수! '디아블로'와 '배틀그라운드' 게임을 따라 만들어 보며, 프로그래머 면접에 나오는 핵심 개념까지 모두 잡아 보세요!

www.fastcampus.co.kr