티스토리 뷰

🎨/Roblox

[Roblox] Basic Coding (2)

eungding 2021. 11. 17. 21:10
반응형

[Roblox] Basic Coding (1) 에서 이어집니다. 

 

[3] Fading Trap

 

Player가 특정 Part에 step on it 할 때, Part를 fade 시켜보는 코스입니다.

FadingCloud 에 Script를 추가해주고 Script 이름을 FadeOnTouch 로 해줍니다. 

 

 

그리고 fade 라는 empty function을 만들어서 Part의 touched event와 연결해줍니다.

 

 

순식간에 Part가 fade 되는 것은 재미없기 때문에 점진적인 fade 효과를 줄 것이고 

이를 위해 0과 1 사이에 최소 10개 이상의 변경이 필요합니다. 

for loop 를 사용해줍니다. 

 

 

  • Control variable - The variable created and used to count the loops. In this example, it’s count and the starting value is 1.
  • End value - The value it has to get to for the loop to stop. In this example, it’s 10.
  • Step increment (optional) - Determines what to add to the control variable each loop. If left out, it defaults to 1, so in this example it’s unnecessary.

 

1부터 시작해서 10번 반복하는 for loop 를 만들고, loop 내에서 Transparency property 를 세팅해줍니다.

0.1초마다 Transparency를 0.1씩 증가해서 1초 후에는 full transparent 되도록 해줍니다. 

 

 

full transparent 가 된 후에는 player가 Part를 통과해서 떨어질 수 있도록 CanCollide를 false로 설정해줍니다.

3초 후, 다시 come back 시켜줍니다. (원상복구!)

 

 

근데 터치 이벤트는 Player 의 신체 부위가 해당 Part와 접촉할 때 마다 실행됩니다. 

즉 Player가 Cloud를 지나가는 동안, fade 함수가 여러번 실행되어 매번 loop를 reset 합니다. 

 

코드가 제대로 작동하려면 플레이어가 처음 Part를 터치했을 때 기능이 한 번만 실행되어야 합니다. 

action이 여러 번 트리거될 때 한 번만 트리거되도록 하는 것을 debouncing 이라고 합니다. 

 

함수를 debounce 하기 위해 boolean variable 를 하나 선언하고 토글 시켜줍니다. 

 

 

참고로 Lua 의 not opeartor는 오른쪽의 두 코드와 동일합니다. 

 

두번째 Cloud가 FadingCloud..! 

 

 

 

[4] Scoring Points

 

이번 코스에서는 Player 들 중에 누가 가장 오래 살아남았는 지 점수를 보여주는 것을 해봅니다.

플레이어가 살아 있는 매초마다, 점수가 가산됩니다.  (Every second they stay alive, a point will be added to their score)

 

# 리더보드 

 

Roblox에는 플레이어 통계를 보여주는 리더보드가 내장되어 있습니다. 

리더보드를 통해 플레이어의 포인트를 설정하면 게임 내 화면 오른쪽에 표시됩니다.

 

 

 

참고로 아무것도 해주지않은 지금은 리더보드에 player name만 보여지고 있습니다. 

 

 

 

 

# 리더보드에 포인트 표시하기 

 

game state를 setup 하는 스크립트를 ServerScriptService에 넣는 것이 가장 좋습니다. 

게임이 시작되면 여기에 배치된 스크립트가 자동으로 실행됩니다.  스크립트 이름은 SetupPoints 로 해줍니다.

 

 

 

로블록스에서 service 는 다양한 유용한 기능을 수행하는 객체 입니다. 

Players service는 PlayerAdded 라고 불리는 이벤트를 가지는데,  이것을 이용하여 게임에 참여하는 각 플레이어의 점수를 설정할 수 있습니다.

 

game object 의 GetService function으로 Players service 에 접근할 수 있습니다.

game 은 게임의 모든 것을 포함하는 어디서나 접근할 수 있는 변수입니다.

 

그럼 game을 이용해서 Players service 를 얻은 다음, 

새로 들어오는 player에 대한 parameter를 가지고있는 function 을 만들어 PlayerAdded 이벤트에 연결해줍시다. 

 

 

