Facebook SDK for Unity Получение Id, имени игрока

Facebook SDK for Unity Получение Id, имени игрока

Сообщение ikhtd 31 май 2015, 17:14

НАчал пробовать это дело , хочу по свежим следам написать что смогу.
Суть проблемы: можно запустить прилу на фб с html страницы на вашем сайте и там соотвественно все рекламу лепят и т д, а можно через интегрированный в фб unity web player - тогда прила автоматически займет всю канву приложения
ИзображениеИзображение
В чем смысл этого дела. Цукерберг как СЕОшник ни в коем случае не мог бы позволить вашему сайту раскрутиться с такими возможностями как дает фейс бук- ну ваша реклама и т д. А интегрированый веб плеер это другое дело - он служит не для раскрутку сайта, а чисто для раскрутки самой прилы на ФБ. Короче по этому поводу могут быть всякие предположения
И Facebook SDK for Unity создан Цукербергом специально для варианта интегрированного веб плеера для использования АПИ функций фейсбука - как то получение ID игрока, имени, катринки, постинга на стены и т п. Это как альтернатива API на java script, которую бы мы писали на html странице.

Facebook SDK for Unity бесплатно представлен как на asset store, так и на самом фб
https://www.assetstore.unity3d.com/en/#!/content/481
https://developers.facebook.com/docs/unity/downloads
Причем у меня предположение, что если вы сейчас заюзаете в новой приле SDK с asset store оно у вас просто не будет работать.
Когда я попытался заюзать версию 5.1 SDK по старому описанию она вроде шла для версии юнити 4.2 https://developers.facebook.com/docs/ga ... y-tutorial - то оно у меня тупо не заработало на тестовом приложении.
После этого я залил в прилу последнюю предлагаемую версию SDK . Вот эта последняя работающая версия SDK

https://apps.facebook.com/contrtest/

То есть банально мы идем в пункт APP DETAILS - Configure APP centr permission и видим такое..
ИзображениеИзображение
Минимальная версия API которую мы можем задать для прилы это 2.0
Cоответсвенно вопрос, а сможет ли эта версия API работать со старыми версиями SDK и даже с той версией SDK , которая сейчас находиnся на асет сторе. Мне то плевать конечно - просто мне надо сделать работу API на старой версии юнити - 4.2
Инфа с ФБ по этому вопросу

Скрытый текст:
Applications created before April 30th 2014. Facebook applications created before April 30th will continue to use API version 1.0 of the Facebook SDK by default.
Facebook applications created after April 30th will automatically use API version 2.0 of the Facebook SDK. We still recommend always upgrading to latest version of the Facebook Unity SDK to take advantage of new API features as they become available.

ПРиложения созданные до 30 апреля 14 года могут использовать API версию .1.0
Прилы созданные после этой даты могут использовать только API версию 2.0




https://developers.facebook.com/docs/unity


гайд по переходу со старого апи на новое - основное в видео и даже коды (смена) даются в видео
https://developers.facebook.com/docs/apps/upgrading


Итак про SDK Сначала вы делаете FBinit фейсбук инициализацию, потом вы можете сделать в приле Login
ИзображениеИзображение
Кнопка Open Friend Selector откроет ваших друзей
Кнопка Open Feed Dialog сформирует окно для постинга на стену
Затем внизу есть кнопка Call Pay - вызовет вам готовое диалоговое окно для платежа ФБ
А также есть кнопка для загрузки видимо на стену своего скриншота
И также кнопка для ресайза приложения

Собственно и все - все основное есть. Я щас еше поразбираюсь как оттуда получить имя игрока и его аватар желательно
этот пример у вас работать не будет - это для старого АПИ 1.0 https://developers.facebook.com/docs/ga ... y-tutorial
надо использовать вот это https://developers.facebook.com/docs/un ... ce/current может быть по аналогии со старым

еше конечно после импорта SDK не забудьте установить ID прилы

