티스토리 뷰
[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 |
- Total
- Today
- Yesterday
- cocoapod
- Django Heroku Scheduler
- Flutter Text Gradient
- drf custom error
- Dart Factory
- Flutter 로딩
- Flutter Clipboard
- Watch App for iOS App vs Watch App
- flutter 앱 출시
- Flutter Spacer
- 플러터 얼럿
- PencilKit
- flutter dynamic link
- METAL
- ipad multitasking
- Django FCM
- DRF APIException
- flutter build mode
- Sketch 누끼
- 장고 URL querystring
- Python Type Hint
- 플러터 싱글톤
- 장고 Custom Management Command
- Django Firebase Cloud Messaging
- github actions
- flutter deep link
- SerializerMethodField
- 구글 Geocoding API
- ribs
- Flutter getter setter
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |