跳至主要内容

用Go撰寫Agones遊戲

Prerequisite

個人使用

  • Visual Studio Code 應該會自動幫你安裝編譯go需要的套件才對

官方範例

教學 https://agones.dev/site/docs/getting-started/edit-first-gameserver-go/

遊戲初始化

  • 遊戲開始初始化記得要呼叫sdk.NewSDK()建立SDK物件s
  • 然後開一個執行緒定期要去回報s.Health()
  • 好了以後呼叫s.Ready() 這裡要告訴Agones System表示我已經好了 狀態切成Ready 才能接受Allocate
    1.21.1的範例 有針對UnAllocate後再變回Ready的示範
import {
sdk "agones.dev/agones/sdks/go"
}
func main() {
/*
前面讀參數初始化的部分,根據需要修改
ex. 我在這邊時做會跟初始化跟資料庫(Firebase)的連線
*/

log.Print("Creating SDK instance")
s, err := sdk.NewSDK()
if err != nil {
log.Fatalf("Could not connect to sdk: %v", err)
}

log.Print("Starting Health Ping")
ctx, cancel := context.WithCancel(context.Background())
go doHealth(s, ctx)

if err := s.Ready(); err != nil {
log.Fatalf("Could not send ready message")
}

/*
...後續遊戲處理 開TCP或UDP去接受玩家訊息
*/
}

// doHealth sends the regular Health Pings
func doHealth(sdk *sdk.SDK, ctx context.Context) {
tick := time.Tick(2 * time.Second)
for {
log.Printf("Health Ping")
err := sdk.Health()
if err != nil {
log.Fatalf("Could not send health ping, %v", err)
}
select {
case <-ctx.Done():
log.Print("Stopped health pings")
return
case <-tick:
}
}
}

讀取Game Server的Label

去檢查自身是否有被設定Label,只要在Allocate時設定Label,
Game Server就可以知道遊戲的一些參數然後開始進行遊戲初始化

gameInit := false
//當game server的狀態發生變化時
s.WatchGameServer(func(gs *serverSDK.GameServer) {
if !gameInit {
value := gs.ObjectMeta.Labels["USER_DEFINE_KEY"]
gameInit = true
}
})

Build Server

這裡直接使用Docker編譯成docker image,並傳到gcr.io,傳上去後它是同專案內才能夠讀取的,所以需要設定專案ID

docker build -t gcr.io/[PROJECT_ID]/game-server-name:modified .
docker push gcr.io/[PROJECT_ID]/game-server-name:modified

Reference

Agones-Quickstart: Edit a Game Server