확장팩 FFF 모음 정리 링크




https://www.factorio.com/blog/post/fff-379


FFF #379 - 추상적인 전선 연결

게시자 boskid, StrangePan, Klonan

2023-10-06에 게시됨



둘러보겠습니다. 저기가 실험실 테이블이고 여기가 작업용 의자예요. 그리고 저쪽은 행성 간 우주 플랫폼입니다! 그리고 여기에는 다양한 길이의 와이어가 보관되어 있습니다.


와우! 진짜 살아있는 우주 플랫폼이네요!


저희가 직접 디자인했어요. 우리가 사용한 다양한 길이의 와이어를 보여드리겠습니다.


(역주: 퓨처라마 패러디 대사)



전신주 개선 - boskid


이 글은 기능을 추가할 때 고려해야 할 사항의 이면을 엿볼 수 있는 기술적 여정에 가깝습니다. 더 많은 기능을 허용하기 위해 재작업해야 했던 기능 중 하나인 수동 고스트 와이어와 연결될 것입니다.



기술적 출발점


구리선이 처음 게임에 구현된 흔적은 2013년의 0.2.10 버전에서 볼 수 있으며, 실제로 2020년의 1.0.0 버전까지 살아남았습니다.

전신주 사이의 구리선의 연결은 다른 전신주를 가리키며 "나는 이 전신주에 연결되어 있습니다"라고 표시하는 타겟터에 불과했습니다.






전신주가 다른 전신주를 가리키는 단순한 연결입니다.


더 정확하게 말하면, 정적 벡터가 동적 벡터보다 더 최적화에 좋기 때문에 각 전신주에는 정확히 5개의 타겟이 있었습니다.






팩토리오 1.0.0의 전신주. 전신주 고스트와는 구리선이 연결되지 않았습니다.


전신주가 파괴되면 엔티티 고스트 '껍질'에 "숨겨진" 엔티티가 여전히 네트워크에 연결되어 있다고 가정할 수 없기 때문에 그 전신주로 연결되는 모든 구리선을 끊어야 했습니다.






연결과 관련된 논리가 혼동될 수 있으므로 실제 전신주는 고스트 내부의 전신주와 직접 "정상" 연결될 수 없습니다.


하지만 블루프린트에서 와이어 연결(일반 및 회로 모두)을 할 수 있도록 하려면 고스트에서 실제 엔티티로 특수한 일방 연결을 추가해야 했습니다.




고스트가 연결된 엔티티를 추적할 수 있는 특수 데이터 구조입니다. FFF 362에 포함되었으며 1.1에 출시되었습니다.




둘 다 고스트인 경우 이 특수 연결을 양방향으로 사용했습니다.



기본 전신주 기능을 방해하지 않으면서 고스트에 새로운 가능성을 '붙였기 때문에' 처음에는 좋은 해결책처럼 보였습니다. 즉, 실제 전신주 로직과 고스트와 관련 로직사이에는 아무런 연관 관계가 없습니다.


그러나 실제로 이 솔루션은 특수한 사례가 쌓이기 시작하면서 문제가 생기기 시작했습니다.


- 신주가 파괴되면 고스트가 그 전신주와 연결되어 있지 않은지 확인하고 대신 새로운 고스트가 포함된 전신주로 연결을 업데이트해야 합니다.

- 전신주가 부활하면 인접한 고스트도 업데이트해야 합니다.

- 청사진을 만들 때는 청사진의 전선을 엔티티와 고스트에서 수집해야 합니다.

- 고스트 또는 실제 연결에 관계없이 두 사물이 연결되어 있는지 확인해야 하는 로직에서는 연결이 존재할 수 있는 모든 가능한 방법을 확인해야 합니다. 이는 와이어 드래그, 자동 연결, 제거 후 재연결 등에 적용됩니다.

- 그리고 이것은 시작에 불과합니다. 전신주만 고려한 거거든요.


전원 스위치도 있습니다. 스위치+전신주 연결도 5개 연결 제한이 없는 맞춤형 방식으로 이루어졌습니다.




전원 스위치를 악용하여 전신주를 6개나 연결했습니다.


따라서 연결이 저장되는 위치의 수와 상호 작용할 수 있는 조합은 프로그래밍의 악몽이었으며, 전선이 다르게 작동하는 특수한 케이스가 항상 발생하는 주된 이유였습니다.


