반응형

 

 

 

 

NavMeshAgent에 Angular Speed를 아무리 높게 줘도 회전이 늦게 일어난다. (해당 프로퍼티가 초당 회전각도로 알고있는데 아무리 수치를 높여도 회전이 느림)

위와 같이 회전이 몬스터 같은 유닛의 경우 어색할 가능성이 다분하다.

그래서 NavMeshAgent.updateRotation의 값을 false로 설정해준 뒤, 직접 각을 계산해서 넣어줘야한다.

 

 

 

공통

private NavMeshAgent m_agent;

void Start()
{
    m_agent = GetComponent<NavMeshAgent>();
    m_agent.updateRotation = false;
}

 

 

 

 

1. NavMeshAgent의 DesireVelocity값을 이용해 회전값 조정

- NavMeshAgent.DesireVelocity - 회피를 고려한 목표 속도

- Qaternion.LookRotation을 이용해서 회전값을 적용해주면 된다.

void Update()
{
    transform.rotation = Quaternion.LookRotation(m_agent.desireVelocity);
}

 

 

- 결과

그런데 한가지 문제가 있다면 커브길 주변에서 유닛이 떨리는 현상이 발견된다. (실제로 적용해보면 심각할정도로 떨린다.)

 

 

 

2. 직접 각을 계산해서 적용하기

- NavMeshAgent.steeringTarget값을 이용해 회전 값을 계산해서 적용하기

void Update()
{
    Vector2 forward = new Vector2(transform.position.z, transform.position.x);
    Vector2 steeringTarget = new Vector2(m_agent.steeringTarget.z, m_agent.steeringTarget.x);
    
    //방향을 구한 뒤, 역함수로 각을 구한다.
    Vector2 dir = steeringTarget - forward;
    float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
    
    //방향 적용
    transform.eulerAngles = Vector3.up * angle;
}

※ 3차원 공간에서는 전진 방향이 z축이니 Vector2의 x값을 transform.position.z값으로 설정한다.

※ steeringTarget : 경로상의 다음 목적지.

 

- 결과

1번과 다르게 떨리는 현상 없이 바로 회전하는것을 볼 수 있다.

 

 

 

 

 

반응형
반응형

 

 

 

 

Navigation Bake (Baked Agent)

  • Agent Radius : Agent의 반지름, Agent와 벽까지의 거리이다. 해당 반지름의 길이만큼 Agent가 벽에 붙어서 움직일 수 있다.
  • Agent Height : Agent의 높이, Agent의 높이를 지정해서 천장이 있는 지형의 통과 여부를 결정한다.
  • Max Slope : 이동 가능한 경사도
  • Step Height : 이동 가능한 단차의 한계 값, 설정한 수치만큼의 단차를 이동 할 수 있다.

※ Agent Height에 따른 네비메쉬 차이

 

 

NavMeshAgent Component

- A* PathFinding 알고리즘을 사용하여 길을 탐색한다.

- Bake된 네비메쉬의 정보를 바탕으로 목적지까지의 최단거리 이동을 계산하며, Agent간의 충돌을 회피할 수 도 있다.

 

AgentType : Navigation의 Agents 탭에서 지정한 정보

BaseOffset : NavMeshAgent는 Bake된 네비메쉬의 표면에 붙어있기 떄문에 실제 맵 오브젝트로부터 공중으로 살짝 떨어지게 되어있다. 해당 값으로 높이조절이 가능하다.

 

Steering

  • Speed : 최대 이동 속도
  • Angular Speed : 회전 속도(Degree/sec)
  • Acceleration : 최대 가속도
  • Stopping Distance : 목표점에 가까워졌을 때, 설정한 거리에 들어오면 감속
  • Auto Braking : 목적지에 도착하기 직전에 감속을 시작할 것인지 결정

 

Obstacle Avoidance

- 다른 Agent와 Obstacle을 어떻게 회피할 것인지 결정하는 프로퍼티

  • Radius : 지형과 관계없이 다른 Agent나 Obstacle의 충돌하는 영역의 두께가 조절된다.
  • Height : Agent끼리의 높이 충돌을 조절한다.
  • Quality : 회피 품질(None은 회피 무시)
  • Priority : Agent간의 회피 우선 순위, 낮은 수가 높은 우선 순위이며 자신보다 낮은 Agent는 회피 대상에서 제외된다.

 

