어제 TIL을 작성하지 못해서 오늘 2일치분량의 TIL을 작성할것이다.
- 숫자 문자열과 영단어
using System;
public class Solution {
public int solution(string s) {
int answer = 0;
//string.Replace("해당 문자열을", "해당 문자열로");
s = s.Replace("zero", "0");
s = s.Replace("one", "1");
s = s.Replace("two", "2");
s = s.Replace("three", "3");
s = s.Replace("four", "4");
s = s.Replace("five", "5");
s = s.Replace("six", "6");
s = s.Replace("seven", "7");
s = s.Replace("eight", "8");
s = s.Replace("nine", "9");
int k;
bool strToInt = int.TryParse(s, out k); //변환 후 해당 문자열이 숫자이면
if(strToInt) answer = k; //answer에 숫자 대입
return answer; //answer 반환
}
}
처음엔 딕셔너리를 사용해야하나? 생각을 하고 코드를 작성하다 string.Replace라는 코드가 현재 문자열에서 발견되는 지정된 유니코드 문자 또는 String을 모두 지정된 다른 유니코드 문자 또는 String으로 바꾼 새 문자열을 반환하는 기능을 가지고 있는것을 알게되었다.
그래서 영단어와 숫자를 지정해준다음 반환해주는 코드를 작성하였다.
- 문자열 내 마음대로 정렬하기
using System;
public class Solution {
public string[] solution(string[] strings, int n) {
string[] answer = new string[] {};
// Sort 에 간단한 문자의 비교 연산을 추가하여 실행
Array.Sort(strings, (str1, str2) => {
// 문자 추출
var word1 = str1.Substring(n, 1);
var word2 = str2.Substring(n, 1);
// 같은 단어면 사전순 정렬, 아니라면 해당 문자 기준으로 비교
if(word1 == word2)
{
return str1.CompareTo(str2);
}
else
{
return word1.CompareTo(word2);
}
});
answer = strings;
return answer;
}
}
화요일 면접및 기술면접때 질문에 대한 키워드가 없어서 두루뭉실하게 답변을 한다는 피드백을 받았었다. 주말간 1~9번 질문에 대해 키워드를 설정하고 그것에 대해 답변을 준비할 예정이다.(이것은 주말에 TIL을 한번 작성해 정리할예정이다.)
10.제네릭이란 무엇인가요?
제네릭은 데이터형식을 일반화하여 코드의 재사용성과 유연성을 향상시켜주는 도구입니다.
여러 데이터형식에 대해 동일한 로직을 적용해야할때나 데이터 형식에 따라 다른연산을 수행해야 할 때 제네릭함수를 사용하면 유용합니다.
키워드 : 데이터형식을 일반화하여 코드의 재사용성
11.델리게이트(Delegate)의 개념에 대해 설명해주세요.
델리게이트는 대리자 라는 의미를 가지고있는데 말 그대로 메서드를 대신 호출해주는 기능을 하는데 대리자가 메서드의 주소를 참조하기때문에 메서드를 대신 호출이 가능합니다. 예를들면 KeyDown같은 이벤트처리기를 통해 등록된 메서드를 호출하는 방식이 있습니다.
기존코드는 velocity를 이용해 움직임을 받아오도록 코드를작성하였는데 후크의 스윙액션과 충돌이 일어나는 경우가 발생하여 AddForce방식으로 전면교체를 했다.
//플레이어 이동속도 코드
var groundForce = _moveSpeed * 5f;
_rigidbd.AddForce(new Vector2((_horizontal * groundForce - _rigidbd.velocity.x) * groundForce, 0f));
_rigidbd.velocity = new Vector2(_rigidbd.velocity.x, _rigidbd.velocity.y);
//점프
if (_coyoteTimeCount > 0f && (_isJumpPerformed || (_isJumping && _isJumpBufferCheck)))
{
_coyoteTimeCount = 0f;
_isJumping = false;
_rigidbd.velocity = new Vector2(_rigidbd.velocity.x, _jumpingPower);
}
주요코드는 이렇게 바꾸었고 세세한 bool값과 float값을 새로 설정해 점프버퍼와 움직임 코요테타임도 정상적으로 작동하게 제작하였다.
이어서 현재까지 진행된 에어코드이다.
먼저 에어의 무기회전은 스파르타코딩클럽 입문주차에서 사용했던 내용을 그대로 가져와 적용시켰다.
//감지거리
[SerializeField] public float detectionDistance = 3f;
private LayerMask _objectMask; //이것은 열쇠등등 오브젝트
private LayerMask _hookMask; //이걸 후크레이어로 설정해둬야할듯
private LayerMask _collisionLayerMask; //두개 레이어
private float _shortestDistance;
이것들로 오브젝트와 후크레이어감지, 총구에서 탐지하는거리, 가장가까운거리탐지를 하는 값을 설정해줬다.
//가장 가까운 객체
private Collider2D _closestTarget;
private Collider2D _latestTarget;
가장가까운 객체 1개만 가져와야하기때문에 선언했다.
private void Awake()
{
_camera = Camera.main;
_closestTarget = null;
_shortestDistance = float.MaxValue;
_objectMask = LayerMask.GetMask("Object");
_hookMask = LayerMask.GetMask("Hook");
_collisionLayerMask = _objectMask | _hookMask;
}
시작하면서 필요한것들을 선언하였다.
public PlayerInput playerInput { get; private set; }
private void Start()
{
playerInput = GetComponent<PlayerInput>();
playerInput.playerActions.Look.performed += Look;
playerInput.playerActions.Action.performed += PlayerActionPerformed;
playerInput.playerActions.Action.canceled += PlayerActionCanceled;
}
inputAction을 사용하기때문에 구독및 선언을 해주었다.
private void FixedUpdate()
{
RotateArm();
if (_isClick)
{
ObjectCheck();
}
}
무기가 회전하는것과 클릭하였을때 함수가 실행되도록 FixedUpdate를 제작하였다.
이제 오브젝트를 체크하는것인데 OverlapCircleAll메서드를 활용해 원형거리안에있는 오브젝트 전부 체크하여 리스트에 넣었다.
그리고 최단거리물체 1개가 필요하기때문에 가장가까운 오브젝트를 체크하는 코드를 제작하였고 총구위치벡터와 오브젝트위치벡터의 각도가 40도 이내라면 감지하는것까지 코드가 완성되었다.
이제 감지된물체가 곡선을그리며 총구위치로 끌여당겨와지는것을 구현하면된다.