Unity - 사전합반 프로젝트 16

땡구의 개발일지·2025년 7월 7일

Unity마스터

목록 보기
60/78

깊은복사, 얕은복사 문제

✅ 요점 정리
EquipInfo가 struct이기 때문에
equipData[i].level = 1; 처럼 직접 수정해도 실제 배열 내부 값은 변경되지 않습니다.

struct는 값 타입이라, 배열에서 꺼내오면 복사본이 되기 때문입니다.

따라서, 수정하고 다시 배열에 넣어주는 방식이 반드시 필요합니다.

✅ 예시 비교
❌ 이런 방식은 작동안 함:
csharp
복사
편집
equipData[i].level = 1; // 복사본의 필드만 바꾸는 것이기 때문에 반영되지 않음
✅ 이렇게 해야 함:
csharp
복사
편집
EquipInfo tmp = equipData[i];
tmp.level = 1;
equipData[i] = tmp; // 다시 배열에 대입해야 변경사항이 저장됨
✅ 왜 struct는 이렇게 동작할까?
C#에서 struct는 값 타입이고, 배열이나 리스트에서 꺼내면 복사본이 만들어집니다.
따라서 equipData[i]는 복사본이며, 필드를 바꿔도 원본 배열 내부의 값은 변경되지 않습니다.

✅ 해결 방법은 2가지
① 지금처럼 계속 struct로 쓰되, 수정 후 다시 대입하는 방식 유지
csharp
복사
편집
EquipInfo tmp = equipData[i];
tmp.level = 1;
equipData[i] = tmp;
② EquipInfo를 class로 바꿔서 참조 타입으로 사용
csharp
복사
편집
public class EquipInfo
{
public int id;
public int level;
// ...
}
→ 이렇게 하면 equipData[i].level = 1; 만으로도 원본이 바뀜
→ 다만, class는 GC 부하가 있고, 값 복사와 무관한 로직에서는 주의 필요

✅ 추천 방식은?
장비 수가 많지 않고 메모리 효율이 중요하지 않다면 class로 바꾸는 것이 편합니다.

그러나 명확한 복사나 데이터 스냅샷이 필요한 경우라면 struct 유지가 유리합니다.
(예: 스탯 연산 중 임시 계산, Undo 기능 등)

✍️ 결론
struct일 경우는 필드 값 수정 후, 다시 배열에 대입해야 원본이 바뀝니다.
class라면 참조 타입이므로 직접 수정 가능합니다.


장비

  • 장비 탈착과 UI에 기능 연결 완료
  • 세이브 연동 필요 -> 완료
  • 강화 구현 진행 중 -> 완료
  • 강화 이후(캐릭터포함) 가챠 진행

UI

캐릭터 테두리

가챠

이미 보유시 골드 +10

애니메이션

컷씬 삽입 = 유니티 비디오 플레이어 -> 렌더텍스쳐. 이벤트 함수로 기능 연결 가능

플레이어 그림자 추가

그냥 이미지를 하위로 박아넣는다

맵 구름 추가

맵 에셋 제작 시, 구름을 추가해서 조금 더 사실적으로 만듦

profile
개발 박살내자

0개의 댓글