Если у кого есть интерес к этому скажите какие функции из этого списка http://api.mail.ru/docs/reference/js/ вам интересны, я добавлю их в демо сцену и опишу поподробнее.
Мне пока интересная лишь работа с альбомами, поэтому об этом можете не писать, сделаю и так.
Вероятно кто то уже делал что то похожее, сразу покажу как это будет работать..
Вот например функция по созданию нового альбома, из настроек нужно лишь указать секретный ключ, на странице подключить mail.ru js библиотеку, остальное необходимое создастся само
Синтаксис:
Используется csharp
void createNewAblum(){
Dictionary<string,object> paramsObject=new Dictionary<string,object>();
paramsObject.Add("name",albumName);
MRUController.instance.triggerMruByObjectMruListenerAndCallback(
"mailru.common.photos.createAlbum",
paramsObject,
"mailru.common.events.createAlbum",
delegate(object obj, Callback callback){
Dictionary<string,object> result = obj as Dictionary<string,object>;
string status = (string)result["status"];
if (status.Equals("opened")){
Debug.Log("album window has opened");
} else if (status.Equals("closed")){
Debug.Log("album window has closed without creation. Need to unsubscribe from event");
CallbackPool.instance.releasePermanentCallback(callback);
} else if (status.Equals("createSuccess")){
Debug.Log("album created id = "+(string)result["aid"]+" Need to unsubscribe from event");
CallbackPool.instance.releasePermanentCallback(callback);
if(albumsMetadata!=null)
getAlbums();
} else {
Debug.LogWarning("unknown status ["+status+"]");
}
});
}
Dictionary<string,object> paramsObject=new Dictionary<string,object>();
paramsObject.Add("name",albumName);
MRUController.instance.triggerMruByObjectMruListenerAndCallback(
"mailru.common.photos.createAlbum",
paramsObject,
"mailru.common.events.createAlbum",
delegate(object obj, Callback callback){
Dictionary<string,object> result = obj as Dictionary<string,object>;
string status = (string)result["status"];
if (status.Equals("opened")){
Debug.Log("album window has opened");
} else if (status.Equals("closed")){
Debug.Log("album window has closed without creation. Need to unsubscribe from event");
CallbackPool.instance.releasePermanentCallback(callback);
} else if (status.Equals("createSuccess")){
Debug.Log("album created id = "+(string)result["aid"]+" Need to unsubscribe from event");
CallbackPool.instance.releasePermanentCallback(callback);
if(albumsMetadata!=null)
getAlbums();
} else {
Debug.LogWarning("unknown status ["+status+"]");
}
});
}
вся работа по комуникации осуществляется через делегаты, как видно в примере выше, можно анонимно задать делегат в который придет статус или результат. У мру 2 типа событий, одни возвращяют значение в функцию переданую при вызове, второе (как в примере выше), перед вызовом нужно подписаться на событие и вручную отписаться от него по завершению.
полный код класса по работе с альбомом (выгрузка альбомов, с картинками, и создание нового) пока черновой вариант поэтому немного лопши присутствует .
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
struct AlbumMetadata{
public string title;
public string coverUrl;
public Texture2D texture;
public AlbumMetadata (string title, string coverUrl)
{
this.title = title;
this.coverUrl = coverUrl;
this.texture = new Texture2D(120,120);
}
}
public class DemoAlbums : MonoBehaviour {
Rect windowRect = new Rect(20, 140, 240, 380);
List<AlbumMetadata> albumsMetadata;
string text="";
Vector2 scrollPosition;
void OnGUI() {
windowRect = GUILayout.Window(20, windowRect, DoMyWindow, "Albums");
}
void DoMyWindow(int windowID) {
text = GUILayout.TextArea(text);
if (GUILayout.Button("create new"))
createNewAblum();
if (GUILayout.Button("get albums"))
getAlbums();
if (albumsMetadata!=null && albumsMetadata.Count>0){
scrollPosition = GUILayout.BeginScrollView(scrollPosition);
foreach(AlbumMetadata albumMeta in albumsMetadata){
GUILayout.BeginVertical();
GUILayout.Label(albumMeta.title);
GUILayout.Box(albumMeta.texture, GUILayout.Height(120),GUILayout.Width(120));
GUILayout.EndVertical();
}
GUILayout.EndScrollView();
}
GUI.DragWindow(new Rect(0, 0, Screen.width, Screen.height));
}
void createNewAblum(){
Dictionary<string,object> paramsObject=new Dictionary<string,object>();
paramsObject.Add("name",text);
MRUController.instance.triggerMruByObjectMruListenerAndCallback(
"mailru.common.photos.createAlbum",
paramsObject,
"mailru.common.events.createAlbum",
delegate(object obj, Callback callback){
Dictionary<string,object> result = obj as Dictionary<string,object>;
string status = (string)result["status"];
if (status.Equals("opened")){
Debug.Log("album window has opened");
} else if (status.Equals("closed")){
Debug.Log("album window has closed without creation. Need to unsubscribe from event");
CallbackPool.instance.releasePermanentCallback(callback);
} else if (status.Equals("createSuccess")){
Debug.Log("album created id = "+(string)result["aid"]+" Need to unsubscribe from event");
CallbackPool.instance.releasePermanentCallback(callback);
if(albumsMetadata!=null)
getAlbums();
} else {
Debug.LogWarning("unknown status ["+status+"]");
}
});
}
void getAlbums(){
MRUController.instance.triggerMruByCallback("mailru.common.photos.getAlbums", delegate(object result, Callback callback) {
Debug.Log("im here ______" + Json.Serialize(result));
List<object> albums = result as List<object>;
albumsMetadata = new List<AlbumMetadata>();
foreach (object item in albums) {
var album=item as Dictionary<string,object>;
albumsMetadata.Add(new AlbumMetadata((string)album["title"] ,
(string)album["cover_url"]));
}
downloadPictures();
});
}
void downloadPictures (){
if ( albumsMetadata.Count>0){
foreach (AlbumMetadata albumMeta in albumsMetadata){
StartCoroutine(downloadTextureToMetadata(albumMeta));
}
}
}
IEnumerator downloadTextureToMetadata(AlbumMetadata albumMeta){
WWW www = new WWW(albumMeta.coverUrl);
yield return www;
http://www.LoadImageIntoTexture(albumMeta.texture);
}
}
using System.Collections;
using System.Collections.Generic;
struct AlbumMetadata{
public string title;
public string coverUrl;
public Texture2D texture;
public AlbumMetadata (string title, string coverUrl)
{
this.title = title;
this.coverUrl = coverUrl;
this.texture = new Texture2D(120,120);
}
}
public class DemoAlbums : MonoBehaviour {
Rect windowRect = new Rect(20, 140, 240, 380);
List<AlbumMetadata> albumsMetadata;
string text="";
Vector2 scrollPosition;
void OnGUI() {
windowRect = GUILayout.Window(20, windowRect, DoMyWindow, "Albums");
}
void DoMyWindow(int windowID) {
text = GUILayout.TextArea(text);
if (GUILayout.Button("create new"))
createNewAblum();
if (GUILayout.Button("get albums"))
getAlbums();
if (albumsMetadata!=null && albumsMetadata.Count>0){
scrollPosition = GUILayout.BeginScrollView(scrollPosition);
foreach(AlbumMetadata albumMeta in albumsMetadata){
GUILayout.BeginVertical();
GUILayout.Label(albumMeta.title);
GUILayout.Box(albumMeta.texture, GUILayout.Height(120),GUILayout.Width(120));
GUILayout.EndVertical();
}
GUILayout.EndScrollView();
}
GUI.DragWindow(new Rect(0, 0, Screen.width, Screen.height));
}
void createNewAblum(){
Dictionary<string,object> paramsObject=new Dictionary<string,object>();
paramsObject.Add("name",text);
MRUController.instance.triggerMruByObjectMruListenerAndCallback(
"mailru.common.photos.createAlbum",
paramsObject,
"mailru.common.events.createAlbum",
delegate(object obj, Callback callback){
Dictionary<string,object> result = obj as Dictionary<string,object>;
string status = (string)result["status"];
if (status.Equals("opened")){
Debug.Log("album window has opened");
} else if (status.Equals("closed")){
Debug.Log("album window has closed without creation. Need to unsubscribe from event");
CallbackPool.instance.releasePermanentCallback(callback);
} else if (status.Equals("createSuccess")){
Debug.Log("album created id = "+(string)result["aid"]+" Need to unsubscribe from event");
CallbackPool.instance.releasePermanentCallback(callback);
if(albumsMetadata!=null)
getAlbums();
} else {
Debug.LogWarning("unknown status ["+status+"]");
}
});
}
void getAlbums(){
MRUController.instance.triggerMruByCallback("mailru.common.photos.getAlbums", delegate(object result, Callback callback) {
Debug.Log("im here ______" + Json.Serialize(result));
List<object> albums = result as List<object>;
albumsMetadata = new List<AlbumMetadata>();
foreach (object item in albums) {
var album=item as Dictionary<string,object>;
albumsMetadata.Add(new AlbumMetadata((string)album["title"] ,
(string)album["cover_url"]));
}
downloadPictures();
});
}
void downloadPictures (){
if ( albumsMetadata.Count>0){
foreach (AlbumMetadata albumMeta in albumsMetadata){
StartCoroutine(downloadTextureToMetadata(albumMeta));
}
}
}
IEnumerator downloadTextureToMetadata(AlbumMetadata albumMeta){
WWW www = new WWW(albumMeta.coverUrl);
yield return www;
http://www.LoadImageIntoTexture(albumMeta.texture);
}
}
ну а так выглядит результат.
И да, если по коду что то непонятно, замечания приветствуются. постараюсь сделать более дружелюбно.
последнюю версию можно найти тут https://github.com/nicloay/unity2mailru/releases