diff options
| author | chai <chaifix@163.com> | 2019-08-14 22:50:43 +0800 | 
|---|---|---|
| committer | chai <chaifix@163.com> | 2019-08-14 22:50:43 +0800 | 
| commit | 15740faf9fe9fe4be08965098bbf2947e096aeeb (patch) | |
| tree | a730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/Export/GameCenterServices.cs | |
Diffstat (limited to 'Runtime/Export/GameCenterServices.cs')
| -rw-r--r-- | Runtime/Export/GameCenterServices.cs | 451 | 
1 files changed, 451 insertions, 0 deletions
| diff --git a/Runtime/Export/GameCenterServices.cs b/Runtime/Export/GameCenterServices.cs new file mode 100644 index 0000000..2a140c3 --- /dev/null +++ b/Runtime/Export/GameCenterServices.cs @@ -0,0 +1,451 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; + +namespace UnityEngine.SocialPlatforms.GameCenter +{ +#if ENABLE_GAMECENTER +	using UnityEngine.SocialPlatforms.Impl; +	 +	[StructLayout (LayoutKind.Sequential)] +	internal struct GcUserProfileData +	{ +		public string userName; +		public string userID; +		public int isFriend; +		public Texture2D image; +		 +		public UserProfile ToUserProfile() +		{ +			return new UserProfile(userName, userID, (isFriend==1?true:false), UserState.Offline, image); +		} +		 +		public void AddToArray(ref UserProfile[] array, int number) +		{ +			if (array.Length > number && number >= 0) +				array[number] = ToUserProfile(); +			else +				Debug.Log("Index number out of bounds when setting user data"); +		} +	} + +	[StructLayout (LayoutKind.Sequential)] +	internal struct GcAchievementDescriptionData +	{ +		public string m_Identifier; +		public string m_Title; +		public Texture2D m_Image; +		public string m_AchievedDescription; +		public string m_UnachievedDescription; +		public int m_Hidden; +		public int m_Points; +		 +		public AchievementDescription ToAchievementDescription() +		{ +			return new AchievementDescription( +				m_Identifier,  +				m_Title,  +				m_Image,  +				m_AchievedDescription,  +				m_UnachievedDescription,  +				m_Hidden == 0 ? false : true, +				m_Points); +		} +	} + +	[StructLayout (LayoutKind.Sequential)] +	internal struct GcAchievementData +	{ +		public string m_Identifier; +		public double m_PercentCompleted; +		public int m_Completed; +		public int m_Hidden; +		public int m_LastReportedDate; +		 +		public Achievement ToAchievement() +		{ +			return new Achievement( +				m_Identifier,  +				m_PercentCompleted,  +				m_Completed == 0 ? false : true,  +				m_Hidden == 0 ? false : true,  +				new DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(m_LastReportedDate)); +		} +	} + +	[StructLayout (LayoutKind.Sequential)] +	internal struct GcScoreData +	{ +		public string m_Category; +		public int m_ValueLow; +		public int m_ValueHigh; +		public int m_Date; +		public string m_FormattedValue; +		public string m_PlayerID; +		public int m_Rank; +		 +		public Score ToScore() +		{ +			return new Score( +				m_Category,  +				(((Int64)m_ValueHigh) << 32) + m_ValueLow, +				m_PlayerID, +				new DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(m_Date), +				m_FormattedValue,  +				m_Rank); +		} +	} +	 +	public partial class GameCenterPlatform : ISocialPlatform +	{ +		static Action<bool> s_AuthenticateCallback; +		static Action<bool> s_FriendsCallback; +		static Action<IAchievementDescription[]> s_AchievementDescriptionLoaderCallback; +		static Action<IAchievement[]> s_AchievementLoaderCallback; +		static Action<bool> s_ProgressCallback; +		static Action<bool> s_ScoreCallback; +		static Action<IScore[]> s_ScoreLoaderCallback; +		static Action<bool> s_LeaderboardCallback; +		static Action<IUserProfile[]> s_UsersCallback; +		static AchievementDescription[] s_adCache = new AchievementDescription[0]; +		static UserProfile[] s_friends = new UserProfile[0]; +		static UserProfile[] s_users = new UserProfile[0]; +		static Action<bool> s_ResetAchievements; +		private static LocalUser m_LocalUser; +		private static List<GcLeaderboard> m_GcBoards = new List<GcLeaderboard>(); +		 +		static void ClearAchievementDescriptions(int size) +		{ +			if (s_adCache == null || s_adCache.Length != size) +				s_adCache = new AchievementDescription[size]; +		} +		 +		static void SetAchievementDescription(GcAchievementDescriptionData data, int number) +		{ +			s_adCache[number] = data.ToAchievementDescription(); +		} +		 +		static void SetAchievementDescriptionImage(Texture2D texture, int number) +		{ +			if (s_adCache.Length <= number || number < 0) +			{ +				Debug.Log("Achievement description number out of bounds when setting image"); +				return; +			} +			s_adCache[number].SetImage(texture); +		} +		 +		static void TriggerAchievementDescriptionCallback() +		{ +			if (s_AchievementDescriptionLoaderCallback != null && s_adCache != null) +			{ +				if (s_adCache.Length == 0) +					Debug.Log("No achivevement descriptions returned"); +				s_AchievementDescriptionLoaderCallback(s_adCache); +			} +		} +		 +		static void AuthenticateCallbackWrapper(int result) +		{ +			if (s_AuthenticateCallback != null) +			{ +				PopulateLocalUser(); +				s_AuthenticateCallback((result == 1 ? true : false)); +			} +		} +		 +		static void ClearFriends(int size) +		{ +			SafeClearArray(ref s_friends, size); +		} +		 +		static void SetFriends(GcUserProfileData data, int number) +		{ +			data.AddToArray(ref s_friends, number); +		} +		 +		static void SetFriendImage(Texture2D texture, int number) +		{ +			SafeSetUserImage(ref s_friends, texture, number); +		} +		 +		static void TriggerFriendsCallbackWrapper(int result) +		{ +			if (s_friends != null) +				m_LocalUser.SetFriends(s_friends); +			if (s_FriendsCallback != null) +				s_FriendsCallback((result == 1 ? true : false)); +		} +		 +		static void AchievementCallbackWrapper(GcAchievementData[] result) +		{ +			if (s_AchievementLoaderCallback != null) +			{ +				if (result.Length == 0) +					Debug.Log("No achivevements returned"); +				Achievement[] migrated = new Achievement[result.Length]; +				for (int i = 0; i < result.Length; ++i) +					migrated[i] = result[i].ToAchievement(); +				s_AchievementLoaderCallback(migrated); +			} +		} +		 +		static void ProgressCallbackWrapper(bool success) +		{ +			if (s_ProgressCallback != null) +				s_ProgressCallback(success); +		} +		 +		static void ScoreCallbackWrapper(bool success) +		{ +			if (s_ScoreCallback != null) +				s_ScoreCallback(success); +		} +		 +		static void ScoreLoaderCallbackWrapper(GcScoreData[] result) +		{ +			if (s_ScoreLoaderCallback != null) +			{ +				Score[] migrated = new Score[result.Length]; +				for (int i = 0; i < result.Length; ++i) +					migrated[i] = result[i].ToScore(); +				s_ScoreLoaderCallback(migrated); +			} +		} +		 +		void ISocialPlatform.LoadFriends(ILocalUser user, Action<bool> callback) +		{ +			s_FriendsCallback = callback; +			Internal_LoadFriends(); +		} +					 +		void ISocialPlatform.Authenticate(ILocalUser user, Action<bool> callback) +		{ +			s_AuthenticateCallback = callback; +			Internal_Authenticate(); +		} +		 +		public ILocalUser localUser +		{ +			get +			{ +				if (m_LocalUser == null) +					m_LocalUser = new LocalUser(); +				 +				if (Internal_Authenticated() && m_LocalUser.id == "0") +					PopulateLocalUser(); +				return m_LocalUser; +			} +		} +		 +		private static void PopulateLocalUser() +		{ +			m_LocalUser.SetAuthenticated(Internal_Authenticated()); +			m_LocalUser.SetUserName(Internal_UserName()); +			m_LocalUser.SetUserID(Internal_UserID()); +			m_LocalUser.SetUnderage(Internal_Underage()); +			m_LocalUser.SetImage(Internal_UserImage()); +		} +		 +		public void LoadAchievementDescriptions(Action<IAchievementDescription[]> callback) +		{ +			if (!VerifyAuthentication()) +			{ +				callback(new AchievementDescription[0]); +				return; +			} +			s_AchievementDescriptionLoaderCallback = callback; +			Internal_LoadAchievementDescriptions(); +		} +		 +		// TODO: This doesn't really work with the static callback wrapper, multiple progresses +		// could be reported at the same time. +		public void ReportProgress(string id, double progress, Action<bool> callback) +		{ +			if (!VerifyAuthentication()) +			{ +				callback(false); +				return; +			} +			s_ProgressCallback = callback; +			Internal_ReportProgress(id, progress); +		} +		 +		public void LoadAchievements(Action<IAchievement[]> callback) +		{ +			if (!VerifyAuthentication()) +			{ +				callback(new Achievement[0]); +				return; +			} +			s_AchievementLoaderCallback = callback; +			Internal_LoadAchievements(); +		} +		 +		public void ReportScore(Int64 score, string board, Action<bool> callback) +		{ +			if (!VerifyAuthentication()) +			{ +				callback(false); +				return; +			} +			s_ScoreCallback = callback; +			Internal_ReportScore(score, board); +		} +		 +		public void LoadScores(string category, Action<IScore[]> callback) +		{ +			if (!VerifyAuthentication()) +			{ +				callback(new Score[0]); +				return; +			} +			s_ScoreLoaderCallback = callback; +			Internal_LoadScores(category); +		} +		 +		public void LoadScores(ILeaderboard board, Action<bool> callback) +		{ +			if (!VerifyAuthentication()) +			{ +				callback(false); +				return; +			} +			s_LeaderboardCallback = callback; +			Leaderboard genericBoard = (Leaderboard)board; +			GcLeaderboard gcBoard = new GcLeaderboard(genericBoard); +			m_GcBoards.Add(gcBoard); +			if (genericBoard.GetUserFilter().Length > 0) +				gcBoard.Internal_LoadScoresWithUsers(board.id, (int)board.timeScope, genericBoard.GetUserFilter()); +			else +				gcBoard.Internal_LoadScores(board.id, board.range.from, board.range.count, (int)board.userScope, (int)board.timeScope); +		} +		 +		static void LeaderboardCallbackWrapper(bool success) +		{ +			if (s_LeaderboardCallback != null) +				s_LeaderboardCallback(success); +		} +		 +		public bool GetLoading(ILeaderboard board) +		{ +			if (!VerifyAuthentication()) return false; +			foreach (GcLeaderboard gcBoard in m_GcBoards) +				if (gcBoard.Contains((Leaderboard)board)) +					return gcBoard.Loading(); +			return false; +		} +		 +		private bool VerifyAuthentication() +		{ +			if (!localUser.authenticated) +			{ +				Debug.Log ("Must authenticate first"); +				return false; +			} +			return true; +		} +		 +		public void ShowAchievementsUI() +		{ +			Internal_ShowAchievementsUI(); +		} +		 +		public void ShowLeaderboardUI() +		{ +			Internal_ShowLeaderboardUI(); +		} +		 +		static void ClearUsers(int size) +		{ +			SafeClearArray(ref s_users, size); +		} +		 +		static void SetUser(GcUserProfileData data, int number) +		{ +			data.AddToArray(ref s_users, number); +		} +		 +		static void SetUserImage(Texture2D texture, int number) +		{ +			SafeSetUserImage(ref s_users, texture, number); +		} +		 +		static void TriggerUsersCallbackWrapper() +		{ +			if (s_UsersCallback != null) +				s_UsersCallback(s_users); +		} +		 +		public void LoadUsers(string[] userIds, Action<IUserProfile[]> callback) +		{ +			if (!VerifyAuthentication()) +			{ +				callback(new UserProfile[0]); +				return; +			} +			s_UsersCallback = callback; +			Internal_LoadUsers(userIds); +		} +		 +		private static void SafeSetUserImage(ref UserProfile[] array, Texture2D texture, int number) +		{ +			if (array.Length <= number || number < 0) +			{ +				Debug.Log("Invalid texture when setting user image"); +				texture = new Texture2D(76, 76); +			} +			if (array.Length > number && number >= 0) +				array[number].SetImage(texture); +			else +				Debug.Log("User number out of bounds when setting image"); +		} +		 +		private static void SafeClearArray(ref UserProfile[] array, int size) +		{ +			if (array == null || array.Length != size) +				array = new UserProfile[size]; +		} +		 +		public ILeaderboard CreateLeaderboard() +		{ +			Leaderboard lb = new Leaderboard(); +			return (ILeaderboard)lb; +		} +		 +		public IAchievement CreateAchievement() +		{ +			Achievement achoo = new Achievement(); +			return (IAchievement)achoo; +		} +		 +		static void TriggerResetAchievementCallback(bool result) +		{ +			if (s_ResetAchievements != null) +				s_ResetAchievements(result); +		} +		 + +	} +#else +		public class GameCenterPlatform : UnityEngine.SocialPlatforms.Local +		{ +			static public void ResetAllAchievements(Action<bool> callback) +			{ +				Debug.Log ("ResetAllAchievements - no effect in editor"); +				callback(true); +			} +		 +			static public void ShowDefaultAchievementCompletionBanner(bool value) +			{ +				Debug.Log ("ShowDefaultAchievementCompletionBanner - no effect in editor"); +			} +		 +			static public void ShowLeaderboardUI(string leaderboardID, TimeScope timeScope) +			{ +				Debug.Log ("ShowLeaderboardUI - no effect in editor"); +			} +		} +#endif +} + | 
