4 min to read
팰월드 모드 제작법9
심화과정 102
심화과정 102
스크립트를 사용해 팰박스 건축 영역을 확장하는 방법을 찾아봅시다.
기술적으로는 PalGameSettings
로 이걸 할 수 있지만 , 여기서는 그 방법 대신 상자가 배치 된 후 메모리에서 이를 변경하는 것을 말합니다.
월드에 들어가서 팰박스를 놓고, 관련 클래스를 찾아 라이브 뷰를 통해 검색합니다.
우리는 상자 자체를 원합니다, 그것은 객체이자 클래스의 인스턴스입니다.
아이디어가 생각나면 검색 상자를 마우스 오른 클릭해 인스턴스만 확인합니다.
검색 범위가 좁혀지도록 확인하고, 그 다음 게임에서 객체 목록을 확인하면서 팰박스를 놓아보십시오.
올바른 방향으로 가고 있다면, 새 객체가 게임에서 생성되면 새 객체가 생성될 때 나타나는 새 객체가 보일 것입니다.
적절한 객체를 찾았다고 생각되면, NotifyOnNewObject
를 사용해 found a base
라고 출력하는 스크립트를 만들어보세요.
만약 스스로 해결하고 싶다면 더 파고 들어보십시오. 여기 몇 가지 힌트가 있습니다.
모든 것을 혼자 해봅니다
힌트1: 무엇을 검색해야 할 지 모르겠습니다.
이것은 “모든 것이 논리적인 방식으로 명명 되지 않는다”는 것에 대한 첫 경험입니다. 그러나 우리는 팰박스를 찾고 있기 때문에 단순히 그것을 검색해보고 나오는 결과를 살펴보는 것이 좋겠습니다. 정확한 것은 찾을 수 없겠지만 일부 결과를 살펴보다보면 다른 것을 검색할 아이디어를 얻을 수 있습니다.
힌트2: 좀 더 알려주세요.
만약 당신이PalBoxBase
에 주목했다면Base
를 검색해보는 아이디어를 얻었을 지 모릅니다. 그렇게 했다면 올바른 길에 있는 것 입니다. 그렇지 않다면 그걸 시도해보고 무슨 결과가 나오는지 알아보십시오. Base 결과를 검색해 어떤 연관 항목이 있는지 확인하는 것 입니다.
힌트3: 그냥 알려주세요.
우리가 찾는 그 특정 객체는PalBaseCampModel
입니다.
힌트4: 클래스는 알겠는데 스크립트를 어떻게 작성하는지 모릅니다.
그럼 우리가 알림을 받고 싶은 클래스의 경로를 알 수 있도록 라이브 뷰에서 해당 클래스를 찾아봅니다. 경로는 대략/Script/Pal.<some_class>
와 같을겁니다. 이것이 우리가 알림을 받을 것입니다. 이 클래스가 스크립트이므로RegisterHook
이니셜라이저가 없이도 이것을 할 수 있습니다. 아래와 같은 방식을 따릅니다:
```lua
NotifyOnNewObject("/Script/Pal.<some_class>", function()
-- do your stuff here
end)
```
유효성 검사 코드 아래의 코드가 있으면 검토해 드릴 수 있습니다. 부족한 부분이나 개선점이 있다면 알려주세요:
```lua
NotifyOnNewObject("/Script/Pal.PalBaseCampModel", function()
print("found a base")
end)
```
잘 하셨습니다! NotifyOnNewObject
를 사용해 기존 베이스가 로그인 할 때와 새 베이스를 배치할 때마다 found a base
를 출력하는 기본 스크립트를 작성했다면,
다음 단계로 넘어가실 준비가 되었습니다.
새 베이스의 배치를 감지할 수 있게 되었으니 이제 베이스 모델의 매개변수를 살펴보고 변경해 봅니다. 우선 라이브뷰의 테스트를 통해 코드의 정상동작을 확인한 후 그 다음 Lua 구현으로 이동합니다.
라이브 뷰 인스턴스
라이브 뷰에서 instances only
를 활성화하고 PalBaseCampModel
을 검색하면 배치된 PalBaseCampModel
의 실제 모델 인스턴스를 나타내는
PalBaseCampModel_<numbers>
와 같은 객체를 찾을 수 있습니다.
이 객체는 실제로 게임 내에 배치된 베이스 캠프의 모델을 나타냅니다.
그것을 클릭하면 하단에 여러 매개변수가 표시됩니다.
이를 통해 모델의 실시간 매개변수를 볼 수 있으며, 수정할 수도 있습니다.
이는 프로그래밍하기 전에 각 매개변수가 무엇을 하는지 정확히 테스트하는 데 매우 유용합니다.
보통은 원하는 매개변수를 찾기 위해 모든 매개변수를 검색해야 하지만, 이 경우에는 AreaRange
를 원한다고 알려줄 것입니다(어차피 매우 명확합니다).
“라이브 뷰”에서 해당 값을 마우스 오른쪽 버튼으로 클릭하면 Edit Value
를 클릭할 수 있습니다.
이를 통해 메모리 내의 실제 매개변수를 편집할 수 있습니다.
우리의 베이스를 5000.0
으로 확장해 보겠습니다. “Apply”를 클릭하고 파란색 링 바깥으로 나가보세요.
링이 실제로 변경되지 않았음을 알게 될 것입니다 (이에 대해 얘기할 시간이 충분하지 않습니다).
그러나 링 바깥으로 나가면 여전히 베이스 정보가 표시되며 베이스를 계속해서 건설할 수 있습니다!
루아
먼저 스크립트를 사용하여 모든 베이스의 범위를 변경해 보겠습니다. 혼자서 최선을 다해 보시고 막히면 돌아오세요. 이탤릭체로 표시된 부분을 유의하세요. LiveView에서 객체를 검사하여 작업을 두 번 확인하세요. 모든 것이 항상 예상한 대로 직관적으로 되지는 않습니다. 다음으로 넘어가기 전에 유효성 검사 코드를 확인하세요!
힌트 1: 베이스 객체를 가져오는 방법을 모르겠다면..
콜백의 첫 번째 매개변수는UObject
자체입니다.RegisterHook
과 같이 그것을params
에서 가져와서 값을 변경하려고 시도해보세요.
힌트 2: 올바른 코드를 가지고 있는 것 같지만
AreaRange
가 실제로 변경되지 않는다면 런타임 중에 작업하는 즐거움을 경험하고 있습니다.NotifyOnNewObject
는 객체가 생성될 때 트리거됩니다. 따라서 값이 제대로 초기화되기 전에 값을 작성하려고 하면 기본값에 의해 덮어씌워질 가능성이 높습니다. 값 변경 전에 약간의 지연을 주기 위해ExecuteWithDelay(10000, ...)
를 추가하세요.
유효성 검사 코드
NotifyOnNewObject("/Script/Pal.PalBaseCampModel", function(base_model) print("found a base model, waiting for it to finish initializing") ExecuteWithDelay(10000, function() base_model.AreaRange = 6000.0 print("changed a bases range") end) end)
왜 get() 을 안쓰나요?
NotifyOnNewObject
에서는 객체 자체를 가져오는 것이므로:get()
은 필요하지 않습니다!
모든 것이 올바르게 설정되었다면 새 베이스를 배치하면 자동으로 업데이트 될 것 입니다.
객체 인스턴스를 확인하는 작업이 끄탄면
Instance Only
옵션을 선택 해제하는 것을 잊지 마십시오.