● 오늘 할일
커스텀 캐릭터데이터 관리 (ScriptableObject 사용)데이터 저장
● 오늘의 트러블 슈팅
#1 Json 역직렬화 문제
데이터 관리를 ScriptableObject를 사용해서 해보기로 하였다.
ScriptableObject를 상속받은 클래스를 담은 딕셔너리를 데이터 매니저에서 선언을 하였다.
딕셔너리가 담긴 데이터매니저를 저장하기 위해 Json으로 역직렬화 하는 코드를 작성하였다.
에디터를 실행 해보니 TLS Allocator 오류가 나왔다.
원인을 찾아보니
데이터 매니저가 MonoBehaviour를 상속받고 있기때문에 JSON으로 역직렬화가 불가능 했었고
MonoBehaviour를 new() 하고 있었다.
저장할 데이터 리스트는 따로 SaveData라는 클래스로 빼서 수정해주었다.
코드를 수정해서 TLS Allocator오류는 사라졌지만 다시 또 에러가 나왔다.
확인을 해보니 ScriptableObject을 상속받은 클래스는 역직렬화가 불가능했다.
JsonConvert.DeserializeObject<T>()는 내부적으로 new ()을 호출하여 인스턴스를 만들려고
시도하기 때문에 오류가 발생하는거였다.
그 외에 Interface,추상 클래스도 역직렬화가 불가능했다.
순수 C# 클래스만 되는것같았다.
순수 클래스인 ItemData 클래스를 따로 만들고
ScriptableObject을 상속받은 Item클래스에서 ItemData으로 변환해주는 함수를 작성해주었다.
역직렬화를 무시하고 싶은 변수에는 [JsonIgnore] 를 써주었다.
public ItemData ToItemData()
{
return new ItemData
{
Id = this.Id,
ItemName = this.ItemName,
Description = this.Description,
Type = this.Type,
MaxCount = this.MaxCount,
};
}
무사히 해결했다!!!!
#2 맵 벽과 충돌하면 미끄러지는 문제
벽과 충돌하면서 플레이어를 이동시켜보다가 미끄러지는 문제를 발견했다.
▼문제 영상
충돌 처리에 문제가 있는것 같아서 여러가지 방법을 써보았다.
- Physics Material 2D
Physics Material 2D 를 생성해서 Friction (마찰)을 높게 설정해주고 플레이어 Rigidbody2D의
Material에 설정을 했는데도 여전히 미끄러졌다.
- Rigidbody2D 값 조정
▼위 사진 설명
Linear Drag : 포지션 움직임에 영향을 미치는 저항계수
Angular Drag : 회전 움직임에 영향을 미치는 저항계수
Collision Detection :콜라이더 2D 간의 충돌을 검사하는 방식
Continuous : 리지드바디 2D와 콜라이더 2D가 포함된 게임 오브젝트가 서로 통과하지 않게 한다.
대신 Discrete보다 더 많은 CPU 시간을 사용한다.
🔍 Linear Drag 값이 낮으면?
- 기본값 0이면 전혀 감속되지 않고 계속 이동함.
- 마찰이 없는 얼음 위를 걷는 것처럼 캐릭터가 멈추지 않고 계속 움직일 수 있음.
🔍 Linear Drag 값이 높으면?
- 값이 10 이상이면 너무 강한 감속이 걸려 이동하자마자 급격히 멈춤.
🔍 Angular Drag 값이 낮으면?
- 기본값 0이면 회전에 대한 저항이 전혀 없음.
- 충돌 시 물체가 계속 회전할 수 있음.
🔍 Angular Drag 값이 높으면?
- Angular Drag 값이 10 이상이면 거의 회전 불가능.
- 캐릭터가 넘어지지 않도록 강제적으로 안정적인 상태를 유지할 수 있음.
위 사진과 같이 설정을 해서 확인을 해봤다.
미끄러지는 정도는 줄어들었지만 Continuous 충돌 방식이 CPU를 많이 사용하기 때문도 있고
여전히 미끄러졌기떄문에 다른 방법을 사용해보기로 했다.
- 플레이어의 회전축을 고정
아래와 같은 코드를 적어서 확인을 해보았다.
m_Rigidbody.constraints = RigidbodyConstraints2D.FreezeRotation;
더이상 미끄러지지는 않았지만 중간 중간 어디에 걸린듯 이동이 불가능한 곳이 있었다.
- CompositeCollider2D 설정
여러 개의 콜라이더를 하나의 콜라이더로 취급하기 위해서 타일맵에 CompositeCollider2D를 설정해주었다.
위와 같이 설정해주니 해결되었다!!
'과제' 카테고리의 다른 글
[Unity,C#] 메타버스 제작 과제 4일차 (0) | 2025.02.20 |
---|---|
[Unity,C#] 메타버스 제작 과제 3일차 (0) | 2025.02.19 |
[Unity,C#] 메타버스 제작 과제 1일차 (0) | 2025.02.17 |
[TextRPG-팀 프로젝트] 기반 설계 (0) | 2025.02.10 |
[TextRPG-팀 프로젝트] 데이터 관리,퀘스트 구현 (0) | 2025.02.10 |