1인 개발/PushAndSlash

푸쉬앤슬래시 개인 프로젝트 17일차

잼잼재미 2024. 5. 29. 10:03

구현 내용


1. 캐릭터 스탯 밸런스 조절


각각 캐릭터의 등급별 스탯 밸런스 적용

 

 

2. 카메라 연출 효과 구현


https://kkln2486.tistory.com/424

 

오프닝 카메라 연출 효과 구현 (Dolly Track)

구현 방법1. 시네머신 추가 시네머신 카메라 추가  2. Dolly Track과 Virtual Camera 추가  3. Dolly Track 설정 카메라가 움직일 경로를 설정  4. Dolly Cart 설정 카메라 속도 설정  5. Virtual Camera 설정 Fo

kkln2486.tistory.com

 

전투맵 시작 시, 카메라 연출 효과 구현

 

 

3. 스테이지 추가 구현


20 스테이지까지 추가 구현

 

 

4. 비동기 씬 이동, 로딩씬 구현


 

https://kkln2486.tistory.com/276

 

로딩 씬 구현

로딩 화면이 필요한 이유게임 씬이 전환 될 때, 다음 씬에서 사용될 리소스들을 읽어와서 게임을 위한 준비 작업로딩 화면이 없다면 가만히 멈춘 화면이나 까만 화면만 보일 수 있음  구현 방

kkln2486.tistory.com

 

이전 프로젝트에서 구현했던 방법을 참고

 

 

트러블 슈팅


1. 인벤토리의 값 수정 시, 원본 데이터의 값도 수정


public class CharacterData
{
    public string Tag;
    public bool IsEquip;
    public int Level;
    public float Speed;
    public float Atk;
    public float Def;
}

public List<CharacterData> CharacterInventory;
public CharacterData[] CharacterDatas;

if (!CharacterIsGet(_data)) 
{
	GameManager.I.DataManager.DataWrapper.CharacterInventory.Add(_data);
}

 

캐릭터들의 전체 데이터를 다음과 같이 class의 배열로 관리하고, 캐릭터 데이터를 관리하는 List를 생성했다. 그리고 캐리터 뽑기 진행 시, List에 존재하지 않는 데이터라면, List에 추가하도록 인벤토리를 구현했다.

 

이렇게 구현한 이유는 배열 데이터는 원본 데이터를 가지고 있고, 게임 진행을 플레이하면서 바뀌는 데이터는 인벤토리에 저장하기 위해서이다. 하지만 인벤토리 데이터의 레벨에 따라 스탯을 변경했는데, 원본 데이터도 함께 변하는 버그가 발생했다. 그 이유는 class가 Heap영역에 할당되고 참조 형식이기 때문이다. C# 이론 공부를 할 때, 정말 기본적인 내용으로 수없이 반복해서 들었던 내용이고, 분명히 블로그에도 기록했던 내용인데 이 부분에서 거의 하루라는 시간을 날려먹었다..

 

이러한 문제점을 해결하기 위해서는 몇 가지 방법이 있다.

  1. struct 사용
  2. 별도의 인벤토리 List를 사용하지 않기
  3. class를 참조하지 않고 값 형식 복사
  4. class에 수정하지 않을 원본 값을 추가

 

1번 방법은 현재 사용하고 있는 Easy Save 에셋이 class 형식을 저장할 수 있도록 설정이 되어있고, struct 형식도 저장이 가능하지만, 별도의 설정이 필요하기 때문에 사용하지 않았다.

2번 방법은 인벤토리 List를 사용하지 않고 각각 데이터마다 IsGet이라는 bool 값을 설정하는 방법인데, 매번 캐릭터의 전체 데이터를 순회하여 캐릭터를 가지고 있는지 판단하기 때문에 비효율적이라고 판단 했다.

3번 방법은 class는 참조 형식으로 heap 영역에 할당되기 때문에 복사를 하고 수정하게 되면 원본 데이터도 함께 수정 되기 때문에, class를 값 형식으로 복사하는 별도의 방법이 필요했다. class 내부에 메서드를 추가해서 값 형식으로 복사하는 깊은 복사 방법이 있었지만, 객체의 내부까지 모두 복사하는 복잡한 깊은 복사를 굳이 구현하는 것은 비효율적이라고 판단했다.

그래서 4번 방법인 class에 캐릭터의 스탯의 초기값에 해당하는 원본 데이터를 추가했다.

 

 

public class CharacterData
{
    public string Tag;
    public bool IsEquip;
    public int Level;
    public float Speed;
    public float Atk;
    public float Def;
    public float OriginSpeed;
    public float OriginAtk;
    public float OriginDef;
}

 

 

근본적인 해결 방법은 아니었지만, 현재 상황에서 가장 합리적인 방법이라고 생각했다.

 

 

회고


전체적인 게임 밸런스를 조절하고 게임의 마지막 정리를 했다. 특히, 전투씬을 시작할 때, 카메라 연출 효과를 구현했는데, 한번씩 효과가 실행되지 않는 버그가 발생했다. 그래서 예전 프로젝트에서 구현했던 로딩씬을 구현했는데, 비동기로 씬 이동을 하기 때문에 씬 이동 전 충분한 준비를 할 수 있어서 버그가 해결되었다. 하지만 로비씬에서 전투씬의 로딩씬 이동은 잘 작동했지만, 전투씬에서 로비씬의 이동은 작동이 되지 않았다. 내일은 이 버그를 해결하고 멀티 플레이 구현을 시작하도록 하겠다!