Unity iOS 无服务器做一个排行榜 GameCenter
排行榜
- 需求
- 解决方案一(嗯目前只有一)
- UnityEngine.SocialPlatforms
- iOS GameCenter
- AppStoreConnect配置
- Unity 调用(如果使用GameCenter系统的面板,看到这里就可以了)
- 坑(需要获取数据做自定义面板的看这里)
- iOS代码
- Unity 代码
- 吐槽
需求
需求:接入排行榜,每关都有单独的分数排行,在关卡结束后可点击弹出或主动弹出。
ps:没有做自己的服务器统计数据及好友关系等
解决方案一(嗯目前只有一)
UnityEngine.SocialPlatforms
UnityEngine.SocialPlatforms API点这里
Unity社交模型,集成了一些诸如好友,排行,成就等功能。
我这里只接入了iOS,所以以下只做iOS的分析
| 优点 | 使用方便,使用方便,使用方便,不用导入sdk什么的,Unity做了封装 |
| 缺点 | Unity做了封装,但有些api并不好用。另外,玩家只有开启GameCenter才能使用本功能。再另外,面板并不是很好看 |
o(╥﹏╥)o
默认情况下,在 iOS 上使用 GameCenter。其他所有 平台均默认为可用于测试的本地实现,Android 一般用Google Play Games。
iOS GameCenter
iOS GameCenter 能设置500个排行榜(并没有看到官方文档,据说有那么多),足够用了。
AppStoreConnect配置
重复以上步骤,需要几个排行榜加几个,暂时没找到批量的方法
Unity 调用(如果使用GameCenter系统的面板,看到这里就可以了)
using UnityEngine;
using UnityEngine.SocialPlatforms;namespace HZH
{public class RankingList{private static RankingList _instance;public RankingList Instance => _instance??new RankingList();public void Init (){if (Application.platform == RuntimePlatform.IPhonePlayer) {Social.localUser.Authenticate (success =>{Debug.Log(success ? "GameCenter初始化成功" : "GameCenter初始化失败");});}}/// <summary>/// 上传数据/// </summary>/// <param name="score">分数</param>/// <param name="leaderboardID">指定的排行榜id</param>public void ReportScore (long score, string leaderboardID){if (Application.platform != RuntimePlatform.IPhonePlayer) return;if (Social.localUser.authenticated) {Social.ReportScore (score, leaderboardID, success =>{Debug.Log(success? $"GameCenter:{leaderboardID}分数{score}上报成功": $"GameCenter:{leaderboardID}分数{score}上报失败");});}}/// <summary>/// 拉起排行榜数据/// </summary>public void ShowLeaderboard (){if (Application.platform != RuntimePlatform.IPhonePlayer) return;if (!Social.localUser.authenticated) return;Social.ShowLeaderboardUI ();}/// <summary>/// 获取指定排行榜数据/// </summary>/// <param name="boardId"></param>public void GetBoardData(string boardId){if (Application.platform != RuntimePlatform.IPhonePlayer) return;ILeaderboard leaderboard = Social.CreateLeaderboard();leaderboard.id = boardId;leaderboard.LoadScores(result =>{Debug.Log("Received " + leaderboard.scores.Length + " scores");foreach (IScore score in leaderboard.scores)Debug.Log(score);});}}
}
如果团队愿意用Native的GameCenter排行榜界面,这里ShowLeaderboard已经能完成了。初始化,数据上报,拉取排行榜面板。
面板在不同机型上显示也不一样,以下是一种机型作参考

坑(需要获取数据做自定义面板的看这里)
如果native面板不满足需求,就需要拿到排行榜数据,自己做实现。
上面的代码GetBoardData方法并不能正确获取到玩家昵称数据。测试2个账号,一个昵称显示未知,一个获取数据失败。账号所限,没办法测试更多了。
这里我找到的解决方案是在iOS直接调用Native的api获取数据
iOS代码
GameCenterCtrl.h
@interface GameCenterCtrl : NSObject // 声明需要的字段
{
}
-(void)GetRankingListData:(const char*)boardId;
@end
GameCenterCtrl.m
#import <Foundation/Foundation.h>
#import <GameKit/GameKit.h>
#import "GameCenterCtrl.h"@implementation GameCenterCtrl
-(id)init {return self;
}
-(void) GetRankingListData:(const char*)boardId{GKLeaderboard *leaderboardRequest = [[GKLeaderboard alloc] init];if (leaderboardRequest != nil){NSString* board = [[NSString alloc] initWithUTF8String:boardId];leaderboardRequest.playerScope = GKLeaderboardPlayerScopeGlobal;leaderboardRequest.timeScope = GKLeaderboardTimeScopeAllTime;leaderboardRequest.range = NSMakeRange(1,10);leaderboardRequest.identifier = board;[leaderboardRequest loadScoresWithCompletionHandler: ^(NSArray *scores, NSError *error) {if (error != nil){// handle the error.NSLog(@"下载失败@");NSLog(@"%@", error);}if (scores != nil){// process the score information.NSLog(@"下载成功....");NSArray *tempScore = [NSArray arrayWithArray:leaderboardRequest.scores];NSMutableArray* array = [NSMutableArray arrayWithCapacity:tempScore.count];for (GKScore *obj in tempScore) {GKPlayer *player = obj.player;NSString *point = [NSString stringWithFormat:@"%lld", obj.value];NSString *rank = [NSString stringWithFormat:@"%ld", obj.rank];NSDictionary *dict = @{@"name":player.alias,@"point":point,@"rank":rank,};[array addObject:dict];}NSData *data = [NSJSONSerialization dataWithJSONObject:array options:kNilOptions error:nil];NSLog(@"u3d_packageJosn data: %@", data);// nsdata -> nsstringNSString *jsonString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];NSLog(@"u3d_packageJosn jsonString: %@", jsonString);// nsstring -> const char*const char* constStr = [jsonString UTF8String];UnitySendMessage(你的GameObject名字, 接收数据的方法名, constStr);}}];}
}
@end
PortFile.h
#import <Foundation/Foundation.h>@interface PortFile : NSObject
void GetRankingListData(const char* boardId);
@end
PortFile.m
#import "PortFile.h"
#import "GameCenterCtrl.h"
// 这个对象用来接收Unity信息,处理OC代码
void showAppStoreScoreView(){[[GameCenterCtrl alloc]GetRankingListData:boardId];
}
以上4个文件放到Assets/Plugins/ios 文件夹下,GameCenterCtrl也可以直接按PortFile的写法,省了portFile俩文件。 或者用自己的unity2iOS通信方案,核心就GameCenterCtrl.m的GetRankingListData方法。
Unity 代码
获取数据
[DllImport("__Internal")]private static extern void GetRankingListData(string boardId);public void GetRankingData(string boardId){GetRankingListData(boardId)}
接收数据(数据获取是异步进行的,所以用的UnitySendMessage),这个Unity接收数据想来都懂,就不一步步写了。拿到数据json解一下就可以为所欲为了
吐槽
搜索Unity排行榜,帖子茫茫多,全是教怎么写界面的,写界面用你教呀 -_-||
相关文章:
Unity iOS 无服务器做一个排行榜 GameCenter
排行榜需求解决方案一(嗯目前只有一)UnityEngine.SocialPlatformsiOS GameCenterAppStoreConnect配置Unity 调用(如果使用GameCenter系统的面板,看到这里就可以了)坑(需要获取数据做自定义面板的看这里)iOS代码Unity 代码吐槽需求 需求:接入…...
现在招个会自动化测试的人是真难呀~你会个锤子的自动化测试
现在招个会自动化测试的人是真难呀~ 前一段时间公司计划要招2个自动化测试到岗,同事面试了十几个来应聘的人,发现一个很奇怪的现象,在面试的时候,如果问的是框架API、脚本编写这些问题,基本上所有人都能对答如流&…...
OracleDatabase——数据库表空间dmp导出与导入
由于公司的程序一直部署在客户现场内网,内网调试难度高,一般是有备份还原数据库的需求,这里简记备份(导出)数据库dmp文件与恢复(导入)的步骤。 一、导出dmp文件 exp与expdp命令异同 相同点&a…...
20张图带你彻底了解ReentrantLock加锁解锁的原理
哈喽大家好,我是阿Q。 最近是上班忙项目,下班带娃,忙的不可开交,连摸鱼的时间都没有了。今天趁假期用图解的方式从源码角度给大家说一下ReentrantLock加锁解锁的全过程。系好安全带,发车了。 简单使用 在聊它的源码…...
Dockerfile构建Springboot镜像
Dockerfile构建Springboot镜像 文章目录 Dockerfile构建Springboot镜像 简介实例演示 前期准备 Docker环境Springboot项目Dockerfile文件 Windows 要求构建镜像启动测试 Linux 要求构建镜像启动测试 简介 容器技术大流行的时代,也是docker大流行的时代。 此文…...
从深分页查询到覆盖索引
最近看到一道面试题,如何优化深分页查询 最简单的例子是 select * from web_bill_main limit 30000,10;分页达到30000行,需要把前面29999行都过滤掉,才能找到这10条数据 所以整体时间花了80ms(工具显示时间) 我当时的第一反应是࿰…...
Go语言学习的第三天--下部分(Gin框架的基础了解)
每天都会分享Go的知识,喜欢的朋友关注一下。每天的学习分成两部分基础(必要的,基础不牢地动山摇),另一部分是Go的一些框架知识(会不定时发布,因为小Wei也是一名搬砖人)。但是可以保证…...
JDK的动态代理(powernode 文档)(内含源代码)
JDK的动态代理(powernode 文档)(内含源代码) 源代码下载链接地址:https://download.csdn.net/download/weixin_46411355/87546086 一、动态代理 目录JDK的动态代理(powernode 文档)࿰…...
第1章 多线程基础
第1章 多线程基础 1.1.2 线程与进程的关系 进程可以看成是线程的容器,而线程又可以看成是进程中的执行路径。 1.2 多线程启动 线程有两种启动方式:实现Runnable接口;继承Thread类并重写run()方法。 执行进程中的任务时才会产生线程&a…...
Linux基本指令(一)
文章目录文件操作文档操作系统管理网络通信备份压缩Ctrl Alt T 打开终端 文件操作 1.复制文件 cp afile bfile (将名为afile的文件复制到名为bfile的文件夹中,如果bfile文件不存在,系统将会创建此文件,如果bfile文件已经存在&a…...
el-dialog子组件在mounted周期内获取不到dom?
el-dialog子组件在mounted周期内获取不到dom?一、问题描述二、分析原因三、猜测正常父子组件在mounted生命周期内可以获得dom 父created—子created—子mounted—父mounted----子updated—父updated 一、问题描述 ** el-dialog控制显示隐藏是css控制的display&…...
第九章 opengl之光照(光照贴图)
OpenGL光照贴图漫反射贴图镜面光贴图光照贴图 一个物体的不同部分是不同的材质,那么会有不同的环境光和漫反射颜色表现。 漫反射贴图 原理就是:纹理。 是对同样的原理使用了不同的名字:其实都是使用一张覆盖物体的图像,让我们能…...
JDK动态代理(powernode CD2207 video)(内含教学视频+源代码)
JDK动态代理(powernode CD2207 video)(内含教学视频源代码) 教学视频原代码下载链接地址:https://download.csdn.net/download/weixin_46411355/87545977 目录JDK动态代理(powernode CD2207 video…...
【Linux】Sudo的隐晦bug引发的一次业务问题排查
Sudo的隐晦bug引发的一次业务问题排查写在前面问题描述问题排查高负载现象排查日志排查跟踪任务调度过程Sudo引发的问题手动复现问题分析处理方案写在前面 记录一次生产环境sudo启动进程频繁被Kill且不报错的异常处理过程,如果遇到同样的问题只想要解决方案&#x…...
Java VisualVM 安装 Visual GC 插件图文教程
文章目录1. 通过运行打开 Java VisualVM 监控工具2. 菜单栏初始视图说明3. 工具插件菜单说明4. 手工安装插件5. 重启监控工具查看 Visual GC1. 通过运行打开 Java VisualVM 监控工具 首先确保已安装 Java 环境,如此处安装版本 JDK 1.8.0_161 C:\Users\niaonao>j…...
【C语言】详解静态变量static
关键字static 在C语言中:static是用来修饰变量和函数的static主要作用为:1. 修饰局部变量-静态局部变量 2. 修饰全局变量-静态全局变量3. 修饰函数-静态函数在讲解静态变量之前,我们应该了解静态变量和其他变量的区别: 修饰局部变量 //代码1 #include &l…...
SpringBoot整合ElasticSearch实现模糊查询,排序,分页,高亮
目录 前言 1.框架集成-SpringData-整体介绍 1.1Spring Data Elasticsearch 介绍 2.框架集成Spring Data Elasticsearch 2.1版本说明 2.2.idea创建一个springboot项目 2.3.导入依懒 2.3.增加配置文件 2.4Spring Boot 主程序。 2.5.数据实体类 2.6.配置类 2.7.DAO 数据…...
YARN基本架构
主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成,如图所YA示。 ResourceManager(RM) RM是全局资源管理器,负责整个系统的资源管理和分配 主要由两个组件构成:Scheduler调度器和应用程序…...
【C++复习】类和对象全知识点总结
类和对象写在前面类和对象面向对象类类的定义类的访问限定符类的作用域类的实例化类对象大小this指针类的默认成员函数构造函数析构函数拷贝构造函数运算符重载赋值运算符重载前置后置重载取地址及const取地址操作符重载const 成员static 成员友元友元函数有元类内部类匿名对象…...
基于轻量级YOLOv5开发构建汉字检测识别分析系统
汉字检测、字母检测、手写数字检测、藏文检测、甲骨文检测在我之前的文章中都有做过了,今天主要是因为实际项目的需要,之前的汉字检测模型较为古老了还使用的yolov3时期的模型,检测精度和推理速度都有不小的滞后了,这里要基于yolo…...
antd vue表单实战:getFieldDecorator、getFieldValue、setFieldValue保姆级教程
Ant Design Vue 表单开发深度指南:数据绑定与动态操作实战 在当今前端开发领域,表单处理一直是构建交互式应用的核心挑战之一。Ant Design Vue 作为企业级 UI 设计语言和 React 实现,提供了一套强大而灵活的表单解决方案,特别适合…...
微信小程序身份证检测实战:从createVKSession版本兼容到真机调试全解析
1. 微信小程序身份证检测功能开发概述 最近在开发一个需要身份证识别功能的小程序时,遇到了一个让人头疼的问题:在开发者工具中运行正常,但真机调试时却报错"createVKSession:fail The current device does not support version v1&quo…...
如何让微信聊天记录真正属于你:完整备份与分析终极指南
如何让微信聊天记录真正属于你:完整备份与分析终极指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeCh…...
MacOS开发环境配置:OpenClaw+GLM-4.7-Flash联调指南
MacOS开发环境配置:OpenClawGLM-4.7-Flash联调指南 1. 为什么选择这个组合? 去年我在做一个自动化文档处理项目时,发现市面上的AI工具要么隐私性不足,要么灵活性太差。直到偶然接触到OpenClaw这个开源框架,才找到了理…...
VAP:腾讯开源的高性能动画播放引擎,如何让你的应用动起来更流畅?
VAP:腾讯开源的高性能动画播放引擎,如何让你的应用动起来更流畅? 【免费下载链接】vap VAP是企鹅电竞开发,用于播放特效动画的实现方案。具有高压缩率、硬件解码等优点。同时支持 iOS,Android,Web 平台。 项目地址: https://git…...
LTI系统设计避坑指南:因果性与稳定性在实际工程中的5个关键检查点
LTI系统设计避坑指南:因果性与稳定性在实际工程中的5个关键检查点 在数字信号处理领域,线性时不变(LTI)系统的设计是工程师日常工作的核心。然而,理论推导与工程实践之间往往存在一道鸿沟——许多在数学上完美的系统模…...
Cosmos-Reason1-7B企业应用案例:研发团队用它做内部技术文档逻辑校验与补全
Cosmos-Reason1-7B企业应用案例:研发团队用它做内部技术文档逻辑校验与补全 1. 引言:技术文档的“逻辑陷阱”与AI解法 想象一下这个场景:你所在的研发团队刚刚完成了一个新模块的开发,需要撰写一份详细的技术设计文档。文档洋洋…...
MIB2 High Toolbox:重新定义车载娱乐系统定制体验
MIB2 High Toolbox:重新定义车载娱乐系统定制体验 【免费下载链接】mib2-toolbox The ultimate MIB2-HIGH toolbox. 项目地址: https://gitcode.com/gh_mirrors/mi/mib2-toolbox 车载娱乐系统是否还停留在出厂设置?想要个性化界面却苦于没有工具&…...
MoveIt 2 Launch文件进阶:如何用MoveItConfigsBuilder灵活切换规划器(OMPL vs. Pilz)
MoveIt 2规划器切换实战:用MoveItConfigsBuilder实现OMPL与Pilz工业规划器的动态选择 在工业机器人应用开发中,运动规划器的选择往往决定了任务执行的效率和质量。想象一下这样的场景:你的机械臂需要在杂乱环境中快速避障移动时,…...
手把手教你用readelf解析DWARF栈信息(含常见错误排查)
深入解析DWARF栈信息:从readelf实战到疑难排查 调试二进制文件时,栈信息的解析往往是定位问题的关键。当程序崩溃或异常时,理解调用栈的状态不仅能帮助我们快速定位问题,还能揭示更深层次的运行机制。本文将带你深入探索如何利用r…...
