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);
    } 

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

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);
    }  

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;
        }
    } 


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

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

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

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);
    } 

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);
    } 

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

Canal GTGD
Network Reference Guide Unity3D
Tutorial em video do CGCookie

Documentação Facebook SDK
Made with Slides.com