회로 전선에도 비슷한 제한이 적용되었습니다. 회로 커넥터는 다른 실제 회로 커넥터에 대한 연결만 저장할 수 있었기 때문에 고스트가 생성되면 단방향 연결만 가능했습니다.

즉, 회로선과 관련된 특수 로직과 그 처리도 이 모든 것들로 인해 망가졌습니다.



한계점


이 시점에서 저는 고스트 전신주에 전선을 수동으로 추가할 수 있게 해달라는 요청을 받았습니다. 고스트 와이어를 추가하기 위해 어떤 함수를 호출해야 하는지 확실하게 알 수 없었던 하루가 지나고 나서 저는 기술 문제가 너무 많다고 판단했습니다.

재작업이 임박했습니다!


모든 것을 버리고 모든 문제를 한 번에 안정적으로 해결할 수 있는 완전히 새로운 디자인을 제안해야 했습니다.



실현


고스트 내부의 '죽은' 개체를 절대 가리키지 말아야 한다는 기존의 복잡한 규칙이 쓸모가 없다는 것이 분명해지기 시작했습니다.

이 오래된 규칙을 깨고 간소화할 수 있는 가능성을 발견하기 시작하자, 이것이 우리가 가야 할 길이라는 것이 점점 더 분명해졌습니다.

고스트가 정상 연결 시스템에 포함될 때 혼동하지 않도록 전신주 연결 로직을 변경하는 것이 우리가 계속 두려워했던 것이 기본적으로 몇 가지 가정에 불과하다는 것이 밝혀졌습니다.

즉, 이 로직을 변경하지 못하도록 전체 인프라를 구축했는데, 그 인프라는 단순히 기존 로직을 변경하는 것보다 압도적으로 복잡했습니다.


우리는 그것이 좋은 프로그래밍 설계라고 생각했지만 잘못된 길로 인도했습니다.




통합


실제 전신주, 고스트, 전원 스위치, 회로선 등 모든 것이 같은 방식으로 연결될 수 있었기 때문입니다. 모든 관련 연결 로직을 하나의 WireConnector 클래스로 캡슐화하여 기존 방식에 비해 모든 것을 엄청나게 간단하게 만들 수 있었습니다.




모든 변경 사항으로 인해 이와 같은 설정이 이제 가능합니다.



조금이라도 개선할 수 있는 상호작용도 몇 가지 있었습니다. 회로선이 있는 전신주를 드래그하면 전선도 함께 드래그됩니다.




또한 회로 배선이 달린 전신주의 연결도 일반 전신주의 배선과 같은 방식으로 간단히 수행할 수 있습니다.






결과


그리고 마침내 2주간의 재작업 끝에. 저는 앉아서 플레이어가 고스트 형태에서도 전신주를 수동으로 연결할 수 있도록 원래 작업을 완료했습니다.

몇 분 밖에 걸리지 않았습니다.



내 전선은 어디에 있습니까? - StrangePan


전선에 대해 말하자면, 게임이 전선을 그리는 그래픽 방식에서 몇 가지 이상한 점을 발견했습니다.


- 삽입기나 상자와 같이 먼 거리에 있는 두 개의 "높이가 낮은" 개체를 연결하는 전선이 현실보다 훨씬 아래로 처져 있었습니다.

- 그리고 저 그림자는 뭐죠? 다른 모든 그림자는 동쪽으로 늘어나는데 왜 이 그림자는 남쪽으로 처지는 것일까요? 물리학은 그렇게 작동하지 않습니다!


이러한 요소들이 결합되어 전선이 게임 세계에서 제자리에 있지 않고 화면에 붙어있는 것처럼 보입니다. 이 문제를 해결해 봅시다.


게임은 2D이지만, 연결 지점과 그림자 연결 지점 사이의 관계인 전선 연결의 상대적인 '높이'에 대한 힌트가 있습니다. Lua 정의에서 이 두 가지 오프셋을 사용하여 존재해야 하는 최대 와이어 처짐을 추정할 수 있습니다.




전선의 위치를 더 잘 전달하기 위해 두 개의 짧은 엔티티 사이에 연결된 회로 전선은 이제 바닥에 닿을 때까지만 처집니다.





이제 전선 그림자가 태양을 향해 처집니다. 다른 그림자와 함께 볼 때 더 자연스럽고 이질감이 덜합니다.


이 두 가지 변경 사항을 함께 적용하면 게임 월드 내에서 전선의 높이와 공간이 더욱 일관성 있게 느껴집니다.





