250305 TIL

박소희·2025년 3월 6일

Unity_7기

목록 보기
40/94

AI Navigation

  • 인공지능이 게임이나 시뮬레이션 등 가상 환경에서 이동하는 방법을 결정하는 기술
  1. Navigation Mesh: 3D 공간을 그리드로 나누어 이동 가능한 지역과 장애물이 있는 지역을 구분함
    • 캐릭터가 이동할 수 있는 영역과 이동할 수 없는 영역을 정의하고, 이를 기반으로 경로 계산
  2. Pathfinding: 캐릭터의 현재 위치에서 목표 지점까지 가장 적절한 경로를 찾는 알고리즘
    • 주로 A* 알고리즘 사용
  3. Steering Behavior: 경로를 따라 이동할 때, 자연스러운 동작 구현
  4. Obstacle Avoidance: 이동 중에 장애물과 충돌하지 않도록 하는 기술
  5. Local Avoidance: 여러 캐릭터나 NPC가 서로 충돌하지 않도록 하는 기술

Mathf.Approximately(value1, value2): 근사값인지 아닌지 bool 반환

과제

  1. 플레이어 움직임, 점프 구현
    Input System에서 Action 추가해주고 스크립트 작성
public void OnMove(InputAction.CallbackContext context)
{
    if(context.phase == InputActionPhase.Performed) // 누르고 있을 때
    {
        curMove = context.ReadValue<Vector2>(); //이동
    }
    else if(context.phase == InputActionPhase.Canceled) // 뗐을 때
    {
        curMove = Vector2.zero; //멈춤
    }
}

public void OnJump(InputAction.CallbackContext context)
{
    if(context.phase == InputActionPhase.Started) // 눌렀을 때
    {
        rb.AddForce(Vector2.up * jumpForce, ForceMode.Impulse);
    }
}
  1. 스테미나, 체력 구현
    Condition 클래스를 만들고 체력, 스테미나의 초기값을 설정한다. uiBar를 통해 현재 상태를 표시한다.
    PlayerCondition에서 Condition을 직접 관리하고, 게임 내에서 소모/회복을 처리한다.
void Update()
{
    if (!CharacterManager.Instance.Player.controller.isRunning)
    {
        stamina.Add(stamina.passvieValue * Time.deltaTime);
    }
}
public void UseStamina()
{
    stamina.Subtract(decayStamina * Time.deltaTime);
}
public bool CanUseStamina()
{
    return stamina.curValue > 0;
}
  1. 달리기 구현
    설정한 달리기 키를 입력할 때마다 isRunning 값을 바꾼다.
public void OnRun(InputAction.CallbackContext context)
{
    if(context.phase == InputActionPhase.Performed)
    {
        isRunning = true;
    }
    else if(context.phase == InputActionPhase.Canceled)
    {
        isRunning = false;
    }
}
private void Move()
{
    float speed = isRunning && CharacterManager.Instance.Player.condition.CanUseStamina() ? runSpeed : moveSpeed;
    if (isRunning)
    {
        CharacterManager.Instance.Player.condition.UseStamina();
    }
    Vector3 dir = transform.forward * curMove.y + transform.right * curMove.x;
    dir *= speed;
    dir.y = rb.velocity.y;

    rb.velocity = dir;
}

0개의 댓글