Первое с чего начну - код моей текущей страницы, которая загружает вэб-плеер Юнити и инициализирует его данными (необходимые скрипты есть во вложениях):
Синтаксис:
Используется javascript
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>GameName</title>
<script src="http://vk.com/js/common.js" type="text/javascript"></script>
<script src="http://vk.com/js/xd_connection.js" type="text/javascript"></script>
<script src="/scripts/unityobject.js" type="text/javascript"></script>
<script src="/scripts/vk_api.js" type="text/javascript"></script>
</head>
<body>
<!--<script src="http://vk-jsapi.googlecode.com/svn/trunk/vk_api.min.js" type="text/javascript"></script>-->
<center>
<div id="ss_game" style="z-index: -100">
</div>
</center>
<script type="text/javascript"> //<![CDATA[
var uniObj;
function createUnityObject() {
uniObj = new UnityObject("game.unity3d", "game", "760", "590");
//uniObj.addParam("logoimage", "MyLogo.png");
//uniObj.addParam("progressbarimage", "MyProgressBar.png");
//uniObj.addParam("progressframeimage", "MyProgressFrame.png");
//uniObj.addParam("disableContextMenu", "true");
uniObj.addParam("disableFullscreen", "true");
uniObj.setAttribute("altHTML", "<a href='http://unity3d.com/unitywebplayer.html' title='Перейти на unity3d.com для установки Unity Web Player'>Установить Unity Web Player</a>");
uniObj.write('ss_game');
}
var api = new vk_api(
'AppSecret',
function() {
api.callMethod('setTitle', 'Название приложения');
api.makeInstall(function() {
api.makeSettings(api.SETT_FRIENDS | api.SETT_NOTIFY);
});
api.addCallback('onWindowBlur', function(settings) { document.getElementById('ss_game').style.display = 'none'; });
api.addCallback('onWindowFocus', function(settings) { document.getElementById('ss_game').style.display = 'block'; });
api.addCallback('onSettingsChanged', function(settings) { document.getElementById('ss_game').style.display = 'block'; });
createUnityObject();
},
function() { document.getElementById('text').innerHTML += 'Ошибка инициализации API\n'; },
true);
// Функция вызываемая плеером для получения параметров, необходимых для работы с API ВКонтакта
function SendSettingsToPlayer() {
uniObj.msg("VkontakteAPI", "SetApiUrl", api.params.api_url);
uniObj.msg("VkontakteAPI", "SetAppId", api.params.api_id);
uniObj.msg("VkontakteAPI", "SetViewerId", api.params.viewer_id);
uniObj.msg("VkontakteAPI", "ApiInitialized");
}
//]]></script>
</body>
</html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>GameName</title>
<script src="http://vk.com/js/common.js" type="text/javascript"></script>
<script src="http://vk.com/js/xd_connection.js" type="text/javascript"></script>
<script src="/scripts/unityobject.js" type="text/javascript"></script>
<script src="/scripts/vk_api.js" type="text/javascript"></script>
</head>
<body>
<!--<script src="http://vk-jsapi.googlecode.com/svn/trunk/vk_api.min.js" type="text/javascript"></script>-->
<center>
<div id="ss_game" style="z-index: -100">
</div>
</center>
<script type="text/javascript"> //<![CDATA[
var uniObj;
function createUnityObject() {
uniObj = new UnityObject("game.unity3d", "game", "760", "590");
//uniObj.addParam("logoimage", "MyLogo.png");
//uniObj.addParam("progressbarimage", "MyProgressBar.png");
//uniObj.addParam("progressframeimage", "MyProgressFrame.png");
//uniObj.addParam("disableContextMenu", "true");
uniObj.addParam("disableFullscreen", "true");
uniObj.setAttribute("altHTML", "<a href='http://unity3d.com/unitywebplayer.html' title='Перейти на unity3d.com для установки Unity Web Player'>Установить Unity Web Player</a>");
uniObj.write('ss_game');
}
var api = new vk_api(
'AppSecret',
function() {
api.callMethod('setTitle', 'Название приложения');
api.makeInstall(function() {
api.makeSettings(api.SETT_FRIENDS | api.SETT_NOTIFY);
});
api.addCallback('onWindowBlur', function(settings) { document.getElementById('ss_game').style.display = 'none'; });
api.addCallback('onWindowFocus', function(settings) { document.getElementById('ss_game').style.display = 'block'; });
api.addCallback('onSettingsChanged', function(settings) { document.getElementById('ss_game').style.display = 'block'; });
createUnityObject();
},
function() { document.getElementById('text').innerHTML += 'Ошибка инициализации API\n'; },
true);
// Функция вызываемая плеером для получения параметров, необходимых для работы с API ВКонтакта
function SendSettingsToPlayer() {
uniObj.msg("VkontakteAPI", "SetApiUrl", api.params.api_url);
uniObj.msg("VkontakteAPI", "SetAppId", api.params.api_id);
uniObj.msg("VkontakteAPI", "SetViewerId", api.params.viewer_id);
uniObj.msg("VkontakteAPI", "ApiInitialized");
}
//]]></script>
</body>
</html>
Далее скрипт для Юнити и вспомогательный класс (думаю всем будет понятно как они взаимосвязаны):
Синтаксис:
Используется csharp
using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;
public class VKontakteApi: MonoBehaviour
{
public string Secret = "";
public bool TestMode = true;
public string Version = "2.0";
private string _apiUrl = "";
private string _viewerId = "";
private string _appId = "";
private System.Random _random;
private bool _isInit = false;
public bool IsInit
{
get { return _isInit; }
}
void Awake()
{
_random = new System.Random();
Application.ExternalCall("SendSettingsToPlayer");
}
public void SetApiUrl(string url)
{
_apiUrl = url + (url.EndsWith("?") ? "" : "?");
}
public void SetAppId(string appId)
{
_appId = appId;
}
public void SetViewerId(string viewerId)
{
_viewerId = viewerId;
}
public void ApiInitialized()
{
_isInit = true;
}
/// <summary>
/// Функция расчета хэша Md5
/// </summary>
/// <param name="value">Строка, для которой считается хэш</param>
/// <returns>Возвращает хэш-строку переданной строи</returns>
public static string Md5(string value)
{
MD5CryptoServiceProvider x = new MD5CryptoServiceProvider();
byte[] data = Encoding.ASCII.GetBytes(value);
data = x.ComputeHash(data);
string ret = "";
for (int i = 0; i < data.Length; i++)
ret += data[i].ToString("x2").ToLower();
return ret;
}
/// <summary>
/// Функция создает Url запроса для Api ВКонтакте
/// </summary>
/// <param name="parameters">Параметры запроса</param>
/// <returns>Возвращает строку запроса</returns>
public string CreateRequestUrl(RequestParameter[] parameters)
{
List<RequestParameter> pars = new List<RequestParameter>();
pars.Add(new RequestParameter("api_id", _appId));
pars.Add(new RequestParameter("v", Version));
if (TestMode)
{
pars.Add(new RequestParameter("test_mode", "1"));
}
pars.AddRange(parameters);
// Сортируем параметры по имени для правильного построения подписи запроса
List<string> parNames = new List<string>();
foreach (RequestParameter par in pars)
{
parNames.Add(par.Name);
}
parNames.Sort();
List<RequestParameter> sortedPars = new List<RequestParameter>();
foreach (string parName in parNames)
{
foreach (RequestParameter par in pars)
{
if (par.Name == parName)
{
sortedPars.Add(par);
break;
}
}
}
pars = sortedPars;
StringBuilder sb = new StringBuilder();
sb.Append(_viewerId);
foreach (RequestParameter s in pars)
{
sb.Append(s.ToString());
}
sb.Append(Secret);
// считаем сигнатуру
string sig = Md5(sb.ToString());
sb = new StringBuilder();
sb.Append(_apiUrl);
foreach (RequestParameter s in pars)
{
sb.Append(s.ToString());
sb.Append("&");
}
// Добавляем сигнатуру
sb.Append("sig=");
sb.Append(sig);
return sb.ToString();
}
}
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;
public class VKontakteApi: MonoBehaviour
{
public string Secret = "";
public bool TestMode = true;
public string Version = "2.0";
private string _apiUrl = "";
private string _viewerId = "";
private string _appId = "";
private System.Random _random;
private bool _isInit = false;
public bool IsInit
{
get { return _isInit; }
}
void Awake()
{
_random = new System.Random();
Application.ExternalCall("SendSettingsToPlayer");
}
public void SetApiUrl(string url)
{
_apiUrl = url + (url.EndsWith("?") ? "" : "?");
}
public void SetAppId(string appId)
{
_appId = appId;
}
public void SetViewerId(string viewerId)
{
_viewerId = viewerId;
}
public void ApiInitialized()
{
_isInit = true;
}
/// <summary>
/// Функция расчета хэша Md5
/// </summary>
/// <param name="value">Строка, для которой считается хэш</param>
/// <returns>Возвращает хэш-строку переданной строи</returns>
public static string Md5(string value)
{
MD5CryptoServiceProvider x = new MD5CryptoServiceProvider();
byte[] data = Encoding.ASCII.GetBytes(value);
data = x.ComputeHash(data);
string ret = "";
for (int i = 0; i < data.Length; i++)
ret += data[i].ToString("x2").ToLower();
return ret;
}
/// <summary>
/// Функция создает Url запроса для Api ВКонтакте
/// </summary>
/// <param name="parameters">Параметры запроса</param>
/// <returns>Возвращает строку запроса</returns>
public string CreateRequestUrl(RequestParameter[] parameters)
{
List<RequestParameter> pars = new List<RequestParameter>();
pars.Add(new RequestParameter("api_id", _appId));
pars.Add(new RequestParameter("v", Version));
if (TestMode)
{
pars.Add(new RequestParameter("test_mode", "1"));
}
pars.AddRange(parameters);
// Сортируем параметры по имени для правильного построения подписи запроса
List<string> parNames = new List<string>();
foreach (RequestParameter par in pars)
{
parNames.Add(par.Name);
}
parNames.Sort();
List<RequestParameter> sortedPars = new List<RequestParameter>();
foreach (string parName in parNames)
{
foreach (RequestParameter par in pars)
{
if (par.Name == parName)
{
sortedPars.Add(par);
break;
}
}
}
pars = sortedPars;
StringBuilder sb = new StringBuilder();
sb.Append(_viewerId);
foreach (RequestParameter s in pars)
{
sb.Append(s.ToString());
}
sb.Append(Secret);
// считаем сигнатуру
string sig = Md5(sb.ToString());
sb = new StringBuilder();
sb.Append(_apiUrl);
foreach (RequestParameter s in pars)
{
sb.Append(s.ToString());
sb.Append("&");
}
// Добавляем сигнатуру
sb.Append("sig=");
sb.Append(sig);
return sb.ToString();
}
}
Синтаксис:
Используется csharp
public struct RequestParameter
{
public string Name;
public string Value;
public RequestParameter(string name, string value)
{
Name = name;
Value = value;
}
public override string ToString()
{
return Name + "=" + Value;
}
}
{
public string Name;
public string Value;
public RequestParameter(string name, string value)
{
Name = name;
Value = value;
}
public override string ToString()
{
return Name + "=" + Value;
}
}
Для правильной работы в сцене необходимо создать GO с именем VkontakteAPI и привязать к нему первый скрипт. При старте скрипт вызовет функцию SendSettingsToPlayer() созданную заранее в странице, которая в свою очередь проинициализирует объект VkontakteAPI необходимыми параметрами.
После инициализации можно пользоваться конструктором запросов (url) для api вконтакта. Дальше пока сил не хватило... на JS не люблю программировать
Если кто в силах помочь лучше переписать код страницы для правильной работы с настройками, так же очень хочется посмотреть как определять пользователя, если он был приглашен другим пользователем и т.д. Серверной стороны тут нет, т.к. пока до нее далеко. Но необходимый клиентский функционал хорошо бы разработать заранее.
PS: Приветствуется критика и свои примеры