ИзображениеИзображение


..........
Последний раз редактировалось ikhtd 11 июн 2015, 21:22, всего редактировалось 3 раз(а).
Скрытый текст:
Объективная реальность это - что в жизни не может быть более одного пути, который в свою очередь обусловлен максимальным существующим давлением. (второй _ttp://habrahabr.ru/post/202654/)
ikhtd
Адепт
 
Сообщения: 1124
Зарегистрирован: 24 мар 2014, 12:20

Re: Facebook SDK for Unity Описание (старая и новая версия)

Сообщение ikhtd 01 июн 2015, 10:14

https://developers.facebook.com/docs/ga ... s-tutorial

Получение имени

1. Импортировать последний unity SDK https://developers.facebook.com/docs/unity

2. Установить App ID своего приожения для SDK

3. Cкрипт обязательно повесить на гейм объект GUIText !!
Синтаксис:
Используется csharp
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;  
using UnityEngine.UI;
using Facebook.Unity;  


public class MyAPI : MonoBehaviour {

        public Button LoginButtonMy;

        public static string Firstname;
        public static Texture profileTexture;


        void OnGUI()
        {
                //GUI.Label(new Rect(10, 10, 100, 20), Firstname);
        }


        #region Built-In
        void Awake()
        {
                // Initialize FB SDK
                if (!FB.IsInitialized)
                {
                        FB.Init (InitCallback);
                }



        }
        #endregion


        IEnumerator Start()
        {
                yield return new WaitForSeconds(3);
                MyPromptForLogin (OnLoginComplete);
       
        }




        #region FB Init
        private void InitCallback()
        {
                Debug.Log("InitCallback");

                // App Launch events should be logged on app launch & app resume
                // See more: https://developers.facebook.com/docs/ap ... quickstart
                MyLaunchEvent();

                if (FB.IsLoggedIn)
                {
                        Debug.Log ("Already logged in");
                        OnLoginComplete ();
                }


        }
        #endregion

        #region Login
        public void OnLoginClick ()
        {
                Debug.Log("OnLoginClick");

                // Disable the Login Button
                LoginButtonMy.interactable = false;

                // Call Facebook Login for Read permissions of 'public_profile', 'user_friends', and 'email'
                MyPromptForLogin(OnLoginComplete);

        }

        private void OnLoginComplete()
        {
                Debug.Log("OnLoginComplete");

                if (!FB.IsLoggedIn)
                {
                        // Reenable the Login Button
                        LoginButtonMy.interactable = true;
                        return;
                }


                // Begin querying the Graph API for Facebook data
                GetPlayerInfo();
                //FBGraph.GetFriends();
                //FBGraph.GetInvitableFriends();
                //FBGraph.GetScores();


                var aToken = Facebook.Unity.AccessToken.CurrentAccessToken;
                // Print current access token's User ID
                Debug.Log(aToken.UserId);
        }
        #endregion


        void GetPlayerInfo()
        {
                string queryString = "/me?fields=id,first_name,picture.width(120).height(120)";
                FB.API(queryString, HttpMethod.GET, GetPlayerInfoCallback);
        }

        private static void GetPlayerInfoCallback(IGraphResult result)
        {
                Debug.Log("GetPlayerInfoCallback");
                if (result.Error != null)
                {
                        Debug.LogError(result.Error);
                        return;
                }
                Debug.Log(result.RawResult);

                // Save player name
                string name;
                if (result.ResultDictionary.TryGetValue("first_name", out name))
                {
                        Firstname = name;
                        Debug.Log(name);

                        NameFromAPI.mefirstname = name;
                }

                //Fetch player profile picture from the URL returned
                string playerImgUrl = MyDeserializePictureURL(result.ResultDictionary);
                MyLoadImgFromURL(playerImgUrl, delegate(Texture pictureTexture)
                        {
                                // Setup the User's profile picture
                                if (pictureTexture != null)
                                {
                                        profileTexture = pictureTexture;
                                        //print("hi");
                                }


                        });

        }






        private static readonly List<string> readPermissions    = new List<string> {"public_profile","user_friends"};
        private static readonly List<string> publishPermissions = new List<string> {"publish_actions"};


        void MyPromptForLogin (Action callback = null)
        {
                // Login for read permissions
                // https://developers.facebook.com/docs/un ... ermissions
                FB.LogInWithReadPermissions(readPermissions, delegate (ILoginResult result)
                        {
                                Debug.Log("LoginCallback");
                                if (FB.IsLoggedIn)
                                {
                                        Debug.Log("Logged in with ID: " + AccessToken.CurrentAccessToken.UserId +
                                                "\nGranted Permissions: " + AccessToken.CurrentAccessToken.Permissions.ToCommaSeparateList());
                                }
                                else
                                {
                                        if (result.Error != null)
                                        {
                                                Debug.LogError(result.Error);
                                        }
                                        Debug.Log("Not Logged In");
                                }
                                if (callback != null)
                                {
                                        callback();
                                }
                        });
        }



        void MyLaunchEvent ()
        {
                // Use ActivateApp to log activation events in your game enabling measurement for App Ads and Facebook Analytics for Apps.
                // https://developers.facebook.com/docs/un ... ctivateApp
                FB.ActivateApp();
        }




        //===================  Texture of the avatar ===========================

        static string MyDeserializePictureURL(object userObject)
        {
                // friendObject JSON format in this situation
                // {
                //   "first_name": "Chris",
                //   "id": "10152646005463795",
                //   "picture": {
                //      "data": {
                //          "url": "https..."
                //      }
                //   }
                // }
                var user = userObject as Dictionary<string, object>;

                object pictureObj;
                if (user.TryGetValue("picture", out pictureObj))
                {
                        var pictureData = (Dictionary<string, object>)(((Dictionary<string, object>)pictureObj)["data"]);
                        return (string)pictureData["url"];
                }
                return null;
        }


        static void MyLoadImgFromURL (string imgURL, Action<Texture> callback)
        {
                // Need to use a Coroutine for the WWW call, using Coroutiner convenience class
                Coroutiner.StartCoroutine(
                        LoadImgEnumerator(imgURL, callback)
                );
        }

        static IEnumerator LoadImgEnumerator (string imgURL, Action<Texture> callback)
        {
                WWW www = new WWW(imgURL);
                yield return www;

                if (www.error != null)
                        {
                                Debug.LogError(www.error);
                                        yield break;
                                        }
                                        callback(www.texture);
                                                }


                                                //===================== Coroutiner =================================


                                                public static Coroutine StartCoroutine(IEnumerator iterationResult)
                                                {
                                                        //Create GameObject with MonoBehaviour to handle task.
                                                        GameObject routineHandlerGo = new GameObject("Coroutiner");
                                                        CoroutinerInstance routineHandler = routineHandlerGo.AddComponent(typeof(CoroutinerInstance)) as CoroutinerInstance;
                                                        return routineHandler.ProcessWork(iterationResult);
                                                }



                                                public class Coroutiner
                                                {
                                                        public static Coroutine StartCoroutine(IEnumerator iterationResult)
                                                        {
                                                                //Create GameObject with MonoBehaviour to handle task.
                                                                GameObject routineHandlerGo = new GameObject("Coroutiner");
                                                                CoroutinerInstance routineHandler = routineHandlerGo.AddComponent(typeof(CoroutinerInstance)) as CoroutinerInstance;
                                                                return routineHandler.ProcessWork(iterationResult);
                                                        }
                                                }

                                                public class CoroutinerInstance : MonoBehaviour
                                                {
                                                        void Awake()
                                                        {
                                                                DontDestroyOnLoad(this);
                                                        }

                                                        public Coroutine ProcessWork(IEnumerator iterationResult)
                                                        {
                                                                return StartCoroutine(DestroyWhenComplete(iterationResult));
                                                        }

                                                        public IEnumerator DestroyWhenComplete(IEnumerator iterationResult)
                                                        {
                                                                yield return StartCoroutine(iterationResult);
                                                                Destroy(gameObject);
                                                        }
                                                }






                                                }

 
 


Вы можете даже в редакторе юнити получить Login на фейсбук. То есть вы сможете получить имя с фейсбука даже в редакторе.
При тесте этого скрипта нажмите кнопку Click и получите диалог там нажмите эту кнопку
ИзображениеИзображение
Вам нужно получить токен с фб
Затем напротив User Token обязательно нажмите кнопку debug
ИзображениеИзображение
И затем на последней картинке нажмите Debug и после этого скопируйте ключ. Затем вставьте ключ в ваше диалоговое окно в юнити редакторе
ИзображениеИзображение
Таким образом вы войдете на фб в редакторе

Вот демо приложения которое мы получили на фейсбуке

https://apps.facebook.com/contraonlne

В атачменте исходник этого приложения на Unity v 4.1.2

Есть одна подлая деталь. переменная fbname не хотела отображаться в GUI именно в веб плеере, хотя на самом деле она существовала. А в редакторе она отображалась в GUI После того как я повесил скрипт на объект GUIText она начала отображаться и в веб плеере в GUI
Хотя она в формате string. Это видимо связано с дессериализацией из Json - там получается какой то странный формат string

guiText.text = fbname;

ИзображениеИзображение



Если вам надо получить не первое имя игрока - а полное (имя фамилия) - то пишите вместо first_tname просто name

.................................................

Скрытый текст:
Информация о приложении
Since
your app is already listed in App Center, you only need to submit App
Details for review when you want to update your listing. This includes
when you make changes to your app assets, update languages for your app,
or change your supported platforms.


........................................................
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось ikhtd 27 май 2017, 08:38, всего редактировалось 1 раз.
Скрытый текст:
Объективная реальность это - что в жизни не может быть более одного пути, который в свою очередь обусловлен максимальным существующим давлением. (второй _ttp://habrahabr.ru/post/202654/)
ikhtd
Адепт
 
Сообщения: 1124
Зарегистрирован: 24 мар 2014, 12:20

Re: Facebook SDK for Unity Получение Id, имени игрока

Сообщение ikhtd 21 май 2017, 15:27

Скрипт установки приложения и получения имени для новой версии Facebook SDK fo Unity v.7.9.4

(В версии UNity 5.6 это вроде бы все интегрировано для платформы Gameroom, это для 5x версий ниже 5.6 и для 4х даже пойдет )

Создать UI Button ( В Editor не забудьте установить ID приложения)

Синтаксис:
Используется csharp


using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;  
using UnityEngine.UI;
using Facebook.Unity;  


public class MyAPI : MonoBehaviour {

        public Button LoginButtonMy;

        public static string Firstname;
        public static Texture profileTexture;


        void OnGUI()
        {
                //GUI.Label(new Rect(10, 10, 100, 20), Firstname);
        }


        #region Built-In
        void Awake()
        {
                // Initialize FB SDK
                if (!FB.IsInitialized)
                {
                        FB.Init (InitCallback);
                }



        }
        #endregion


        IEnumerator Start()
        {
                yield return new WaitForSeconds(3);
                MyPromptForLogin (OnLoginComplete);
       
        }




        #region FB Init
        private void InitCallback()
        {
                Debug.Log("InitCallback");

                // App Launch events should be logged on app launch & app resume
                // See more: https://developers.facebook.com/docs/ap ... quickstart
                MyLaunchEvent();

                if (FB.IsLoggedIn)
                {
                        Debug.Log ("Already logged in");
                        OnLoginComplete ();
                }


        }
        #endregion

        #region Login
        public void OnLoginClick ()
        {
                Debug.Log("OnLoginClick");

                // Disable the Login Button
                LoginButtonMy.interactable = false;

                // Call Facebook Login for Read permissions of 'public_profile', 'user_friends', and 'email'
                MyPromptForLogin(OnLoginComplete);

        }

        private void OnLoginComplete()
        {
                Debug.Log("OnLoginComplete");

                if (!FB.IsLoggedIn)
                {
                        // Reenable the Login Button
                        LoginButtonMy.interactable = true;
                        return;
                }


                // Begin querying the Graph API for Facebook data
                GetPlayerInfo();
                //FBGraph.GetFriends();
                //FBGraph.GetInvitableFriends();
                //FBGraph.GetScores();


                var aToken = Facebook.Unity.AccessToken.CurrentAccessToken;
                // Print current access token's User ID
                Debug.Log(aToken.UserId);
        }
        #endregion


        void GetPlayerInfo()
        {
                string queryString = "/me?fields=id,first_name,picture.width(120).height(120)";
                FB.API(queryString, HttpMethod.GET, GetPlayerInfoCallback);
        }

        private static void GetPlayerInfoCallback(IGraphResult result)
        {
                Debug.Log("GetPlayerInfoCallback");
                if (result.Error != null)
                {
                        Debug.LogError(result.Error);
                        return;
                }
                Debug.Log(result.RawResult);

                // Save player name
                string name;
                if (result.ResultDictionary.TryGetValue("first_name", out name))
                {
                        Firstname = name;
                        Debug.Log(name);

                        //NameFromAPI.mefirstname = name;
                }

                //Fetch player profile picture from the URL returned
                string playerImgUrl = MyDeserializePictureURL(result.ResultDictionary);
                MyLoadImgFromURL(playerImgUrl, delegate(Texture pictureTexture)
                        {
                                // Setup the User's profile picture
                                if (pictureTexture != null)
                                {
                                        profileTexture = pictureTexture;
                                        //print("hi");
                                }


                        });

        }






        private static readonly List<string> readPermissions    = new List<string> {"public_profile","user_friends"};
        private static readonly List<string> publishPermissions = new List<string> {"publish_actions"};


        void MyPromptForLogin (Action callback = null)
        {
                // Login for read permissions
                // https://developers.facebook.com/docs/un ... ermissions
                FB.LogInWithReadPermissions(readPermissions, delegate (ILoginResult result)
                        {
                                Debug.Log("LoginCallback");
                                if (FB.IsLoggedIn)
                                {
                                        Debug.Log("Logged in with ID: " + AccessToken.CurrentAccessToken.UserId +
                                                "\nGranted Permissions: " + AccessToken.CurrentAccessToken.Permissions.ToCommaSeparateList());
                                }
                                else
                                {
                                        if (result.Error != null)
                                        {
                                                Debug.LogError(result.Error);
                                        }
                                        Debug.Log("Not Logged In");
                                }
                                if (callback != null)
                                {
                                        callback();
                                }
                        });
        }



        void MyLaunchEvent ()
        {
                // Use ActivateApp to log activation events in your game enabling measurement for App Ads and Facebook Analytics for Apps.
                // https://developers.facebook.com/docs/un ... ctivateApp
                FB.ActivateApp();
        }




        //===================  Texture of the avatar ===========================

        static string MyDeserializePictureURL(object userObject)
        {
                // friendObject JSON format in this situation
                // {
                //   "first_name": "Chris",
                //   "id": "10152646005463795",
                //   "picture": {
                //      "data": {
                //          "url": "https..."
                //      }
                //   }
                // }
                var user = userObject as Dictionary<string, object>;

                object pictureObj;
                if (user.TryGetValue("picture", out pictureObj))
                {
                        var pictureData = (Dictionary<string, object>)(((Dictionary<string, object>)pictureObj)["data"]);
                        return (string)pictureData["url"];
                }
                return null;
        }


        static void MyLoadImgFromURL (string imgURL, Action<Texture> callback)
        {
                // Need to use a Coroutine for the WWW call, using Coroutiner convenience class
                Coroutiner.StartCoroutine(
                        LoadImgEnumerator(imgURL, callback)
                );
        }

        static IEnumerator LoadImgEnumerator (string imgURL, Action<Texture> callback)
        {
                WWW www = new WWW(imgURL);
                yield return www;

                if (http://www.error != null)
                        {
                                Debug.LogError(http://www.error);
                                        yield break;
                                        }
                                        callback(http://www.texture);
                                                }


                                                //===================== Coroutiner =================================


                                                public static Coroutine StartCoroutine(IEnumerator iterationResult)
                                                {
                                                        //Create GameObject with MonoBehaviour to handle task.
                                                        GameObject routineHandlerGo = new GameObject("Coroutiner");
                                                        CoroutinerInstance routineHandler = routineHandlerGo.AddComponent(typeof(CoroutinerInstance)) as CoroutinerInstance;
                                                        return routineHandler.ProcessWork(iterationResult);
                                                }



                                                public class Coroutiner
                                                {
                                                        public static Coroutine StartCoroutine(IEnumerator iterationResult)
                                                        {
                                                                //Create GameObject with MonoBehaviour to handle task.
                                                                GameObject routineHandlerGo = new GameObject("Coroutiner");
                                                                CoroutinerInstance routineHandler = routineHandlerGo.AddComponent(typeof(CoroutinerInstance)) as CoroutinerInstance;
                                                                return routineHandler.ProcessWork(iterationResult);
                                                        }
                                                }

                                                public class CoroutinerInstance : MonoBehaviour
                                                {
                                                        void Awake()
                                                        {
                                                                DontDestroyOnLoad(this);
                                                        }

                                                        public Coroutine ProcessWork(IEnumerator iterationResult)
                                                        {
                                                                return StartCoroutine(DestroyWhenComplete(iterationResult));
                                                        }

                                                        public IEnumerator DestroyWhenComplete(IEnumerator iterationResult)
                                                        {
                                                                yield return StartCoroutine(iterationResult);
                                                                Destroy(gameObject);
                                                        }
                                                }






                                                }



 


В переменную public Button LoginButtonMy установить UI кнопку

Настройки UI Button

ИзображениеИзображение


Это может быть полезно при создании нативных ФБ приложений для геймрума, платформа РС. Для версий юнити ниже 5.6

Про загрузку нативных приложений на ФБ читайте тут https://developers.facebook.com/docs/ga ... quirements

Новая версия Facebook SDK тут https://developers.facebook.com/docs/unity

Если загружаете РС билд (в zip формате) на FB, то грузите только с такой иерархией папок (без общей папки) иначе в геймруме не запуститься.

ИзображениеИзображение


Если будете отвязывать запуск установки по кнопке и хотите запускать диалог установки прилы автоматически со старта, то поставьте функцию запуска со старта с задержкой в секунду -три. Потому что, чисто со старта оно че то не успевает запустится.


Кстати я уже как умный прикрепляю Facebook SDK v.7.9.4 этой версии. Через 2 года будет пахать.

https://yadi.sk/d/IrQve90o3JWJdS

это атачмент с предыдущего сообщения https://yadi.sk/d/d0J48EcJ3JWKHs
...


Вначале выполните установку приложения!
Я не знаю как вы это сделаете, но если прила не установлена в акаунте ФБ, имя у вас работать не будет
Скрытый текст:
Объективная реальность это - что в жизни не может быть более одного пути, который в свою очередь обусловлен максимальным существующим давлением. (второй _ttp://habrahabr.ru/post/202654/)
ikhtd
Адепт
 
Сообщения: 1124
Зарегистрирован: 24 мар 2014, 12:20


Вернуться в Социальные сети

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1