Как интегрировать GameLift с Unity3d в качестве игрового клиента - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь использовать игру Unity3d в качестве клиента GameList.

Согласно форуму GameLift , похоже, Amazon не рекомендует использовать игровой клиент в качестве клиента GameLift напрямую.

Но я хочу попробовать, потому что мне не нужен еще один отдельный игровой сервис.

  1. Первый шаг - загрузка исходного кода AWS SDK из GitHub и сборка версии .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);
    }
}

Здесь я столкнулся с первой проблемой: Не удалось создать GameLiftClient

После исправления вышеуказанной проблемы я попытался использовать 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)
Я добавил еще несколько настроек в свой 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>
Теперь я получаю еще одно исключение:
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 Core: 3.3.29.10 (.net35)
  • AWS SDK GameLift:3.3.12.29 (.net35)

1 Ответ

0 голосов
/ 20 декабря 2018

В конце концов я нахожу способ использовать GameLiftClient в Unity3d.

Необходимое условие:

  • Windows 10
  • JetBrainRider , Visual Studio также должна работать
  • Поместить «UnityEngine.dll» в C: \ Program Files \ Unity \ Editor \ Data \ Managed \ UnityEngine.dll
  • Установить «Время выполнения сценариев»версия "to" .net35 Эквивалент "в настройках проекта вашего проекта Unity3d.

Шаг 1: Загрузите AWS SDK Source для Github и разархивируйте егокуда угодно.

Безопаснее загрузить версию, совместимую с используемым вами GameLift Server SDK.

Шаг 2: Открыть sdk/AWSSDK.Unity.sln in JetBrain Rider .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>

Выше ProjectReferece копируется из любого другого параметра Project, который включен в решение по умолчанию.Не забудьте сохранить файл.

Шаг 5: Щелкните правой кнопкой мыши «AWSSDK.GameLift.Net35.csproj» и выберите «Построить выбранные проекты».

Шаг 6: Перейдите в «sdk \ src \ Services \ GameLift \ bin \ Debug \ net35» или «sdk \ src \ Services \ GameLift \ bin \ Release \ net35», скопируйте все dll, кроме «UnityEngnine.dll», в ваш проект Unity3d.Я помещаю их в 'Assets / AWSSDK'.

Шаг 7: Создайте 'Assets / 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 в клиенте.Поэтому, пожалуйста, используйте этот фрагмент кода только для целей тестирования.В производственных целях AWS Cognito можно использовать для распространения учетных данных AWS во время выполнения.

Все готово.

Кстати, я инженер из Recreate Games , а не "родной"Англоговорящий человек.Поэтому, пожалуйста, прости мой английский, любые предложения приветствуются.Спасибо:)

...