최종프로젝트 7일차

박희태·2024년 3월 14일
0

최종프로젝트

목록 보기
6/17

알고리즘

오늘의 문제는 43번 크기가 작은 부분문자열을 풀었다.

using System;

public class Solution {
    public int solution(string t, string p) {
        int answer = 0;
        long num = 0;
        for(int i = 0; i < t.Length - p.Length + 1; i++)
        {
            num = long.Parse(t.Substring(i, p.Length));
            if(num <= long.Parse(p)) { answer++; }
        }
        return answer;
    }
}

오버플로우가 걸릴수있으니 int가 아닌 long으로 num을 선언해주고 for문을 돌렸다. 실행범위는 t의 길이에서 p의 길이를뺀 숫자 +1만큼이다. 반복문 안에서 t에 Substring()을 사용하여 i부터 p의 길이까지 자르고 long타입으로 변환 시킨다음 num에 넣어준 다음 num이 long타입으로 변환시킨 p보다 작거나 같다면 answer을 더해준다.

기술면접

오늘은 6번 7번 문제에 대해 답변하겠다

6.가비지 컬렉터를 회피하기 위한 전략은 무엇이 있나요?

가비지 컬렉터는 힙메모리 영역을 관리하기때문에 힙메모리를 사용하는 참조타입의 인스턴스 사용을 줄이는 것이 가비지 컬렉터를 회피하는 전략입니다.
예를들면 값타입 인스턴스를 사용할수있습니다. 기본적으로 스택 메모리 영역을 사용하기때문에 가비지 컬렉터를 회피할수 잇습니다.

  1. 가비지 컬렉션이란 무엇인지 설명해주세요.

가비지 컬렉션은 프로그램이 사용하지 않는 메모리를 자동으로 해제하는 프로세스입니다. 이를 통해 메모리 누수를 방지하고 시스템의 안정성을 유지합니다.

최종프로젝트 진행

Player의 움직임을 InputAction을 사용해 구독하는 형식으로 프로젝트를 진행하고있다.
먼저 플레이어의 InputAction을 받아올 PlayerInput.cs를 생성한다음

public class PlayerInput : MonoBehaviour
{
    public PlayerInputAction playerInputAction { get; private set; }
    public PlayerInputAction.PlayerActions playerActions { get; private set; }

    private void Awake()
    {
        playerInputAction = new PlayerInputAction();
        playerActions = playerInputAction.Player;
    }

    private void OnEnable()
    {
        playerInputAction.Enable();   
    }
    private void OnDisable()
    {
        playerInputAction.Disable();
    }
}

로 작성하였다.

다음 Player.cs 스크립트에서 동작을 구독하고 실행시켰다.

	[SerializeField] private Rigidbody2D _rigidbd;
   	[SerializeField] private Transform _floorCheck;
    [SerializeField] private LayerMask _floorLayer;
    public PlayerInput playerInput { get; private set; }

    private float _horizontal;
    private float _speed = 4f;
    private float _jumpingPower = 20f;

플레이어의 이동 및 점프를 구현하기위해 사용한 변수들이다.
public PlayerInput playerInput { get; private set; }을 통해 앞서 만들었던 PlayerInput.cs를 선언하였다.

다음은 Start()이다.

private void Start()
    {
        playerInput = GetComponent<PlayerInput>();

        playerInput.playerActions.Move.started += Move;
        playerInput.playerActions.Jump.started += JumpStarted;
        playerInput.playerActions.Jump.canceled += JumpCanceled;
        playerInput.playerActions.Look.started += Look;
        playerInput.playerActions.Action.started += PlayerAction;
    }

구독을 한다음 playerInput.playerActions.Move.started +=를 사용하여 플레이어의 InputAction을 선언해주었다.

플레이어의 움직임 부분이다.

private void FixedUpdate()
    {
        _rigidbd.velocity = new Vector2(_horizontal * _speed, _rigidbd.velocity.y);
    }
    public void Move(InputAction.CallbackContext context)
    {
        _horizontal = context.ReadValue<Vector2>().x;
    }

플랫포머 게임이기때문에 A,D를 이용하여 좌우움직임만 구현했다. 따라서 x좌표만 움직이면 되고 FixedUpdate를 통해 실시간움직임을 구현했다.

플레이어의 점프부분이다.

public void JumpStarted(InputAction.CallbackContext context)
    {
        if (context.started && _coyoteTimeCount > 0f)
        {
            _rigidbd.velocity = new Vector2(_rigidbd.velocity.x, _jumpingPower);
        }
    }
    public void JumpCanceled(InputAction.CallbackContext context)
    {
        if (context.canceled && _rigidbd.velocity.y > 0f)
        {
            _rigidbd.velocity = new Vector2(_rigidbd.velocity.x, _rigidbd.velocity.y * 0.6f);

            _coyoteTimeCount = 0f;
        }
    }
    private bool IsFloor()
    {
        // OverlapCircle <- 매개변수로 전달할 위치를 기준으로 반지름만큼 원 생성
        //그 영역 내에 충돌체를 가진 게임오브젝트가 있는지 검사
        return Physics2D.OverlapCircle(_floorCheck.position, 0.7f, _floorLayer);
    }

점프버튼을 눌렀을때인 JumpStarted, 뗐을때의 JumpCanceled를 이용해 점프를 구현하였다. 중간에있는 _coyoteTimeCount는 바로아래에 설명하겠다.
플레이어는 땅에 닿아있어야만 점프를 할 수 있기 때문에 bool값인 IsFloor를 통해 체크를 하게된다. 이때 플레이어의 아래쪽에 땅인지 체크하기위한 GroundCheck를 생성해두어야 한다.

오늘작업중 제일 맘에 들었던 코요테시간이다.
코요테 시간은 기본적으로 플랫폼을 떠난 직후 점프하는 경우에도 지상에 있지않는거로 처리되기 때문에점프가 등록되지않는다.
따라서 플레이어가 플랫폼을 떠난후 몇프레임동안 플랫폼에 있었고 그시간동안 점프할수 있도록 허용해야한다.

//코요테시간
    [SerializeField] private float _coyoteTime = 0.2f;
    private float _coyoteTimeCount;
    
    //중략
    private void Update()
    {
        if (IsFloor())
        {
            _coyoteTimeCount = _coyoteTime;
        }
        else
        {
            _coyoteTimeCount -= Time.deltaTime;
        }
    }

오늘의 작업은 이렇게 끝이나게되었다. 점프버퍼도 구현하려했으나 현재 작업되어있는 부분에서 Raycast를 사용하여 검사를 진행하도록 수정해야하는 부분이 있기때문에 먼저 바닥 및 머리충돌검사를 위한 Raycast작업을 진행한 다음 점프버퍼까지 작업을 진행할 예정이다.

profile
초보개발자

0개의 댓글