[240118]TIL

응징·2024년 1월 18일
0

TIL

목록 보기
18/36
post-thumbnail

.gitignore 위치 문제

오늘 나를 하루종일 괴롭혔던 문제. 앞으로 학습하면서 매번 깃허브에 올리기 번거롭다고 생각해 하나의 큰 SpartaStudy 디렉터리를 만들고 그 파일을 Git과 연동해 게임1, 게임2 로 만들 생각이었으나 문제가 생겼다.

이제껏 유니티를 레포지토리로 만들 때 한번도 생긴적 없었으나 갑자기 100MB 를 넘었다고 문제가 생겼다. 이전까진 unity 프로젝트가 100MB 넘었어도 한번도 본 적이 없어서 검색해서 알아본 결과 처음에는 LEB가 제대로 안깔린 건 줄 알았다.

당연히 원인은 LEB문제가 아니었고 결국 염예찬 튜터님의 도움으로 원인을 알아냈다.

원인

[gitignore 위치]

[gitignore 내부]

gitignore 파일은 Git 저장소에서 추적하지 않을 파일이나 디렉토리 패턴을 정의하는 데 사용한다

Unity 게임 엔진 프로젝트에서 자주 사용되는 위 파일들은 대부분의 중간 생성물이나 캐시 파일이나 빌드 관련 디렉토리를 포함하고 있기 때문에 이러한 파일이나 디렉토리를 Git 저장소에 추가하지 않도록 설정하는 곳이 gitignore 내부이다. 이것은 Git 저장소의 크기를 줄이고 불필요한 파일들을 저장소에 추가하는 것을 방지할 수 있도록 하는 것이다.

그런데 gitignore파일은 현재 디렉토리 내에서 추적하지 않는 파일을 나열한 것인데 나는 그 루트 파일에 gitignore 을 두니 문제가 되는 것이었다. gitignore에서 TopDownShooting/Librarysk식으로 하면 문제는 해결 될 수도 있지만, Pong과 TopDownShooting 두개를 관리 해야하니 그냥 레포지토리를 따로 나누어서 문제를 해결했다.

TopDownShooting

MonoBehaviour 클래스

  1. Awake: 게임 오브젝트가 생성될 때 호출되는 메서드. 주로 초기화 작업
  2. Start: 게임 오브젝트가 활성화되어 게임 루프가 시작될 때 호출되는 메서드. 초기 설정 및 시작 작업을 수행
  3. Update: 매 프레임마다 호출되는 메서드로, 게임 로직의 주요 업데이트가 이루어짐
  4. FixedUpdate: 물리 엔진 업데이트 시 호출되는 메서드. 물리적인 시뮬레이션에 관련된 작업을 처리할 때 사용됩니다.
  5. LateUpdate: Update 메서드 호출 이후에 호출되는 메서드. 다른 오브젝트의 업데이트가 완료된 후에 작업을 수행하는 데 유용합니다.
  6. OnEnable: 게임 오브젝트가 활성화될 때 호출되는 메서드입니다.
  7. OnDisable: 게임 오브젝트가 비활성화될 때 호출되는 메서드입니다.
  8. OnDestroy: 게임 오브젝트가 파괴될 때 호출되는 메서드입니다. 자원 정리 및 해제 작업이 수행됩니다.

Input Action & CS (델리게이트 활용)

Input Action 설정

[Add control schame]

  • 어떤 입력을 받을지 미리 처리하는 것 같다
    이번 경우엔 키보드나 마우스로 입력을 받을것을 명시

입력 받은 값을 value로 처리할지 Button으로 처리할지 선택

마찬가지로 Look, Fire 액션 역시 value값으로 받아 vactor2(Fire 제외)로 컨트롤 한다.
이러한 내용은 아래 항목에서 계속

Input Action Control

Unity Input System 바인딩

using UnityEngine.InputSystem;
public void OnMove(InputValue value)
{
   	Vector2 moveInput = value.Get<Vector2>().normalized; 
 	CallMoveEvent(moveInput); 
}

Unity Input System에 따라서 InputAction을 설정하면 InputValue를 받을때 자동으로 바인딩되서 굳이 내가 설정하지 않아도 두 개체가 연결된다. 이 때문에 UPDATE 문에서 OnMove함수를 실행하지 않았음에도 OnMove가 실행이 되는 것이다.

Vector2 moveInput = value.Get().normalized;

여기서 Get은 Unity Input System에 따라 입력한 값이 'W'라면 Input Action객체와 연결되어 형태의 value값을 가지고 온다.

때문에 앞서 Input Action에서 control 할 값을 vector2로 설정한 것이다.

여기서 Vector2.normalized를 하여 1로 고정, 따라서 CallMoveEvent는 플레이어의 방향 백터만을 파라미터 값으로 받는다.

event 변수 델리게이트

public event Action<Vector2> OnMoveEvent;
  
public void CallMoveEvent(Vector2 direction)
{
   	OnMoveEvent?.Invoke(direction);
}

OnMoveEvent는 델리게이트로 연결할때 사용하기 위한 event변수이다. 만약 CallMoveEvent 함수가 실행된다면 OnMoveEvent에 델리게이트로 등록된 모든 메소드에게 direction 값을 준다

private void Start()
{
	_controller.OnMoveEvent += Move;  
}
private void FixedUpdate()  //물리처리가 끝난이후 처리 
{
	ApplyMovment(_movementDirection);
}
private void Move(Vector2 direction)
{
	_movementDirection = direction; 
}

private void ApplyMovment(Vector2 direction)
{
	direction = direction * 5;
	_rigidbody.velocity = direction; //velocity가속도
}

CallMoveEvent(moveInput);

앞서 OnMove 함수에서 CallMoveEvent를 호출 하기 때문에 OnMoveEvent로 Move또한 호출된다. Move는 플레이어의 방향 백터를 업데이트 하는데 그 변수를 ApplyMovment가 방향 백터에서 가속도*5f를 주게 된다.

로직 정리

  • OnMove함수에서 키 값을 입력 받으면 그 방향 벡터를 CallMoveEvent함수에 줌

  • OnMoveEvent에 연결된 CallMoveEvent함수가 실행되면 방향 벡터를 연동된 Move함수에 줌

  • 방향 벡터를 받은 Move는 그 벡터를 계속 업데이트 함

  • ApplyMovment에서 업데이트되는 벡터에 가속도*5를 줌

    결론적으로 키값을 입력 받을 동안 플레이어가 방향벡터로 가속도를 받아 동작한다.

&

깃허브에 시간을 너무 소비함. 30분 동안 고민 해봤으면 그냥 튜터님한테 달려가도록 하자.

[내일 일정]

unity 게임 개발 입문 완강
unity TopDownShooting게임 만들고 가기(이거 하지 않으면 잠 못자)

profile
Unity 개발 위주로 정리합니다

0개의 댓글