https://github.nhnent.com/game-server-engine/sample-game-client-unity.git
connector = new GameAnvil.Connector(config);
// コネクタログ追加
connector.Logger += (level, log) =>
{
Debug.Log(string.Format("Log[{0}]:{1}", level, log));
};
connector.LvNetLogger += (level, log) =>
{
Debug.Log(string.Format("Net[{0}]:{1}", level, log));
};
// サーバーと同じ順序でプロトコル登録
GameAnvil.ProtocolManager.getInstance().RegisterProtocol(0, Com.Nhn.Gameanvil.Sample.Protocol.AuthenticationReflection.Descriptor);
GameAnvil.ProtocolManager.getInstance().RegisterProtocol(1, Com.Nhn.Gameanvil.Sample.Protocol.GameMultiReflection.Descriptor);
GameAnvil.ProtocolManager.getInstance().RegisterProtocol(2, Com.Nhn.Gameanvil.Sample.Protocol.GameSingleReflection.Descriptor);
GameAnvil.ProtocolManager.getInstance().RegisterProtocol(3, Com.Nhn.Gameanvil.Sample.Protocol.ResultReflection.Descriptor);
GameAnvil.ProtocolManager.getInstance().RegisterProtocol(4, Com.Nhn.Gameanvil.Sample.Protocol.UserReflection.Descriptor);
// 接続が切れる部分処理リスナーの登録
ConnectHandler.Instance.GetConnectionAgent().onDisconnectListeners += (SessionAgent sessionAgent, ResultCodeDisconnect result, bool force, Payload payload) =>
{
Debug.LogFormat("onDisconnect - {0}", result);
UserInfo.Instance.MoveScene(Constants.SCENE_AUTH);
};
// サーバーに接続試行。
ConnectHandler.Instance.GetConnectionAgent().Connect(textIP.text, int.Parse(textPort.text),
(SessionAgent sessionAgent, ResultCodeConnect result) =>
{
Debug.Log("Connect " + textID.text + ":" + textPort.text + " " + result);
if (result == ResultCodeConnect.CONNECT_SUCCESS)
{
// 成功時、入力UI処理
buttonConnect.gameObject.SetActive(false);
buttonAuth.gameObject.SetActive(true);
textID.gameObject.SetActive(true);
}
else
{
// サーバー接続失敗処理
}
buttonConnect.interactable = true;
}
);
// 認証に必要なプロトコルデータ設定
var authenticationReq = new Com.Nhn.Gameanvil.Sample.Protocol.AuthenticationReq
{
AccessToken = Constants.AUTH_ACCESS_TOKEN
};
Debug.Log("authenticationReq " + authenticationReq);
// サーバーに認証試行。現在はデバイスID、ID、パスワードを全てuuid値で伝達
ConnectHandler.Instance.GetConnectionAgent().Authenticate(inputFieldUUID.text, inputFieldID.text, inputFieldID.text, new Payload().add(new Packet(authenticationReq)),
(SessionAgent sessionAgent, ResultCodeAuth result, List<SessionAgent.LoginedUserInfo> loginedUserInfoList, string message, Payload payload) =>
{
Debug.Log("Auth " + result);
// 成功の場合、次の段階に進む。
if (result == ResultCodeAuth.AUTH_SUCCESS)
{
// 成功時、入力UI処理
}
else
{
// 失敗時の処理
}
}
);
// ログインに必要なプロトコルデータ設定
var loginReq = new Com.Nhn.Gameanvil.Sample.Protocol.LoginReq
{
// 任意で必要なデータ設定
Uuid = inputFieldUUID.text,
LoginType = Com.Nhn.Gameanvil.Sample.Protocol.LoginType.LoginGuest,
AppVersion = Application.version,
AppStore = "None",
DeviceModel = SystemInfo.deviceModel,
DeviceCountry = "KR",
DeviceLanguage = "ko"
};
Debug.Log("loginReq " + loginReq);
// サーバーにログイン
ConnectHandler.Instance.CreateUserAgent(Constants.GAME_SPACE_NAME, string.Empty).Login(Constants.SPACE_USER_TYPE, string.Empty, new Payload().add(new Packet(loginReq)),
(UserAgent userAgent, ResultCodeLogin result, UserAgent.LoginInfo loginInfo) =>
{
Debug.Log("Login " + result + ", " + loginInfo);
// 成功時、次の段階。
if (result == ResultCodeLogin.LOGIN_SUCCESS)
{
if (loginInfo.Payload.contains<Com.Nhn.Gameanvil.Sample.Protocol.LoginRes>())
{
// ログインレスポンスプロトコル処理
Com.Nhn.Gameanvil.Sample.Protocol.LoginRes loginRes = Com.Nhn.Gameanvil.Sample.Protocol.LoginRes.Parser.ParseFrom(loginInfo.Payload.getPacket<Com.Nhn.Gameanvil.Sample.Protocol.LoginRes>().GetBytes());
Debug.Log("LoginRes " + loginRes);
// サーバーから受け取ったゲームデータ設定
UserInfo.Instance.Uuid = inputFieldUUID.text;
UserInfo.Instance.Nickname = loginRes.Userdata.Nickname;
UserInfo.Instance.Heart = loginRes.Userdata.Heart;
UserInfo.Instance.Coin = loginRes.Userdata.Coin;
UserInfo.Instance.Ruby = loginRes.Userdata.Ruby;
UserInfo.Instance.Level = loginRes.Userdata.Level;
UserInfo.Instance.Exp = loginRes.Userdata.Exp;
UserInfo.Instance.HighScore = loginRes.Userdata.HighScore;
UserInfo.Instance.CurrentDeck = loginRes.Userdata.CurrentDeck;
// シーン切り替え時、ボタンリスナーを全て解除
}
}
else
{
// 失敗処理
}
}
);
// コネクタからユーザーオブジェクトを保存
gameUser = ConnectHandler.Instance.GetUserAgent(Constants.GAME_SPACE_NAME, string.Empty);
// 一人でゲームするルームの作成
gameUser.CreateRoom(Constants.SPACE_ROOM_TYPE_SINGLE, new Payload().add(new Packet(startGameReq)), (UserAgent userAgent, ResultCodeCreateRoom result, string roomId, Payload payload) =>
{
Debug.Log("CreateRoom " + result);
if (result == ResultCodeCreateRoom.CREATE_ROOM_SUCCESS)
{
// 成功時、ゲームシーンに変更、登録されたリスナーを削除
}
else
{
// 失敗処理
}
});
// 作られたルームに入るマッチリクエスト - 一人でもプレイ可能。最大人数まで全員入場
gameUser.MatchRoom(Constants.SPACE_ROOM_TYPE_MULTI_ROOM_MATCH, true, false, (UserAgent userAgent, ResultCodeMatchRoom result, string roomId, Payload payload) =>
{
Debug.Log("MatchRoom " + result);
if (result == ResultCodeMatchRoom.MATCH_ROOM_SUCCESS)
{
// 成功時、ゲームシーンに変更、登録されたリスナーを削除
}
else
{
// 失敗処理
}
});
// 2人単位でマッチングしてルームを作り、同時に入場した後、ゲーム進行
gameUser.MatchUserStart(Constants.SPACE_ROOM_TYPE_MULTI_USER_MATCH, (UserAgent userAgent, ResultCodeMatchUserStart result, Payload payload) =>
{
Debug.Log("MatchUser " + result);
if (result == ResultCodeMatchUserStart.MATCH_USER_START_SUCCESS)
{
// 成功時、ゲームシーンに変更、登録されたリスナーを削除
}
else
{
// 失敗処理
}
});
// タイミングの問題上、リスナーを事前に登録、ユーザーがゲームルームに入った時、ゲームレディflag設定
gameUser.onMatchUserDoneListeners += (UserAgent userAgent, ResultCodeMatchUserDone result, bool created, string roomId, Payload payload) =>
{
Debug.Log("onMatchUserDoneListeners!!!!!! " + userAgent.GetUserId());
if (result == ResultCodeMatchUserDone.MATCH_USER_DONE_SUCCESS)
{
UserInfo.Instance.gameState = UserInfo.GameState.Wait;
}
};
// ユーザーマッチリクエストタイムアウトリスナー
snakeGameUser.onMatchUserTimeoutListeners += (UserAgent userAgent) =>
{
Debug.Log("onMatchUserTimeoutListeners!!!!!! " + userAgent.GetUserId());
// ロビーシーンに移動
};
// ゲーム終了プロトコル定義
var endGameReq = new Com.Nhn.Gameanvil.Sample.Protocol.EndGameReq
{
EndType = gameEndType
};
// ゲームルームを出るリクエスト
tapBirdUser.LeaveRoom(new Payload().add(new Packet(endGameReq)), (UserAgent userAgent, ResultCodeLeaveRoom result, bool force, string roomId, Payload payload) =>
{
Debug.Log("LeaveRoom " + result);
if (result == ResultCodeLeaveRoom.LEAVE_ROOM_SUCCESS)
{
if (payload.contains<Com.Nhn.Gameanvil.Sample.Protocol.EndGameRes>())
{
Com.Nhn.Gameanvil.Sample.Protocol.EndGameRes endGameRes = Com.Nhn.Gameanvil.Sample.Protocol.EndGameRes.Parser.ParseFrom(payload.getPacket<Com.Nhn.Gameanvil.Sample.Protocol.EndGameRes>().GetBytes());
UserInfo.Instance.Heart = endGameRes.UserData.Heart;
UserInfo.Instance.TotalScore = endGameRes.TotalScore;
UserInfo.Instance.Coin = endGameRes.UserData.Coin;
UserInfo.Instance.CurrentDeck = endGameRes.UserData.CurrentDeck;
UserInfo.Instance.Exp = endGameRes.UserData.Exp;
UserInfo.Instance.HighScore = endGameRes.UserData.HighScore;
UserInfo.Instance.Level = endGameRes.UserData.Level;
UserInfo.Instance.Nickname = endGameRes.UserData.Nickname;
UserInfo.Instance.Ruby = endGameRes.UserData.Ruby;
Debug.Log("GameResult " + endGameRes);
}
// ロビーシーンに移動
}
else
{
// 失敗時の処理
}
});
// 送信するパケット
var tapMsg = new Com.Nhn.Gameanvil.Sample.Protocol.TapMsg
{
Combo = tapCount,
SelectCardName = UserInfo.Instance.CurrentDeck + "_0" + 1,
TapScore = 100
};
// レスポンスせず、サーバーにデータ性で伝達するパケット
tapBirdUser.Send(new Packet(tapMsg));
// ゲームユーザーがサーバーへrequestでresponseを受け取って処理する。
gameUser.Request<Com.Nhn.Gameanvil.Sample.Protocol.ShuffleDeckRes>(shuffleDeckReq, (userAgent, shuffleDeckRes) =>
{
Debug.Log("shuffleDeckRes" + shuffleDeckRes);
if (shuffleDeckRes.ResultCode == Com.Nhn.Gameanvil.Sample.Protocol.ErrorCode.None)
{
// シャッフルが成功し、サーバーにレスポンス値を更新
UserInfo.Instance.CurrentDeck = shuffleDeckRes.Deck;
UserInfo.Instance.Coin = shuffleDeckRes.BalanceCoin;
UserInfo.Instance.Ruby = shuffleDeckRes.BalanceRuby;
// ユーザー情報UI更新
}
else
{
// 失敗時の処理
}
});
snakeGameUser.AddListener((UserAgent userAgent, Com.Nhn.Gameanvil.Sample.Protocol.SnakeFoodMsg msg) =>
{
if (msg != null)
{
Debug.Log("<<<< SnakeFoodMsg!!!!!! : " + msg);
if (msg.IsDelete)
{
foreach (var currentFood in SnakeGameInfo.Instance.FoodList)
{
if (msg.FoodData.Idx == currentFood.transform.position.z)
{
Debug.Log("Delete Food !!!!! : " + currentFood.transform.position.z + ":" + currentFood.transform.position.x + ", " + currentFood.transform.position.y);
Destroy(currentFood);
SnakeGameInfo.Instance.FoodList.Remove(currentFood);
break;
}
}
}
else
{
textFoodList.text = msg.FoodData.ToString();
}
}
});