펫 & 몬스터 메타포 결정
안녕하세요. Wasd Games에 hobi 입니다. 현재 개발 중인 게임에 디시전 관련 내용을 공유하려고 합니다. 💡 목적 : 펫&몬스터 메타포를 결정합니다. R&D 결과 내용 공유 : 결정과정중 겪은 내용 먼저 알려드리고, …
안녕하세요. wasd팀에 IRoblian입니다.
한국에서도 좀 심화적으로 스크립팅 하시는분이 계실 것 같아, 제가 보던 자료 하나를 정리해서 공유합니다.
조금 전문적으로 로블록스 게임에 도전해보시거나, 심화적으로 다가가실때 도움이 될 것 같습니다.
이 글은 RDC20에서 공유됐던, 아래의 영상을 정리한 글입니다.
5 Powerful Code Patterns Behind Top Roblox Game(RDC 20)
로블록스에서 사용하는 모든 패턴은 비동기를 다루기 위해 사용됩니다.
이런 도구들은 무엇보다 코드의 디커플링을 돕습니다. 실제로 Top 레벨 게임에서 이 패턴을 안쓰는 경우는 없다고 장담합니다.
함께보면 좋은 자료
Observe the world, don’t query it.
질의(query)하지 말고, 세상을 관찰하자.
기본적인 사용법
signal:Connect(callback)
연결하고, 끊기
local conn = event:Connect(function()...end)
conn:Disconnect()
이벤트를 호출하기
event:Fire()
Querying
Wait를 이용해서 계속 기다려줘야합니다.
while true do
wait(0.5)
print(Players:GetPlayers())
end
Signals
이벤트가 호출될 때를 감지할 수 있습니다.
local players = {}
players.PlayerAdded:Connect(function(player)
players[player] = true
end)
players.PlayerRemoving:Connect(function(player)
players[player] = nil
end)
정리하면, 많은 프로그래밍에 있는 이벤트를 구현한 구현체라고 볼 수 있습니다.
함께보면 좋은 자료
Have an object to clean everything up!
모든 것을 정리하는 오브젝트를 가져라!
local maid = Maid:new()
maid:GiveTask(task)
--정리가 필요할 때
maid:DoCleaning()
:Destory()
를 가진 모든 것예시
function RocketLauncher.new(Player, ItemData)
local self = Gun.new(Player, ItemData)
setmetatable(self, RocketLauncher)
-- ...self.RocketWorld = RocketWorld.new()
-- ...self.Maid:GiveTask(self.RocketWorld)
return self
end
정리하면, 다른 프로그래밍 언어에서 사용하는 가비지컬렉터 같은 개념입니다. Maid에 넣고, 깔끔하게 치울때 사용하면 좋아요.
함께 보면 좋은 자료
local promise = Promise.new(function(resolve)
resolve(HttpService:GetAsync("https://playadopt.me"))
end)
cancel()
: promises가 취소되도록 요청할 수 있습니다. 요청한 결과가 더 이상 필요 없을 때 사용합니다.local promise = DownloadAndStreamScoreboardToUser(player)
PlayerClosedScoreboard.OnServerEvent:Connect(function(playerWhoClosedScoreboard)
if player == playerWhoClosedScoreboard then
promise:cancel()
end
end)
endThen()
: 해당 작업이 완료된 후 다음 스케줄을 등록하고 싶을때 사용합니다. 이전에 있던 작업을 활용 할 수도 있습니다.local promise = Promise.new(function(resolve)
resolve(HttpService:GetAsync("https://playadopt.me"))
end)
promise:andThen(function(result)
print("playadopt.me's response was " .. result)
end)
all
: 여러개의 task를 한번에 수행하나라도 실패하면 실패모든 태스크가 모두 성공하면 완료됩니다.local userLoadPromise =Promise.all({
loadUserHousePromise,
loadUserMoneyPromise,
loadUserPetsPromise
})
userLoadPromise:andThen(function()
-- Spawn the user into the game
End):catch(function()
-- Tell the user we failed to load their save
End)
정리하면,
Javascript나 C#에 있는 async/awake 문법을 가져온 거라고 할 수 있습니다.
정말 잘 구현되어 있습니다.
여기서부턴 선택적인 패턴이라 가볍게 설명합니다.
함께 보면 좋은 자료
함께보면 좋은 자료
이 발표를 했던 분들이 Nevermore Engine 제작자여서 그런가 본인들의 내부 구현체를 많이 차용해서 관련 레퍼런스도 가져왔습니다.
이 영상이나 패턴이 개발하시는데 혹은 전문 스크립터로 성장하는데 도움이 되셨으면 좋겠네요 :)
많은 부분이 “비동기 처리"와 “메모리"나 “이벤트"와 같은 높은 수준의 프로그래밍 언어에서 사용되는 것들이여서 혹시나 Lua를 처음 언어로 접하신 분들이라면 “동시성 프로그래밍” 관련 된 책이나 글들을 찾아보시면 도움이 많이 될거예요!!
그럼 또 찾아뵙겠습니다.(_ _)
✅ 본래의 영상은 아래에서 확인해 볼 수 있습니다.
안녕하세요. Wasd Games에 hobi 입니다. 현재 개발 중인 게임에 디시전 관련 내용을 공유하려고 합니다. 💡 목적 : 펫&몬스터 메타포를 결정합니다. R&D 결과 내용 공유 : 결정과정중 겪은 내용 먼저 알려드리고, …
안녕하세요. 팀 wasd 에 IRoblian 입니다. 2022년도 샌드박스 네트워크 로블록스 공모전에 참여하게 되어 후기를 남깁니다. 저희도 이번에 한번 참여하게 되어서, 먼저, 게임 홍보부터 하고 가겠습니다. :) 해머워즈 홍보 해머워즈는 상대방을 🔨 …