조건은 다음과 같습니다.
둘 다 가질 수는 없습니다. 왜? 엔터티 자체보다 높은 수준의 코드 (아래 예 참조)에 따라 엔터티를 사용해야하는시기가 결정되기 때문입니다. 결과적으로 동일한 수준의 코드 만 엔티티가 제거에 적합한 지 여부를 판별 할 수 있습니다.
그러나 일어날 수있는 일은 상위 레벨 코드가 수신하는 이벤트를 발생시켜 엔티티 가 자체 제거를 요청할 수 있다는 것입니다 . 그런 다음 상위 레벨은이 제거 요청을 목록에 저장합니다.
예 1 : 이벤트가없는 경우
세계의 엔터티 간 충돌을 확인하고 있습니다. 이것은 주로 주 게임 루프에서 더 높게 처리되어 모든 엔티티를 서로 비교합니다. 이 예에서 구체적으로, 엔티티가 다른 엔티티와 충돌 할 때 해당 엔티티의 내부 논리만으로 얼마나 많은 피해를 입 었는지, 그리고 "만료"되었는지 여부를 결정할 수 있습니다. 여러분의 세계에 A, B, C, D의 네 개체가있는 충돌에 대한 논리 흐름을 따르십시오. A는 우리가 우려하는 개체입니다.
A와 B의 충돌을 확인합니다. 충돌이 있습니다. A 데미지 50 %
A와 C의 충돌을 확인합니다. 충돌이 있습니다. A 데미지 50 % 피해가 0에 도달하기 때문에 A는 "죽었다"고 판단합니다. 목록에서 자신을 제거합니다.
A와 D의 충돌 여부를 검사합니다. 충돌은 없었지만 결코 도달하지 못할 것입니다. 엔티티 목록이 순회 조작 중에 수정 되었기 때문에 런타임 예외가 발생합니다.
예 2 : 이벤트
이전과 동일한 설정입니다.
A와 B의 충돌을 확인합니다. 충돌이 있습니다. A 데미지 50 %
A와 C의 충돌을 확인합니다. 충돌이 있습니다. A 데미지 50 % 피해가 0에 도달하기 때문에 A는 "죽었다"고 판단합니다. 엔터티 관리 코드에 이벤트를 발생시켜 "나를 최대한 빨리 제거하십시오"라고 말합니다. 엔티티 관리 코드는 이벤트의 일부로 전송 된 엔티티 참조를보고 해당 참조를 제거 할 엔티티 목록에 저장합니다.
우리는 A와 D의 충돌을 검사합니다. 충돌이 없으며 검사는 정상적으로 작동합니다.
이제 현재 게임 루프 반복의 마지막에서 제거 할 엔티티 목록을 실행하고 기본 엔티티 목록에서 이들을 모두 제거하십시오.
이것이 어떻게 문제를 완전히 피할 수 있는지 알 수 있습니다. 이벤트를 사용할 필요가없고 신호 나 다른 것을 사용할 수 있지만 원칙은 동일합니다. 안전하게 사용할 수있을 때까지 엔티티를 제거하지 마십시오. 일을 깨끗하고 질서있게 유지하기 위해이 접근 방식의 단점은 추가 할 엔티티와 동일하게 수행하는 것입니다. 참조를 유지하고 다음 게임 루프 반복 시작시에만 추가하십시오.
마지막으로 제거 할 목록과 추가 할 목록을 모두 사용하여 주 엔터티 목록에서 추가 / 제거를 수행 할 때마다 플러시해야합니다.
추신. 개별 삭제를 위해 기본 목록을 찾는 것을 두려워하지 마십시오. 그것은 엔터티 관리의 일부이자 소량이며 대량 목록조차도 순식간에 매우 빠른 경향이 있습니다.