如何将GameLift与Unity3d集成为游戏客户端

时间:2018-12-02 09:01:28

标签: c# .net amazon-web-services unity3d amazon-gamelift

我正在尝试将Unity3d游戏用作GameList客户端。

根据GameLift forum,看来亚马逊不建议将游戏客户端直接用作GameLift客户端。

但是我想尝试一下,因为我不想再提供单独的游戏服务。

  1. 第一步是从GitHub下载AWS开发工具包源代码并构建.net35版本dll;

  2. 将AWSSDK.Core.dll和AWSSDK.GameLift.dll放入/ Assets / Plugins;

  3. 从MonoBehaviour创建一个新的派生类以创建AmazonGameLiftClient,下面是我的代码:

public class MyGameLiftClient : MonoBehaviour
{
    private void Awake()
    {    
        AmazonGameLiftConfig gameLiftConfig = 
                new AmazonGameLiftConfig {RegionEndpoint = RegionEndpoint.USWest1};
        AmazonGameLiftClient client = new AmazonGameLiftClient(
                "AwsAccessKeyId",
                "AwsSecrectAcessKey",
                gameLiftConfig);
    }
}
  1. 在这里我遇到了第一个问题:Failed to create the GameLiftClient

  2. 解决上述问题后,我尝试使用AmazonGameLiftClient列出舰队:

AmazonGameLiftConfig gameLiftConfig = new AmazonGameLiftConfig {RegionEndpoint = RegionEndpoint.USWest1};
AmazonGameLiftClient client = new AmazonGameLiftClient(
            "awsAccessKeyId",
            "awsAccessSecretKey",
            gameLiftConfig);
ListFleetsRequest listFleetsRequest = new ListFleetsRequest();
ListFleetsResponse fleets = client.ListFleets(listFleetsRequest);

但是我得到以下例外:

NotSupportedException: https://gamelift.us-west-1.amazonaws.com/
System.Net.WebRequest.GetCreator (System.String prefix)
System.Net.WebRequest.Create (System.Uri requestUri)
Amazon.Runtime.Internal.HttpRequest..ctor (System.Uri requestUri)
Amazon.Runtime.Internal.HttpWebRequestFactory.CreateHttpRequest (System.Uri requestUri)
Amazon.Runtime.Internal.HttpHandler`1[System.IO.Stream].CreateWebRequest (IRequestContext requestContext)
Amazon.Runtime.Internal.HttpHandler`1[System.IO.Stream].InvokeSync (IExecutionContext executionContext)
Amazon.Runtime.Internal.PipelineHandler.InvokeSync (IExecutionContext executionContext)
Amazon.Runtime.Internal.Unmarshaller.InvokeSync (IExecutionContext executionContext)
Amazon.Runtime.Internal.PipelineHandler.InvokeSync (IExecutionContext executionContext)
Amazon.Runtime.Internal.ErrorHandler.InvokeSync (IExecutionContext executionContext)
  1. 我在aws.config中添加了更多配置以对其进行修复,以下是我的整个aws.config:
<configuration>
  <configSections>
    <section name="aws" type="Amazon.AWSSection, AWSSDK.Core"/>
    <section name="system.diagnostics" type="System.Diagnostics.DiagnosticsConfigurationHandler" />
    <sectionGroup name="system.net" type="System.Net.Configuration.NetSectionGroup, System">
       <section name="authenticationModules" type="System.Net.Configuration.AuthenticationModulesSection, System" />
       <section name="connectionManagement" type="System.Net.Configuration.ConnectionManagementSection, System" />
       <sectionGroup name="mailSettings" type="System.Net.Configuration.MailSettingsSectionGroup, System">
          <section name="smtp" type="System.Net.Configuration.SmtpSection, System" />
       </sectionGroup>
       <section name="requestCaching" type="System.Net.Configuration.RequestCachingSection, System" />
       <section name="settings" type="System.Net.Configuration.SettingsSection, System" />
       <section name="webRequestModules" type="System.Net.Configuration.WebRequestModulesSection, System" />
     </sectionGroup>
  </configSections>
  <aws>
    <logging logTo="Log4Net"/>
    <csmConfig csmEnabled="false"/>
  </aws>
  <system.diagnostics>
     <trace autoflush="true" />
  </system.diagnostics>
  <system.net>  
    <authenticationModules>  
      <add type="System.Net.DigestClient" />  
      <add type="System.Net.NegotiateClient" />  
      <add type="System.Net.KerberosClient" />  
      <add type="System.Net.NtlmClient" />  
      <add type="System.Net.BasicClient" />  
    </authenticationModules>  
    <connectionManagement>  
      <add address="*" maxconnection="2" />  
    </connectionManagement>  
    <webRequestModules>  
      <add prefix="http"  
           type="System.Net.HttpRequestCreator"  
      />  
      <add prefix="https"  
           type="System.Net.HttpRequestCreator"  
      />  
      <add prefix="file"  
           type="System.Net.FileWebRequestCreator"  
      />
    </webRequestModules>  
  </system.net>  
