스크립터블 오브젝트란 유니티 엔진에서 제공하는 데이터 컨테이너로 하나로,
스크립트 인스턴스와 별개로 대량의 공유 데이터를 저장할 수 있는 직렬화 가능한 Unity 클래스입니다. 스크립터블 오브젝트를 사용하면 변경 사항 및 디버깅을 더 쉽게 관리할 수 있습니다.
주요 특징으로는
주로 아이템, 능력치, 퀘스트 정보와 같은 게임 내 데이터 관리 등에 사용되며, 설정 값, 전역 변수 저장, 여러 오브젝트 간의 데이터 공유를 하는 것도 가능합니다.
또한 스크립터블 오브젝트는
모노비헤이비어를 상속받지 않은 클래스입니다.
그래서 MonoBehaviour와 다르게 씬에 존재하는 게임 오브젝트에 붙어있지 않으며, 게임 루프 내에서 직접적으로 호출되거나 업데이트되지 않습니다.
즉.
Scriptable Object는 주로 데이터를 저장하고 관리하는 역할을 하며, MonoBehaviour는 씬에서 게임 오브젝트의 동작을 제어하는 데 사용됩니다.
현재 저희 프로젝트에서는 아이템과 캐릭터 스텟 등에서 스크립터블 오브젝트를 사용하고 있습니다.
프로젝트 세이브 더 로티는 로그라이트 게임으로서,
다양한 종류의 아이템을 얻고 또 그 아이템들을 이용한 빌드를 짜는 재미를 노리는 게임입니다.
따라서 기획 팀이 제시한 아이템의 종류는 총 54가지가 있었으며, 또한. 추후 생길 확장성을 고려하지 않을 수 없었습니다.

아이템은 스탯에 영향을 주는 것과 특수한 효과를 일으키는 아이템 등으로 나뉘며.
기본적으로 스탯에 영향을 주는 아이템은 영향을 주는 스탯 데이터를 입력하여, 인벤토리에 추가할 때. 캐릭터의 능력치를 업데이트 하는 방식으로 구현되었습니다.
이러한 아이템 구조의 전체적인 틀은 함께 일하는 다른 프로그래머 분께서 담당하셨으며,
저는 기획팀에서 제공한 테이블에 맞춰 아이템을 만든 역할을 하였습니다.
현재 세이브 더 로티는 스탯을 강화시키는 아이템 외에, 추가적인 기능을 일으키는 아이템이 존재합니다.
이러한 아이템들의 특수 효과는 아이템 매니저를 구현하여, 일괄적으로 아이템 기능을 처리하게 하였습니다.

확률에 기반한 아이템을 획득할 때, 스크립터블 오브젝트로 만들어진 아이템 객체들은 게임 매니저 클래스에 직렬화되어 저장된 상태이며,
랜덤한 확률에 의거(특수 아이템이 존재할 경우에는 고등급 아이템까지 범위에 넣어 랜덤값 얻음)하여, 등급을 얻고.
등급과 일치하는 ID를 가지는 아이템을 리스트 형태로 가져와, 리스트 내에서 랜덤으로 Get하여 리턴하는 함수를 만들었습니다.

이렇게 얻은 아이템을 실제 인벤토리에 넣을 때,
특수 효과를 얻는 아이템들이 존재하는지 체크합니다.
예를들어,
특정 아이템을 획득할 경우에, 캐릭터 사이즈를 조절하거나.
이동 시에 잔상을 남기도록 합니다.
그밖에도 문을 통과 시에, 체력이 회복 되는 등의 아이템도 존재합니다.

위 코드는 플레이어 캐릭터의 사이즈를 조정하는 코드입니다.
클래프 메서드를 이용하여, 관련 아이템의 중첩으로 너무 사이즈가 작아지거나 커지는 걸 방지합니다.

잔상 이팩트는 플레이어블 캐릭터의 자식 컴포넌트가 부착되어, 아직 활성되지 않은 상태로 미리 구현된 상태입니다.
아이템이 존재할 경우에, 해당 아이템을 활성 상태로 변환하는 것으로 구현합니다.
