EOS SDK For Unity地址:https://github.com/PlayEveryWare/eos_plugin_for_unity_upm

Epic是虚幻游戏引擎开发商,2018年12月Epic宣布推出Epic游戏商城至今刚好三年,Epic将平台分成定为12%(远低于当时Steam的30%),并且频繁推出各种让利、免费活动。

天下苦G胖久矣,Epic靠着这些骚操作迅速崛起。身边很多朋友买游戏先去Epic看价格,纷纷入坑。作为旁观者的我,一度以为Epic形势大好,取代Steam只是一丢丢时间的问题了。直到我接到接入EOS SDK的需求。

想当年咱可是接过无数各种SDK, Android、iOS双端信手拈来,小众SDK也没少见,再不专业的sdk也都轻松拿捏。直到遇到EOS SDK,大名鼎鼎虚幻家的sdk。瞬间让我觉得,我还太嫩,任重道远。。。

感情Epic把钱都拿去砸营销、抛诱饵钓用户去了,SDK和开发者后台管理严重经费不足! 甚至还是个半成品。官方开发者文档和最新的eos sdk demo,可以说是驴唇不对马嘴。看demo是一辆车,加上油就能开。看文档是一堆零件,想用可以,自己组装造车。我$^%^&*^&*^*&^!

Epic游戏商城发展至今三年了,国内/外几乎搜不到一篇正经接入文档,只有官方文档和官方论坛能找到线索。。

记录踩坑过程,栽树于此,以便后人乘凉:

0, 首先抛弃官方文档,一个字都不用看,毫无参考意义;

1, 下载eos sdk, https://github.com/PlayEveryWare/eos_plugin_for_unity_upm.git

①打开Unity Package Manager以git方式添加eos插件。

②把添加到本地的eos插件从Library目录移动到项目的Packages目录下(不要改插件文件夹名!)

为什么要脱裤子放屁?

因为Epic插件在Eidtor模式会根据插件路径动态加载dll文件,dll文件目录是按规则写死的,路径改变就会报错!

其次,插件依赖的dll默认是Any Platform, 然而插件dll实际只支持win32/64, 打包Switch、PS4/5等其它平台必然报错,打包失败。因此要把插件从Library下的缓存目录移动到Packages下,作为本地插件,这样才能修改dll的平台;

③ 把eos的所有dll平台都改为Editor、Windows 32-bit、 Windows 64-bit

2,导入eos sdk的示例,在Unity Package Manager中选中eos插件左侧信息栏有导入示例按钮。

示例代码中有很多xxManager文件,示例把乱七八槽的汽车零件(半成品)通过各种Manager组装成了接近成品的汽车,直接复用这些Manager接入eos就变得可以接受了。

3,把EOSManager和EOSHostManager两个脚本挂到启动场景,并勾选Awake时初始化;

4,接入模块功能:

demo把各个模块功能封装成了EOSXXXManager(其中XXX为模块名),sdk初始化后可通过代码var manager = EOSManager.Instance.GetOrCreateManager<EOSXXXManager>()动态添加需要接入的功能模块,对应的EOSXXXManager已经封装好了模块功能。

5,登录,登录为必接模块。可直接抄示例中的登录实现代码。

Epic提供了4种登录模式,首先排除每次打开游戏都弹出登录窗口,只考虑持久化登录方式:

首先如果是上架到Epic游戏商城,官方回强烈建议你使用LoginCredentialType.ExchangeCode方式登录,即登录时向Epic Game Launcher获取用户信息,直接作为参数静默登录游戏,此方式不会弹出登录窗口。

为了登录流程逻辑严谨,若ExchangeCode方式登录失败,再使用LoginCredentialType.AccountPortal方式登录, AccountPortal登录会弹出Epic登录窗口,登录成功后会在本地存储一个长期的刷新令牌;登录流程为:

1.使用EOSManager.Instance.StartPersistentLogin()先从本地令牌登录,若本地有令牌则登录成功;

2.如果本地没有令牌StartPersistentLogin()会登录失败,在登录失败后再通过

