몬스터나 플레이어의 기본 공격을 포함한 스킬은 공격 판정 오브젝트와 SkillData를 이용한다.
SkillData에는 공격 판정 오브젝트의 생성 위치, 이동 속도, 데미지 계수, 멀티 공격 숫자 등이 있다.
몬스터가 사용할 스킬들을 이 SkillData로 만들고 그 ID들을 MonsterData가 List로 갖고 있다.
Attack 상태에 들어가면 각각의 몬스터가 사용할 스킬(공격 포함)을 Monster의 SkillList에서 index를 이용해 가져와 공격 판정 오브젝트를 생성한다. 그리고 index를 이용해 Animator에서 int parameter로 설정된 각 스킬의 animation을 실행해준다.
// MonsterData의 스킬 리스트에서 스킬을 지정할 index 값 설정
Monster.SelectSkillIndex();
// 지정된 스킬의 애니메이션을 실행
animator.SetInteger("SkillIndex", skillIndex);
// index로 찾은 SkillData ID
int skillDataID = DataManager.Instance.Skill.GetSkill(Monster.data.skillList[Monster.skillIndex]).ID;
CreateSkill(skillDataID);
이렇게 하면 몬스터마다 SelectSkillIndex() 메서드에서 SkillIndex를 정하는 로직을 다르게 설정하여 서로 다른 공격 및 스킬 사용 패턴을 설정할 수 있다.
참조 형식과 값 형식에 대해 설명해주세요.
값 형식의 변수는 형식의 인스턴스(값)를 저장하고 있고, 참조 형식의 변수는 형식의 인스턴스에 대한 메모리 주소를 저장하고 있다. 값 형식 변수1에 다른 값 형식의 변수2를 할당하면 변수2의 값에 대한 복사본을 자신의 값으로 저장(깊은 복사)한다. 이후 변수2의 값이 바뀌어도 다시 할당하지 않는 이상 변수1의 값은 변하지 않고 반대도 마찬가지다.
참조 형식의 변수가 선언되고 해당 형식의 인스턴스가 할당되었을 때, 인스턴스는 힙 메모리에 저장되어 있고, 변수는 힙 메모리에 있는 인스턴스의 주소를 저장하고 있다.
참조 형식의 변수a에 다른 참조 형식 변수b를 할당하면 변수b가 가리키는 인스턴스의 메모리 주소를 가져오기 때문에(얕은 복사) 변수a에서 변경된 것이 변수b에도 반영된다.
값 형식은 스택 메모리에 저장되고, 참조 형식은 힙 메모리의 저장된다.
메모리에서 스택과 힙의 차이점에 대해 설명해주세요.
스택은 후입선출의 구조로 Push를 통해 데이터를 쌓고, Pop을 통해 가장 위에 쌓인 데이터를 빼는 방식으로 메모리를 관리한다. 함수가 호출될 때 생성되는 지역 변수와 매개 변수가 스택 영역에 저장되고 함수 호출이 완료되면 메모리에서 해제한다. 데이터 접근 방식이 단순하여 데이터 접근 속도가 빠르고, 메모리가 자동적으로 할당 및 해제되기 떼문에 메모리를 효율적으로 관리할 수 있다는 장점이 있지만, 크기가 제한적이어서 초과하면 스택 오버플로우가 발생할 수 있다.
힙은 스택과 다르게 런타임 중에 동적으로 할당되는 메모리를 관리하는 메모리 영역이다. 할당된 메모리의 해제는 GC(가비지 컬렉터)에서 하는데, 해제가 제때 이루어지지 않는 경우 메모리 누수가 발생할 수 있다.
스택과 힙의 가장 큰 차이점은 메모리 할당과 관리 방법에 있다. 스택은 정적 메모리 할당으로, 컴파일 시간에 메모리 크기가 결정되며, 함수 호출 시 자동으로 메모리가 할당되고 해제된다.
반면, 힙은 동적 메모리 할당으로, 프로그램 실행 중에 메모리 크기가 결정된다. 스택보다 유연하지만, 메모리 관리에 주의해야 한다.
스택은 속도가 빠르고 메모리 관리가 간단하지만, 크기에 제한이 있어 스택 오버플로우 오류가 발생할 수 있다. 힙은 메모리 크기가 유동적이지만, 메모리 누수와 같은 문제를 주의해야 한다.
1번과 2번 질문의 답안을 기반으로 struct와 class의 차이점에 대해 설명해주세요.
struct는 값 형식으로 스택 영역에 할당되고, class는 참조 형식으로 힙 영역에 할당된다.
struct는 값 형식이기 때문에 다른 struct 변수에 인스턴스를 전달하면 복사된 새로운 인스턴스가 생성된다. 복사본이기 때문에 원본에 영향을 주지 않고 변경을 할 수 있다.
반면 class는 참조 형식이기 때문에 클래스의 인스턴스를 다른 변수가 참조하여 변경할 경우 원본 인스턴스가 변경된다.
struct는 스택 영역에서 자동으로 관리되어 성능면에서 장점이 있지만 스택 메모리의 크기가 한정적이기 때문에 스택 오버플로우 오류에 주의해야 한다. class는 힙 영역에서 동적으로 할당되어 메모리 크기를 유동적으로 관리할 수 있지만, CG의 영향을 받기 때문에 메모리 관리에 주의해야 한다.