Unity 3d
Integrando com o Facebook
e conexões em rede
Agenda
- Conexões em rede
- Master server
- Cliente servidor
- Instanciando objetos na rede
- Sincronizando estados
- Interpolação e predição
- RPC
- Integração com Facebook
- Configuração inicial
- Login
- Chamadas da API
- Links interessantes
conexão em rede:master server
CONEXÃO EM REDE: CLIENTE SERVIDOR
1-Inicializa o servidor
2- Registra no MasterServer
private void StartServer()
{
Network.InitializeServer(4, 25000, !Network.HavePublicAddress());
MasterServer.RegisterHost(typeName, gameName);
}
private void StartServer()
{
Network.InitializeServer(4, 25000, !Network.HavePublicAddress());
MasterServer.RegisterHost(typeName, gameName);
}
CONEXÃO EM REDE: CLIENTE SERVIDOR
3-Requisita a lista de host pro MasterServer
4- Se conecta ao host escolhido
private void RefreshHostList()
{
MasterServer.RequestHostList(typeName);
}
void OnMasterServerEvent(MasterServerEvent msEvent)
{
if (msEvent == MasterServerEvent.HostListReceived)
hostList = MasterServer.PollHostList();
}
private void JoinServer(HostData hostData)
{
Network.Connect(hostData);
}
testeA
private void RefreshHostList()
{
MasterServer.RequestHostList(typeName);
}
void OnMasterServerEvent(MasterServerEvent msEvent)
{
if (msEvent == MasterServerEvent.HostListReceived)
hostList = MasterServer.PollHostList();
}
private void JoinServer(HostData hostData)
{
Network.Connect(hostData);
}
testeA
CONEXÃO EM REDE: INSTANCIANDO OBJETOS EM REDE
1-Instanciar um prefab in loco e na rede
2-NetworkView
private void SpawnPlayer()
{
Network.Instantiate(playerPrefab, new Vector3(0f, 5f, 0f), Quaternion.identity, 0);
}
private void SpawnPlayer() { Network.Instantiate(playerPrefab, new Vector3(0f, 5f, 0f),Quaternion.identity, 0); }
testeB
CONEXÃO EM REDE: 'cicconizando
estados'
1-Evento do NetworkView OnSerializeNetworkView
void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info)
{
Vector3 syncPosition = Vector3.zero;
if (stream.isWriting)
{
syncPosition = rigidbody.position;
stream.Serialize(ref syncPosition);
}
else
{
stream.Serialize(ref syncPosition);
rigidbody.position = syncPosition;
}
}
void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info)
{
Vector3 syncPosition = Vector3.zero;
if (stream.isWriting)
{
syncPosition = rigidbody.position;
stream.Serialize(ref syncPosition);
}
else
{
stream.Serialize(ref syncPosition);
rigidbody.position = syncPosition;
}
}
CONEXÃO EM REDE: INTERPOLAção
1-Suavizar o movimento de um estado para o outro
private float lastSynchronizationTime = 0f;
private float syncDelay = 0f;
private float syncTime = 0f;
private Vector3 syncStartPosition = Vector3.zero;
private Vector3 syncEndPosition = Vector3.zero;
void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info)
{
...
else
{
stream.Serialize(ref syncPosition);
syncTime = 0f;
syncDelay = Time.time - lastSynchronizationTime;
lastSynchronizationTime = Time.time;
syncStartPosition = rigidbody.position;
syncEndPosition = syncPosition;
}
}
private void SyncedMovement()
{
syncTime += Time.deltaTime;
rigidbody.position = Vector3.Lerp(syncStartPosition, syncEndPosition, syncTime / syncDelay); } testeC
private float lastSynchronizationTime = 0f;
private float syncDelay = 0f;
private float syncTime = 0f;
private Vector3 syncStartPosition = Vector3.zero;
private Vector3 syncEndPosition = Vector3.zero;
void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info)
{
...
else
{
stream.Serialize(ref syncPosition);
syncTime = 0f;
syncDelay = Time.time - lastSynchronizationTime;
lastSynchronizationTime = Time.time;
syncStartPosition = rigidbody.position;
syncEndPosition = syncPosition;
}
}
private void SyncedMovement() { syncTime += Time.deltaTime; rigidbody.position = Vector3.Lerp(syncStartPosition, syncEndPosition,syncTime / syncDelay);}testeC
CONEXÃO EM REDE: predição
1-Adivinhar a posição futura pela velocidade enviada
void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info)
{
...
Vector3 syncVelocity = Vector3.zero;
if (stream.isWriting)
{
...
syncVelocity = rigidbody.velocity;
stream.Serialize(ref syncVelocity);
}
else
{
...
stream.Serialize(ref syncVelocity);
...
syncEndPosition = syncPosition + syncVelocity * syncDelay;
}
} testeD
void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info) { ... Vector3 syncVelocity = Vector3.zero; if (stream.isWriting) { ... syncVelocity = rigidbody.velocity; stream.Serialize(ref syncVelocity); } else { ... stream.Serialize(ref syncVelocity); ... syncEndPosition = syncPosition + syncVelocity * syncDelay; } }testeD
CONEXÃO EM REDE: RPC
1-Fazer chamadas de métodos via remota
[RPC] void ChangeColorTo(Vector3 color)
{
renderer.material.color = new Color(color.x,color.y,color.z, 1f);
if (networkView.isMine)
networkView.RPC("ChangeColorTo", RPCMode.OthersBuffered, color);
}
teste2
[RPC]void ChangeColorTo(Vector3 color) { renderer.material.color =new Color(color.x,color.y,color.z, 1f);if (networkView.isMine) networkView.RPC("ChangeColorTo",RPCMode.OthersBuffered, color); }teste2
integração com facebook:initial config

