스크립터블 오브젝트 값이 변하는 이유

2024. 11. 7. 15:56카테고리 없음

스크립터블 오브젝트 값이 변하는 경우

스크립터블 오브젝트(ScriptableObject)의 데이터가 게임이 끝난 후에도 변경된 상태로 남아 있는 경우초기값으로 돌아가는 경우가 있는 이유는 주로 얕은 복사 깊은 복사 개념 때문입니다. 유니티 에디터에서 플레이 모드실제 빌드된 게임에서 스크립터블 오브젝트가 다르게 동작하는 이유도 여기에 있습니다.

스크립터블 오브젝트의 값 변화 이해하기

  1. 에디터(플레이 모드)에서의 동작
    유니티 에디터에서 플레이 모드로 게임을 실행할 때는, 스크립터블 오브젝트의 값이 직접적으로 수정되는 것처럼 보입니다. 이렇게 수정된 값이 유니티 에디터에 저장된 것처럼 보이지만, 이는 실제로 에디터에서만 발생하는 현상입니다. 플레이 모드가 끝나면 에디터에서는 마지막으로 수정된 값이 남아 있는 것처럼 보이지만, 이는 실제 빌드에서는 적용되지 않습니다.
  2. 빌드에서의 동작
    빌드된 게임에서는 스크립터블 오브젝트가 원본 데이터로만 사용되고, 게임 도중에 변경된 값은 초기값으로 돌아갑니다. 빌드된 환경에서는 플레이 모드와 달리 스크립터블 오브젝트의 데이터가 변하지 않기 때문에, 변동하는 데이터는 초기값만 유지하게 됩니다.

 

해결 방법: 스크립터블 오브젝트의 원본 데이터를 복사하여 사용하기

이러한 차이로 인해 데이터 변경이 필요할 경우 스크립터블 오브젝트의 원본을 직접 사용하는 것은 적절하지 않을 수 있습니다. 대신, 원본 데이터를 복사본에 저장한 후, 복사본을 통해 값을 처리하면 플레이 모드와 빌드 환경 모두에서 안정적인 동작을 보장할 수 있습니다.

이를 위해 다음과 같은 절차를 사용합니다:

  1. 복사본 생성
    스크립터블 오브젝트의 데이터를 복사하여 사용할 임시 복사본을 만듭니다. 이 복사본은 플레이 모드에서나 빌드 환경에서 모두 동일하게 동작합니다.
  2. 복사본으로 데이터 처리
    스크립터블 오브젝트 원본 데이터는 게임 중에 변경하지 않고, 필요한 데이터만 복사본을 통해 읽고, 수정합니다. 이를 통해 플레이 모드와 빌드 환경에서 일관된 데이터를 유지할 수 있습니다.

 

깊은 복사와 얕은 복사 개념

- 얕은 복사는 데이터를 복사할 때 참조만 복사하는 방식이라, 원본과 복사본이 같은 데이터를 가리킵니다. 이 때문에 복사본에서 값을 변경하면 원본도 영향을 받습니다.

- 깊은 복사는 원본 데이터의 모든 값을 새롭게 복사하여 복사본을 만듭니다. 이 경우 복사본이 원본과 별개로 독립적으로 존재하므로, 복사본의 값이 변경되어도 원본에는 영향을 미치지 않습니다.