Unity3d - Интеграция с VK

Привет. Посмотрел уроки, которые есть в и-нете по теме «Интеграция Unity3d с VK», и очень расстроился, т.к. все очень поверхностно описано. Действительно, создать приложение может любой, кто умеет читать. А вот про то, как вызывать методы, зачем прятать окно юнити и почему нужно сохранять протокол, ключ авторизации — ни слова.

Как раз эти моменты и хотелось бы рассмотреть в данном уроке. Полезно будет как новичкам, так и mid-dev-ам.



Код под катом…


SocialManager.cs
using System;
using System.Collections.Generic;
using UnityEngine;

public class SocialManager : MonoBehaviour
{
    private static SocialManager _instance;
    public static SocialManager Instance { get { return _instance; } }

    public bool IsLoaded { get; private set; }
    public string UserId { get; private set; }
    public string AuthKey { get; private set; }
    public string Protocol { get; private set; }

    public readonly Dictionary<string, SocialData> SocialData = new Dictionary<string, SocialData>(32);

    void Awake()
    {
        _instance = this;
        Write("Create SocialManager instance!");
        DontDestroyOnLoad(gameObject);
    }

    // Use this for initialization
    void Start()
    {
        Application.ExternalCall("GetParams");
    }

    private static void Write(string mes)
    {
        Debug.Log("SM->" + mes);
    }

    #region CALLBACKS

    public void RecvParams(string a)
    {
        Write("RecvParams: " + a);

        if (a.StartsWith("https"))
            Protocol = "https";
        else
            Protocol = "http";

        a = a.Split('?')[1];

        string[] mas = a.Split('&');
        foreach (string s in mas)
        {
            string[] k = s.Split('=');
            switch (k[0])
            {
                case "viewer_id":
                    UserId = k[1];
                    Write("UserID set to " + UserId);
                    break;
                case "auth_key":
                    AuthKey = k[1];
                    Write("AuthKey set to " + AuthKey);
                    break;
            }
        }

        GetUserInfo(UserId);

        IsLoaded = true;
    }

    public void OnGetPlayer(string str)
    {
        var mas = str.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

        var socData = new SocialData
        {
            ViewerId = mas[0],
            FirstName = mas[1],
            LastName = mas[2],
            Photo = mas[3]
        };

        if (SocialData.ContainsKey(socData.ViewerId))
        {
            SocialData[socData.ViewerId] = socData;
        }
        else
        {
            SocialData.Add(socData.ViewerId, socData);
        }

        Write("OnGetPlayer: " + str);
    }

    #endregion

    public static void PostToWall(string text)
    {
        Application.ExternalCall("PostToWall", text);
    }

    public static void GetUserInfo(string viewer_id)
    {
        if (Instance.SocialData.ContainsKey(viewer_id))
            return;

        Application.ExternalCall("GetProfile", viewer_id);
    }

    public static void InviteFriends()
    {
        Application.ExternalCall("ShowInvite");
    }
}


SocialData.cs
public class SocialData
{
    public string ViewerId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Photo { get; set; }

    private string _formatNameCache;

    public string FormatName
    {
        get
        {
            if (string.IsNullOrEmpty(_formatNameCache))
            {
                _formatNameCache = FirstName + " " + LastName;
                if (_formatNameCache.Length > 20)
                {
                    _formatNameCache = _formatNameCache.Remove(17) + "...";
                }
            }

            return _formatNameCache;
        }
    }
}


GameState.cs
using UnityEngine;

public class GameState : MonoBehaviour
{
    private SocialManager SM { get { return SocialManager.Instance; } }

    void OnGUI()
    {
        if (!SM.IsLoaded)
        {
            GUI.Label(new Rect(Screen.width / 2 - 50, Screen.height / 2, 200, 20), "Loading...");
            return;
        }

        if (SM.SocialData.ContainsKey(SM.UserId))
        {
            var data = SM.SocialData[SM.UserId];

            GUI.Label(new Rect(Screen.width / 2 - 100, 10, Screen.width, 20), data.FormatName);
        }

        if (GUI.Button(new Rect(Screen.width / 2 - 50, Screen.height / 2, 100, 20), "Invite"))
        {
            SocialManager.InviteFriends();
        }

        if (GUI.Button(new Rect(Screen.width / 2 - 50, Screen.height / 2 + 30, 100, 20), "Post"))
        {
            SocialManager.PostToWall("Hello");
        }
    }
}

2 комментария

avatar
аштеемельку забыл выложить :O
avatar
Жаль, что зависает на «Loading..» Может, дело в том, что в видео подтверждается что то в адресной строке? :) Браузер Мазилла.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.