INTEGRAÇÃO COM FACEBOOK:INITIAL CONFIG


INTEGRAÇÃO COM FACEBOOK:login
1- Init e OnHideunity
private void SetInit()
{
enabled = true;
}
private void OnHideUnity(bool isGameShown) {
if (!isGameShown) {
Time.timeScale = 0;
} else {
Time.timeScale = 1;
} INTEGRAÇÃO COM FACEBOOK:LOGIN
2- Start()
void Start () {
enabled = false;
FB.Init(SetInit, OnHideUnity);
}
void Start () {
enabled = false;
FB.Init(SetInit, OnHideUnity);
} INTEGRAÇÃO COM FACEBOOK:LOGIN
3- Login!
if(!FB.IsLoggedIn) {
if(GUI.Button(botaoLogin_Logout, "Login")) {
FB.Login("email,publish_actions", LoginCallback);
}
}
void LoginCallback(FBResult result) {
FB.API("/me?fields=id,first_name, friends.limit(100).fields(first_name,id)", Facebook.HttpMethod.GET, APICallback);
FB.API("/me/picture?width=128&height=128", Facebook.HttpMethod.GET, MyPictureCallback);
}
if(!FB.IsLoggedIn) { if(GUI.Button(botaoLogin_Logout, "Login")) { FB.Login("email,publish_actions",LoginCallback); } }
void LoginCallback(FBResult result) { FB.API("/me?fields=id,first_name,friends.limit(100).fields(first_name,id)",Facebook.HttpMethod.GET, APICallback); FB.API("/me/picture?width=128&height=128",Facebook.HttpMethod.GET, MyPictureCallback); }
INTEGRAÇÃO COM FACEBOOK:api callback
1- Faz o que quiseres!
void APICallback(FBResult result) // handle user profile info
{
if (result.Error != null)
{
Debug.LogError(result.Error);
return;
}
profile = DeserializeJSONProfile(result.Text);
GameStateManager.Username = profile["first_name"];
friends = DeserializeJSONFriends(result.Text);
} links interessantes
Unity 3d
By jean patrick silva
Unity 3d
- 1,108
