버니맵 텔레포트를 루아로 구현해보자
원리는 플레이어 좌표가 특정수치 이하로 떨어지면(발판에서 아래로 떨어지면)
정해진 스폰구역으로 텔레포트 되는 방식이다
이렇게 해두면 귀찮게 텔포넣고 커넥터로 연결하는 짓 안해도됨
대신 구간마다 트리거랑 함수 추가해야하는 귀찮음이 있지만 뭐 텔포 직접 넣는건보단 덜 귀찮더라
보는거처럼 아래쪽엔 아무것도 없다
각 단계에 있는 트리거에 닿으면 그 플레이어의 다음 스폰위치가 바뀌는 방식
↓ sauce
game.lua
-- 단계별 스폰될 위치
savePoints={
{x=-5,y=4,z=3},
{x=-4,y=16,z=3},
{x=11,y=19,z=3}
}
--플레이별로 레벨 저장할 변수
playerLevels={}
for i=1,24 do
playerLevels[i]=nil
end
--단계별로 다음 스폰위치 바꿀 트리거 설정
level1=Game.EntityBlock:Create ({x=-5,y=4,z=3})
level2=Game.EntityBlock:Create ({x=-4,y=16,z=3})
level3=Game.EntityBlock:Create ({x=8,y=19,z=3})
function level1:OnTouch( player )
setPoint(player.index,1)
end
function level2:OnTouch( player )
setPoint(player.index,2)
end
function level3:OnTouch( player )
setPoint(player.index,3)
end
--실질적으로 텔레포트 실행할 무한루프 함수
function Game.Rule:OnPlayerSignal (player, signal)
teleport(player)
end
--플레이어가 나가면 그 플레이어 레벨 정보 삭제
function Game.Rule:OnPlayerDisconnect(player)
playerLevels[player.index]=nil
end
--텔포함수
function teleport( player ) -- 플레이어 z 좌표가 1이하로 떨어지면,
local level=playerLevels[player.index] --플레이어 단계확인후 그 단계에 맞는 위치로 텔포시킴
if player.position.z < 1 then
player.position={x=savePoints[level].x,y=savePoints[level].y,z=savePoints[level].z}
end
end
function setPoint( index,level ) --플레이어 단계를 수정하는 함수
playerLevels[index]=level --위 트리거에 닿으면 이함수가 실행되면 그 플레이어 단계가 바뀜
end
===========================================
ui.lua
function UI.Event:OnUpdate (time)
UI.Signal(1)
end
===========================================
사람 여러명인 방에서도 각자 단계별로 따로 텔포 되는거 확인함
스튜디오에 예제맵 가져가기 공개 해놓음
버그 있으면 제보좀