leaderboard에 플레이어의 포인트를 표시하려면 Player Object 안에 leaderstats 라는 새 Folder 를 만들고 

플레이어의 포인트를 넣어주면 됩니다.  Instance.new function 을 통해 새로운 Object를 만들 수 있습니다. 

 

여기서 Folder는 Roblox objects 를 보관하고 구성하는 simple container 를 말합니다.

개발자가 복잡한 게임에 필요한 여러 객체를 더 잘 정리할 수 있는 수단으로 존재하며

컴퓨터 파일 시스템의 폴더와 동일한 방식으로 동작한다고 합니다. 

 

 

이렇게 폴더를 만들어주면 되고 폴더 네임을 정확히 "leaderstats" 로 해줘야한다는 점 유의해야합니다. 

 

 

이제  leaderboard system 은 leaderstats folder 에 있는 값을 찾아서 표시할 수 있게 되었습니다.

플레이어의 point를 추적하기 위해 새로운 IntValue 객체를 만들고 parent에 leaderstats folder 를 지정해줍니다. 

 

 

게임을 돌려보면 이제 리더보드에 Points = 0 도 같이 나오는 것을 볼 수 있습니다.

 

 

 

# Counting Time  

 

이제 Counting Time 관련 코드를 작성해봅시다. 각 플레이어는 살아있는 매초마다 포인트를 획득해야합니다. 

GetPlayers function으로 player array 를 얻을 수 있습니다.

array의 각 item은 index로 가져올 수 있으며 index는 1부터 시작합니다 (0부터 시작하는 게 좋은데ㅠㅠㅠ,,,,)  

# prefix 를 통해 array의 length를 가져올 수 있습니다. 

 

 

게임을 돌려보면 매초마다 포인트가 올라가는 것을 볼 수 있습니다. 

 

 

 

# Reset Points 

 

플레이어가 죽으면 포인트를 0으로 리셋해야합니다.  

플레이어가 죽은 시점을 감지하려면 해당 플레이어의 Character model 을 가져와야 합니다. 이 모델은 플레이어 객체가 로드된 후에만 게임에 추가되며, character가 사용할 준비가 되었을 때 CharacterAdded event 를 사용할 수 있습니다. 

 

그래서 onPlayerAdded 안에서 anonymous function 을 이용해서 event connection 을 해줍니다. 

 

 

 

플레이어가 죽을 때, Humanoid 는 Died event를 발생시킵니다. 이 이벤트를 통해 포인트를 재설정할 시기를 알 수 있습니다. 

Humanoid는 Character model 안에서 발견되고 Character model 의 컨텐츠는 player가 시작할 때 모이게 됩니다.

Humanoid object가 안전하게 로드되기를 기다리기 위해서, WaitForChild function을 사용해줄 것 입니다.

이 function에는 찾고자 하는 child name을 넘겨주면 됩니다. 

 

Died event에 연결하는 function은 매우 짧고 여기서만 쓰이니까 위에서 했던 것 처럼  anonymous function 을 사용해줍니다. 

 

 

 

근데 이렇게 하면 죽는 순간에만 포인트가 0이 되고 부활하기 전 딜레이가 있는 상태에서도 계속 포인트가 올라가게 됩니다.

 

 

 

그래서 플레이어가 alive했는 지 확인 한 후, 포인트를 올리도록 코드를 추가해보겠습니다. 

attribute를 정의하여 플레이어의 생존 여부를 확인합니다.

 

 

그리고 isAlive를 확인하여 포인트를 주도록 하면 됩니다. 

 

 

이제 정확히 다시 살아난 타이밍 부터  포인트가 올라가게 되었습니다.

 

 

 

반응형

'🎨 > Roblox' 카테고리의 다른 글

[Roblox] Modeling (3) - Terrain  (0) 2021.11.21
[Roblox] Modeling (2) - Texture, Decal  (0) 2021.11.21
[Roblox] Modeling (1) - Solid Modeling  (0) 2021.11.21
[Roblox] Basic Coding (1)  (0) 2021.11.13
[Roblox] Roblox Studio 시작하기  (0) 2021.11.01
댓글