At first, I just want to learn Golang.I started to think about which is the best way? Because the concurrency mechanisms of Golang is very powerful, I choose online game to verify if I can use Golang to make a efficient game server.For me, this is the first time I make this such hard project. I have to learn Unity, Golang, C# At a time. I am glad that I still have full passion to this project and I never give up.
- golang
- gRPC
- Kubernetes
- Protobuf
- CrossPlatform - Message packet use protobuf which is light, fast, crossplatform.
- Autoscaling - controller is written with go-client ,you can wirte the strategy to autoscale dedicated game server by your own.
- Lightweight - The image of dedicated game server is less than 40MB.
- Agent server :
- match players to join other player's room or create own room
- control the amount of gameplay server and load balancing. when the amountof a gameplay server's connections exceed maxium connections it should have, agent will create a new pod run gameplay server.
- Gameplay Server :
- Server : Two Way to run server:
- Run distributed server using Kubernete cluster
- Use Kops to install kubernete on AWS
- Create cluster
- Install Mongodb && and edit setupEnv.sh with your setting and bash setupEnv.sh
- go run main.go --type=agent on your local machine (Must on Where you install Kops)
- Run Standalone Server on local machine
- Install Mongodb && and edit setupEnv.sh( DONT_USE_KUBE = true )with your setting and bash setupEnv.sh
- go run main.go --type=standalone on your local machine
- Run distributed server using Kubernete cluster
- Client :
If you want to make your own game by modifying this project, I am pleasured. You can throught these step to make it work.
- Change the GameFrame message in proto buff.
- Run './update.sh' in 'msg/'
- unzip message.zip under 'Asset/gameServer/proto' in the Unity Project.
- add your handler to "gameServer/game/session/room.go": func (r *Room) Run()
- modify the UpdateFrame fuction to handle packets design by yourself. then,Data Flow to Entity to render the change of entity's properties.
- agent
- session
- room
- session
- kubernete
- session
- game
- session
- room
- session
- session
- msg
- use protobuf to define package and rpc interface - uuid
generate different IDs of objects that can be call with reflection - user
- UserManager
- User
- TODO: There should be a session manager to cache user infomation and state
- storage
Use mogdb to storage user infomation
MIT © daniel840829