EOSManager.Instance.StartLoginWithLoginTypeAndToken(LoginCredentialType.AccountPortal,ExternalCredentialType.Epic, null, null, loginResult=>{}); 弹出登录授权窗口方式登录,此方式登录成功后会在本地保存令牌,以供下载StartPersistentLogin()静默登录。

public void Login(){
#if UNITY_EDITORLoginWithPersistentMode();//编辑器模式Persistent模式登录
#elsevar token = string.Empty;string[] commandArgs = Environment.GetCommandLineArgs();foreach (var commandArg in commandArgs){if (commandArg.Contains("AUTH_PASSWORD")){var args = commandArg.Split('=');if (args.Length >= 2){token = args[1];}}}EOSManager.Instance.StartLoginWithLoginTypeAndToken(LoginCredentialType.ExchangeCode, null, token, callbackInfo =>{if (callbackInfo.ResultCode != Epic.OnlineServices.Result.Success){LoginWithPersistentMode();}else{StartLoginWithLoginTypeAndTokenCallback(callbackInfo);}});
#endif}public void LoginWithPersistentMode(){EOSManager.Instance.StartPersistentLogin((Epic.OnlineServices.Auth.LoginCallbackInfo callbackInfo) =>{if (callbackInfo.ResultCode != Epic.OnlineServices.Result.Success){LoginWithLoginTypeAndToken();}else{StartLoginWithLoginTypeAndTokenCallback(callbackInfo);}});}private void LoginWithLoginTypeAndToken(){EOSManager.Instance.StartLoginWithLoginTypeAndToken(Epic.OnlineServices.Auth.LoginCredentialType.AccountPortal, ExternalCredentialType.Epic, null, null,loginResult =>{EOSManager.Instance.StartConnectLoginWithEpicAccount(loginResult.LocalUserId, (Epic.OnlineServices.Connect.LoginCallbackInfo connectLoginCallbackInfo) =>{if (connectLoginCallbackInfo.ResultCode == Result.Success){_productUserId = connectLoginCallbackInfo.LocalUserId;}else if (connectLoginCallbackInfo.ResultCode == Result.InvalidUser){// ask user if they want to connect; sample assumes they doEOSManager.Instance.CreateConnectUserWithContinuanceToken(connectLoginCallbackInfo.ContinuanceToken, (Epic.OnlineServices.Connect.CreateUserCallbackInfo createUserCallbackInfo) =>{EOSManager.Instance.StartConnectLoginWithEpicAccount(loginResult.LocalUserId, (Epic.OnlineServices.Connect.LoginCallbackInfo retryConnectLoginCallbackInfo) =>{if (retryConnectLoginCallbackInfo.ResultCode == Result.Success){_productUserId = retryConnectLoginCallbackInfo.LocalUserId;}});});}else{}});});}private void StartConnectLoginWithLoginCallbackInfo(LoginCallbackInfo loginCallbackInfo){EOSManager.Instance.StartConnectLoginWithEpicAccount(loginCallbackInfo.LocalUserId, (Epic.OnlineServices.Connect.LoginCallbackInfo connectLoginCallbackInfo) =>{if (connectLoginCallbackInfo.ResultCode == Result.Success){_productUserId = connectLoginCallbackInfo.LocalUserId;}else if (connectLoginCallbackInfo.ResultCode == Result.InvalidUser){EOSManager.Instance.CreateConnectUserWithContinuanceToken(connectLoginCallbackInfo.ContinuanceToken, (Epic.OnlineServices.Connect.CreateUserCallbackInfo createUserCallbackInfo) =>{EOSManager.Instance.StartConnectLoginWithEpicAccount(loginCallbackInfo.LocalUserId, (Epic.OnlineServices.Connect.LoginCallbackInfo retryConnectLoginCallbackInfo) =>{if (retryConnectLoginCallbackInfo.ResultCode == Result.Success){_productUserId = retryConnectLoginCallbackInfo.LocalUserId;}});});}});}

6,Unity菜单栏Tool下有eos参数配置工具,其中产品名(游戏名),版本号,产品id,沙盒id, 部署id, 客户端id, 客户端密钥必须配置,密钥下方的一串字符可点击生成自动产生。参数在开发者后台->产品设置;

7,获取DLC状态,Epic开发者后台创建DLC商品,然后通过下面API可以获取用户是否购买了DLC:

public void CheckOwnedDLC(string dlcId, Action<bool> callback){var localUserId = EOSManager.Instance.GetLocalUserId();var ecomInterface = EOSManager.Instance.GetEOSEcomInterface();var options = new QueryOwnershipOptions(){CatalogItemIds = new[] { new Utf8String(dlcId) },LocalUserId = localUserId,};ecomInterface.QueryOwnership(ref options, null, (ref QueryOwnershipCallbackInfo data) =>{if (data.ResultCode == Result.Success){bool ownedDlc = false;foreach (var item in data.ItemOwnership){var itemId = item.Id.ToString();if (itemId.CompareTo(dlcId) == 0){ownedDlc = item.OwnershipStatus == OwnershipStatus.Owned;}}callback.Invoke(ownedDlc);}else{callback.Invoke(false);}});}

至此,你非常Happy的以为你接完了,可以测试了,当你Happy地点下运行按钮,不出意外的情况下必然eos sdk必然登录失败!然而当你把参数换上官方demo里的参数后一下就登录成功了。。。由此可以推断,一定不是接入代码的锅,一定是开发者后台配置的锅。嗯,你可以怀疑人生了。

恭喜,踩到了第一个巨坑。无任何征兆和提示,到处找不到线索。

最后发现需要把开发者后台的获取位置权限关闭才能成功登录,设置入口如下图:

7. 发布上传:

此时官方文档终于派上了用场,Epic发布游戏像Steam一样也需要专门的发布工具,需要下载BuildPatch Tool:BuildPatch Tool Instructions (1.5.0) | Epic Online Services Developer

这个工具是通过命令行工作!使用方法如图:最重要是把必须参数填对,否则上传失败。

    .\BuildPatchTool.exe-OrganizationId="<组织id,谁有开发者账号最高权限找谁要>"-ProductId="<产品id>"-ArtifactId="<应用id>"-ClientId="<BPT客户端id>"-ClientSecretEnvVar="<BPT客户端密钥>"-mode=UploadBinary-BuildRoot="<打包目录>"-CloudDir="<选个本地目录>"-BuildVersion="<版本号>"-AppLaunch="<游戏客户端.exe>"-AppArgs=""

BuildPatch Tool很鸡肋,不支持忽略上传文件夹,需要把每一个要忽略上传的文件列出来。所以写了个可视化上传工具,支持配置文件夹和文件:https://github.com/sunsvip/EpicGameUploader :

ArtifactId是程序包id,  藏得比蛟龙号都深。寻宝路线如下图,千万别迷路:

注意:Build Patch Tool需要的ClientId和ClientSecretEnvVar不是eos接入所需的客户端id,客户端密钥,而是BPT ClientId 和 BPT ClientSecret,(Epic的人是用脚思考问题吗?这么制造歧义误导开发者合适吗?), 寻宝路径为 开发者后台=>产品设置=>通用,寻宝图如下:

【Unity】填坑,Unity接入Epic Online Service上架Epic游戏商城相关推荐

  1. Unity填坑之俯视角相机水平面方向移动

    Unity填坑之俯视角相机水平面方向移动 文章目录 Unity填坑之俯视角相机水平面方向移动 前言 一.需求分析 二.解决方案有两种 1.模拟一个小人 2.通过四元数旋转的方式 总结 前言 碰到一个需 ...

  2. C4D/MAYA导入Unity填坑以及C4D渲染自我心得

    自我学习进程中, @1 C4D/MAYA的动作导入到Unity里可以只导入骨骼动作. @2 动作需要预留1帧T-Pose让Unity骨骼匹配绑定. @3 可能还存在骨骼问题,重新Unity进行骨骼匹配 ...

  3. Unity填坑之粒子的ScaleMode

    项目场景: 美术做好了一个粒子效果,挂载UI的预制 问题描述: :打开预制预览查看,大小与重力都是对的,一旦放到真实的UI层级之下,效果就完全不对了. 原因分析: 美术在粒子上使用了重力,然后Simu ...

  4. unity android 分包,Unity以分包(obb)形式集成到安卓原生 我慢慢填坑

    Unity以分包(obb)形式集成到安卓原生 我慢慢填坑 Unity以分包(obb)形式集成到安卓原生 我慢慢填坑 工作中有需要将unity项目集成到安卓原生中,随着工作推进需要分包去发布到googl ...

  5. unity代码更换ui图片_Unity3d 低分辨率UI素材换高分辨率素材填坑笔记

    迷糊 RectTransform PosX.PosY.Left .Right . Top .Bottom 以及 AchorMax/AnchorMin 的,开卷有益哟~ 背景 笔者开发的(PC)APP ...

  6. unity开发之七:unity2017自带高通ar使用方法(填坑)

    一:首先我们先把2017.2自带的高通ar包下载下来,然后才有选择的选项 二:我们开始建AR项目 首先我们往场景中添加ARCamera,我们发现我们输入key,需要如下的操作:,然后我们去官网申请ke ...

  7. 【100个 Unity踩坑小知识点】| Unity调用API ,动态获取Android权限,附带所有Android权限表格

    Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 . 包括游戏开发.美术.建筑.汽车设计.影视在内的所有创作者,借助 Unity 将创意 ...

  8. 【Unity】对Unity引用三方字体的踩坑日志

    一.Unity导入三方字体 导入字体文件 要在项目中添加字体,必须将字体文件放在 Assets 文件夹中.然后,Unity 会自动将其导入.支持的字体格式为 TrueType 字体(.ttf 文件)和 ...

  9. Unity踩坑-多级四元数旋转(多级骨骼)

    Unity踩坑-多级四元数旋转(多级骨骼) 前言 当单个物体变为多级物体... 启发 旋转更正 == 仅供学习.笔记之用 ,如有错误望指正== 前言 上文讲了单个物体利用四元数进行局部或本地的旋转.如 ...

最新文章

  1. Exception in thread main java.lang.OutOfMemoryError: Java heap space
  2. Angular2入门教程-1
  3. 通用!Python保存一个对象的方式
  4. 长能耐了?想造反了?你老婆没了.......
  5. JVM运行参数_JVM内存模型_常用内存分析工具
  6. mysqld_multi stop 不能停掉mysql
  7. 纪念品分组(洛谷-P1094)
  8. 搭建Cockpit服务器,Linux集群管理工具,DevOps开发运维一体化集群系统/持续集成
  9. PVS的内存和存储规划设计
  10. 10进制转16进制 java_Java中将10进制转换成16进制
  11. C#多线程的用法2-线程的生命周期
  12. 中国指数基金与ETF价格战简史(1)
  13. matlab prn文件,教你妙用PRN文件 实现文档的换机打印
  14. ArcPy常用类介绍
  15. MATLAB编辑AWG波形,AWG5200任意波形发生器的功能特点及性能分析
  16. 动画:二叉树有几种存储方式?(上)
  17. iOS IPv6测试环境搭建及服务器ipv6测试
  18. vs2017 自定义背景图片
  19. 学生成绩管理系统(C语言)(链表)
  20. html表头解释_1分钟内解释的html

热门文章

  1. windows开启自启动jar包
  2. Springboot后台HTML/富文本转图片
  3. 安卓测试工具:Appium 环境安装(mac版本)
  4. 神舟战神笔记本Controlcenter3.0安装教程,解决osd only
  5. 关于设置OkGo自定义回调JsonCallback的相关整理
  6. 音乐信号处理权威会议
  7. 如何学习MATLAB
  8. 国外期刊发表文章时一定用到的SCI论文写法攻略
  9. 灰度共生矩阵特征提取步骤_灰度共生矩阵纹理特征提取的Matlab实现
  10. web前端工程师主要学什么内容