조합기 간의 장거리 연결은 한 눈에 더 읽기 쉬워야 합니다.





한 번 개선된 모습을 보고 나면 예전의 잘못된 부분이 훨씬 눈에 잘 띄죠.

중간 퀴즈: 다음에 고칠만한 그림자 버그를 찾아내실 수 있을까요?



비디오 게임의 그래픽, UI 디자인, 컨트롤 등의 작은 불일치는 대부분의 플레이어가 그 이유를 정확히 설명할 수 없더라도 플레이 경험을 손상시킬 수 있습니다. 대부분의 플레이어는 전선이 변경된 것을 눈치채지 못하지만, 결국에는 모든 플레이어가 전선을 보게 되고 무의식적으로 이점을 누리게 됩니다. 가끔 시간을 내어 아주 사소한 부분이라도 개선하면 좋은 게임을 만드는 데 큰 도움이 될 수 있습니다.


보너스로, 해당 주제에 대한 역사적인 버그 보고서 중 일부를 종결할 수도 있습니다.




추상적인 아이템 - 클로난


팩토리오의 아이템은 대부분 평범한 것들로, 재료로 사용하거나 기계와 벽을 만드는 데 사용하고, 일부는 체력을 회복하기 위해 먹기도 합니다. 간단하고 말이 되죠.


하지만 시간이 지남에 따라 독특하고 구체적인 동작을 하는 새로운 기능이 도입되었고, 플레이어는 아이템을 자연스럽게 발견하고 사용할 수 있게 되었습니다. 몇 가지 예를 들어보겠습니다:


- 청사진 및 해체 플래너

- 빨간색과 녹색 전선

- 방전 방어 리모컨

- 대포 리모컨

- 스파이더트론 리모컨


이 아이템들은 제작해야만 사용할 수 있고, 인벤토리 공간을 차지하며, 죽으면 잃어버리는 등 실제 아이템이었습니다. 청사진이 처음 추가되었을 때는 고급 회로로 제작해야 했고, 지우려면 전자 회로가 필요했다는 사실을 아신다면 조금 놀라실지도 모르겠네요.


시간이 지나면서 모든 것을 '실제 아이템'으로 만드는 것이 게임플레이 측면에서 항상 최선은 아니라는 판단을 내리게 되었고, 블루프린트 라이브러리를 도입하면서 블루프린트는 최초의 '추상적인 아이템'이 되었습니다. 즉, 필요할 때 바로 생성할 수 있고 라이브러리에 보관할 수 있어 인벤토리 공간을 차지하지 않습니다(하지만 퀵바에 올려두면 편리하게 액세스할 수 있습니다).



이상한 트릭과 원격 상호작용


블루프린트가 가장 큰 문제였지만, 나머지 유형의 아이템도 이상한 상태에 놓여 있었습니다. 가장 이상하고 성가신 것은 빨간색과 초록색 전선이었습니다. 구리와 철을 구해 제작해야 하는데, 전선이 끊어지면 아무것도 얻을 수 없죠. 게다가 청사진을 사용하면 빨간색과 초록색 전선이 무료로 설치되어 있었습니다.


'원격 상호 작용'의 측면도 이상해지기 시작했습니다. 지도에서 무언가를 빨간색 회로선으로 연결할 수는 없지만, 청사진을 가져와서 로컬에서 연결한 다음 청사진을 다시 위에 올려놓으면 전선이 마술처럼 바뀌는 것이었습니다. 정말 답답하고 짜증나는 일이었습니다.


결국 저희는 이 모든 것을 무료로 제작할 수 있는 추상적 아이템으로 전환하고, 이 추상적 아이템은 어느 거리에서나 작동하는 합리적인 방법을 택했습니다. 이는 구리선에도 적용되는데, 레시피에 사용되는 '실제' 구리선과 전신주를 연결하는 데 사용되는 '추상적인' 구리선이 있습니다. 새로운 추상적 아이템은 단축키 바 시스템과 자연스럽게 연결되며, 단축키 바 시스템은 그 잠재력을 최대한 활용하고 있습니다.




또한 단축키 바의 너비가 최대 12개 슬롯까지 확장된 것도 눈에 띄는 변화입니다!


이러한 변화는 원격 작업 기능도 향상시켰으며, 원격 상호 작용은 다음 FFF의 주제가 될 것입니다.


언제나 그렇듯이 손가락과 키보드 사이에 전선을 연결하여 여러분의 의견을 알려주세요.