</configuration>
  1. 现在我得到另一个例外:
MissingMethodException: Method not found: 'System.Net.ServicePoint.SetTcpKeepAlive'.
Amazon.Runtime.Internal.HttpHandler`1[System.IO.Stream].CreateWebRequest (IRequestContext requestContext)
Amazon.Runtime.Internal.HttpHandler`1[System.IO.Stream].InvokeSync (IExecutionContext executionContext)
Amazon.Runtime.Internal.PipelineHandler.InvokeSync (IExecutionContext executionContext)
Amazon.Runtime.Internal.Unmarshaller.InvokeSync (IExecutionContext executionContext)
Amazon.Runtime.Internal.PipelineHandler.InvokeSync (IExecutionContext executionContext)
Amazon.Runtime.Internal.ErrorHandler.InvokeSync (IExecutionContext executionContext)

有人对此异常有想法吗?

我的环境:

  • 操作系统:Mac OS X 10.14.1
  • Unity3d:2018.2.12f1
  • AWS SDK核心:3.3.29.10(.net35)
  • AWS SDK GameLift:3.3.12.29(.net35)

1 个答案:

答案 0 :(得分:1)

最终,我找到了在Unity3d中使用GameLiftClient的方法。

先决条件:

  • Windows 10
  • JetBrain Rider,Visual Studio也应该工作
  • 将“ UnityEngine.dll”放入C:\ Program Files \ Unity \ Editor \ Data \ Managed \ UnityEngine.dll
  • 在Unity3d项目的项目设置中将“脚本运行时版本”设置为“ .net35等效项”。

步骤1:Github下载适用的AWS开发工具包源,并将其解压缩到您喜欢的任何位置。

下载与您使用的GameLift Server SDK兼容的版本更为安全。

步骤2:JetBrain Rider中打开sdk/AWSSDK.Unity.sln。 Visual Studio也应该工作,但是我不拥有与该解决方案兼容的VS的正确版本。

第3步: 在Rider的解决方案面板中,在“服务”下创建一个新的解决方案文件夹,将其命名为“ GameLift”。 右键单击“ GameLift”文件夹,然后选择“添加现有项目”。在弹出窗口中,浏览并选择“ sdk \ src \ Services \ GameLift \ AWSSDK.GameLift.Net35.csproj”。

现在解决方案应如下所示:

enter image description here

第4步: 右键单击“ AWSSDK.GameLift.Net35.csproj”,然后选择“编辑AWSSDK.GameLift.Net35.csproj” 在Rider的编辑器面板中,将<ProjectReference Include="..\..\Core\AWSSDK.Core.Net35.csproj"/>更改为

<ProjectReference Include="..\..\Core\AWSSDK.Core.Unity.csproj">
  <Project>{5A8B25C1-3D58-4BB6-BF7D-77AD818D9EAD}</Project>
  <Name>AWSSDK.Core.Unity</Name>
</ProjectReference>

默认情况下,从解决方案中包含的任何其他Project设置复制ProjectReferece。 不要忘记保存文件。

第5步: 右键单击“ AWSSDK.GameLift.Net35.csproj”,然后选择“构建选定的项目”。

步骤6: 转到“ sdk \ src \ Services \ GameLift \ bin \ Debug \ net35”或“ sdk \ src \ Services \ GameLift \ bin \ Release \ net35”,将除“ UnityEngnine.dll”以外的所有dll复制到Unity3d项目中。我将它们放在“资产/ AWSSDK”下。

第7步: 使用以下内容创建“资产/AWSSDK/src/Core/Resources/awsconfig.xml”:

<?xml version="1.0" encoding="utf-8"?>
<aws
    region="us-west-1"
    correctForClockSkew="true">
</aws>

第8步: 现在,它应该能够使用以下代码片段创建GameLiftClient了:

Awake()
{
    UnityInitializer.AttachToGameObject(gameObject);

    AWSConfigs.HttpClient = AWSConfigs.HttpClientOption.UnityWebRequest;

    AmazonGameLiftConfig gameLiftConfig = new AmazonGameLiftConfig
    {
            RegionEndpoint = RegionEndpoint.USWest1
    };

    m_Client = new AmazonGameLiftClient(
                "awsAccessKeyId",
                "awsSecretAccessKey",
                gameLiftConfig);
}

不要忘记将“ awsAccessKey”替换为真实的。 此外,将AWS Credentials硬编码到客户端也是不安全的。因此,请仅将此代码段用于测试目的。出于生产目的,可以使用AWS Cognito在运行时分发AWS凭证。

全部完成。

顺便说一句,我是Recreate Games的工程师,而不是英语为母语的人。因此,请原谅我的英语,任何建议都值得赞赏。谢谢:)