KDT Unity 2주차~4주차 - 개인학습8
해당 내용의 전부는 학원에서 배우는 것이기 때문에 공개가 어렵습니다.
해당 내용의 자세한 강의가 필요하신 분들은 이곳에서 확인하시면 됩니다.
2023-11-15 TIL
알고리즘 문제
오늘의 알고리즘 문제 : 두 정수 사이의 합
두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요. 예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.
1
2
3
4
5
6
public class Solution {
public long solution(int a, int b) {
long answer = 0;
return answer;
}
}
해결
작은 수와 큰수의 구별이 없습니다. 그래서 큰수와 작은 수를 구별을 해주어야 합니다.
또한 결국은 for문으로 모든수를 다 더해야 합니다.
그렇게 때문에 for문을 사용하며 사용하는 for문의 변수 i의 값을 삼항 연사자를 사용하여 한줄로 표기했다.
1
2
3
4
5
6
7
8
9
public class Solution {
public long solution(int a, int b) {
long answer = 0;
for (int i = a>b ? b : a ; i <= (a > b ? a : b); i++) answer += i;
return answer;
}
}
Unity New Input system으로 이동을 구현해보자!
오늘은 어제의 포스팅대로 New Input System을 사용해서 플레이어의 이동을 구현해볼것이다.
New Input system 등록
상단 메뉴창에서 Window -> Package Manager에 들어가 상단에 메뉴창 2번째를 누르고 Packges : Unity Registry를 들어간 후 좌측 상단 검색창에 input System을 검색해줍니다.
그리고 설치해줍니다.
그러면 해당 input System으로 바꿀거냐는 안내창이 뜹니다.
그 후 Yes를 누르시면 됩니다.
다 되었으면 한번 만들어 보겠습니다.
Assets 하단에 우클릭 후 Create -> Input Action을 만들어줍니다.
만들고 더블클릭하시면 해당 화면이 나옵니다. Actions 옆 + 버튼을 눌러줍니다.
저는 여러개가 있지만 빈 Input 박스가 나옵니다.
생겨진 Input 박스의 이름은 Move로 하겠습니다.
그 후 2D 이동용이기 때문에 Action Type은 Value control Type은 Vector2로 잡았습니다.
Move에 우클릭하시면 해당 창이 뜹니다 거기에 2번째 상하좌우 Composite를 선택해줍니다.
그러면 상하좌우가 다 뜨시는데 저는 매드로배니아 2D 게임이기에 좌우만 사용하려고 상하는 삭제한 상태입니다.
그 후 3번째로 들어가셔서 path를 누르시고 해당 상응하는 키를 검색하셔서 등록을 해주면 끝입니다.
Player.cs 작성
플레이어의 정보를 가지고 있는 스크립트입니다.
중요한 정보이기에 해당 스크립트에 들어있는 정보는 대부분 읽기 전용으로 작동합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public float MoveSpeed { get { return moveSpeed; } }
public Rigidbody2D playerBody2D { get; private set; }
[SerializeField] protected float moveSpeed;
void Awake()
{
playerBody2D = GetComponent<Rigidbody2D>();
}
public void OnUpdateStat(float moveSpeed)
{
this.moveSpeed = moveSpeed;
}
이동 구현
이제 스크립트르 작성할 시간입니다
PlayerController.cs를 만들어 줍니다.
1
2
3
4
5
6
7
8
9
public Vector2 direction { get; private set; }
protected Player player;
public void OnMove(InputAction.CallbackContext context)
{
direction = context.ReadValue<Vector2>();
}
New Input system에 들어갈 메소드를 작성해줍니다.
OnMove는 입력을 받았을 때 호출되는 메서드입니다.
direction는 입력을 받았을 때 InputAction.CallbackContext context에 들어있는 Vector2값을 저장할 변수입니다.
실질적으로 움직임을 구현하는 메소드를 만듭니다.
지금과 같은 경우에 아무키도 안눌렀을 때는 [0,0], 오른쪽은 [1,0], 왼쪽은 [-1,0]이 됩니다
1
2
3
4
5
6
7
8
9
10
protected void Move()
{
direction.Normalize(); // 정규화
player.playerBody2D.velocity = new Vector2(direction.x * player.MoveSpeed, player.playerBody2D.velocity.y);
}
void FixedUpdate()
{
Move();
}
Move함수에서는 OnMove함수에서 변경된 값을 가지고와 실행합니다.
direction.Normalize();는 해당 값의 벡터의 크기를 1로 만드는 연산입니다.
방향을 나타내는 함수이기에 1이상이면 캐릭터의 움직임이 이상해 질수 있습니다.
그 후 초당 50의 고정적 프레임을 사용하는 FixedUpdate()에 Move()메서드를 실행합니다.
캐릭터에 등록하기
여기에서 봐야할 건 몇개 없습니다.
하단에 Add Component를 클릭하세요.
그리고 하단 컴포넌트를 넣어주시면 됩니다
- Play Input
- Rigidbody
- Collider
Rigidbody와 Collider는 해당 프로젝트에 맞게 넣으면 된다.
그리고 Play Input Actions에 아까 만든 Input System을 드래그앤 드랍해주시면 됩니다.
그리고 하단 Events -> PlayerAcions를 열면 해당 화면이 나옵니다.
아마 처음에는 List is Empty가 나오실 텐데 당황하지 말고 좌 하단에 +을 눌러줍니다.
그럼 칸이 생기실텐데 좌하단에는 해당하는 오브젝트를 넣어주시면 됩니다.
Name이라는 오브젝트에 스크립트와 Input을 붙였다면 Name을 드래그앤 드랍하면 된다.
그후 우 상단에 있는 칸을 클릭하고 메서드가 있는 스크립트를 찾아 해당 메서드를 클릭해주면 된다.
그럼 잘 작동합니다!
오늘의 정리
늘 직접 쓰는 옛 버전을 쓰다가 이번 신버전을 쓰니 매우 편리해졌다.
코드의 가독성도 좋아졌으며 매우 편했다.
그렇지만 조금은 복잡한 부분이 있었다.
처음 설정이 매우 복잡했다.
옛버전은 스크립트에서 작성을 하면 되는 반면 신버전은 사전작업이 많은게 조금 어려웠다. 하지만 익숙해지면 그 단점을 다 상쇄해줄수 있고도 남을 만큼 매우 매력적인 기능이였다.
그래서 내일은 점프와 대쉬 그리고 각종 상호작용 아이템을 제작해볼 예정이다.