Path Finding

  • Auto Traverse Off Mesh Link : 분리된 메쉬 간에 자동으로 링크를 생성하는 옵션. Off Mesh Link 컴포넌트를 사용할 시 해당 기능을 비활성화해야한다.
  • Auto Repath : 네비메쉬에 변동이 생기거나 길이 막혔을 때, 재탐색한다.
  • Area Mask : 네비메쉬의 영역별로 이동을 제한할 수 있는 기능

 

 

 

 

 

반응형
반응형

 

 

 

 

VS Code의 터미널을 실행하려했을 때 터미널이 설정되어있지 않으면 '터미널 프로세스를 시작하지 못했습니다'는 에러가 나타나면서 터미널이 실행되지 않는다. 이럴때 다음과 같이 해결한다.

 

- FilePreferencesSetting(단축키 Ctrl,)에서 검색창에 default profile:windows를 검색한다.

 

 

- 여기서 null로 설정되어있을건데 해당 값을 원하는 터미널로 변경해주면 된다.

- 다시 터미널을 실행해보면 다음과 같이 제대로 실행된다.

 

 

 

 

 

반응형
반응형

 

 

 

 

※ 해당 프로젝트는 3D 기능파악 및 최적화에 중점을 둔 프로젝트입니다.

 

 

 

 

제작기간

- 총 2일 (게임 제작 1일, 최적화 1일)

 

 

 

구현 내용

- UI

  • SafeArea를 적용하여 펀치홀 기종에 UI가 겹치지 않도록 조정
  • 커스텀 버튼을 구현하여 적용

- Game

  • 쉐이더(투명화, 툰)를 적용
  • 싱글톤(Manager class) 디자인 패턴 적용

 

 

 

최적화(배칭)

- UI

  • Sprite atlas 사용

- Game

  • Static batching으로 Batches를 줄임

 

 

 

Batches 수치 변화

※ 위 Batches의 수치는 평균값을 찍은것으로 두더지 출몰 수에따라 ±10정도 변경된다.

- 툰 쉐이더가 멀티패스를 사용하고 있어서 이 부분을 염두해두고 최대한 배칭작업을 진행했다.

- 처음에는 이 프로젝트도 Dynamic batching으로 배칭 처리를 하려고 배경에 구멍을 뚫기 위해 사용한 메쉬를 Sphere에서 Cylinder로 변경하여 배칭을 시도해봤지만, z-fighting 문제로 배칭처리가 되지않았다.

- 위의 문제도 있고, 두더지는 Skinned Mesh Renderer 컴포넌트를 갖고있어서 Dynamic batching 기능이 무의미하다고 판단함.

- 최종적으로 구멍 게임 오브젝트들은 움직이는 오브젝트들이 아니니 Static batching으로 변경하여 배칭처리를 했다.

 

 

 

 

 

반응형

'Game > Personal development' 카테고리의 다른 글

[Unity] 미로 게임 제작  (0) 2022.04.28
[Unity] 모바일 전략 시뮬레이션  (0) 2022.04.16
[WIN API] 서커스 찰리 게임  (0) 2022.02.05
[WIN API] 카드 맞추기 게임  (0) 2022.01.30
산성비 게임 제작 (C++)  (4) 2022.01.23
반응형

 

 

※해당 프로젝트는 3D 기능파악 및 최적화에 중점을 둔 프로젝트입니다.

 

 

 

 

제작기간

- 총 2일 (게임 제작 1일, 최적화 1일)

 

 

 

구현 내용

- UI

  • SafeArea를 적용하여 펀치홀 기종에 UI가 겹치지 않도록 조정
  • 커스텀 버튼을 구현하여 적용

- Game

  • 미로 생성 알고리즘 적용
  • 싱글톤(Manager class) 디자인 패턴 적용

 

 

 

최적화(배칭)

- UI

  • Sprite atlas 사용

- Game

  • Dynamic batching으로 Batches를 줄임
  • 캐릭터의 그림자를 Fake shadow로 대체
  • 카메라의 절두체 수치를 최대한 좁혀서 렌더링을 줄이고 절두체에 잘리는 끝부분은 Fog로 가려줘서 어색함을 줄임

 

 

 

Batches 수치 변화

- UI에서 2, 미로(벽, 천장, 바닥)에서 3, FakeShadow에서 1, 나머지는 유니티짱 모델에서 발생한다.

- 이번 프로젝트에서는 맵이 고정이 아닌 동적 오브젝트들이기 때문에 Dynamic batching을 사용해서 배칭처리를 했다.

 

 

 

 

 

반응형

+ Recent posts