如何将 GameLift 与 Unity3d 集成为游戏客户端
How to integrate GameLift with Unity3d as a game client
我正在尝试使用 Unity3d 游戏作为 GameList 客户端。
根据GameLift forum的说法,亚马逊似乎不建议直接使用游戏客户端作为GameLift客户端。
但我想试一试,因为我不想再有一个单独的游戏服务。
第一步是从GitHub下载AWS SDK源代码并构建.net35版本的dll;
将AWSSDK.Core.dll和AWSSDK.GameLift.dll放入/Assets/Plugins;
从 MonoBehaviour 创建一个新的派生 class 来创建 AmazonGameLiftClient,下面是我的代码:
public class MyGameLiftClient : MonoBehaviour
{
private void Awake()
{
AmazonGameLiftConfig gameLiftConfig =
new AmazonGameLiftConfig {RegionEndpoint = RegionEndpoint.USWest1};
AmazonGameLiftClient client = new AmazonGameLiftClient(
"AwsAccessKeyId",
"AwsSecrectAcessKey",
gameLiftConfig);
}
}
这里我遇到了第一个问题:
解决上述问题后,我尝试使用 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)
有人知道这个异常吗?
我的环境:
- OS: 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)
最终,我找到了一种在 Unity3d 中使用 GameLiftClient 的方法。
先决条件:
- Windows 10
- JetBrain Rider、Visual Studio 也应该有效
- 将“UnityEngine.dll”放到C:\Program Files\Unity\Editor\Data\Managed\UnityEngine.dll
- 在 Unity3d 项目的项目设置中将“脚本运行时版本”设置为“.net35 等效版本”。
第 1 步:
从 Github 下载 AWS SDK 源并将其解压缩到您喜欢的任何位置。
下载与您使用的 GameLift 服务器 SDK 兼容的版本更安全。
第 2 步:
在 JetBrain Rider 中打开 sdk/AWSSDK.Unity.sln
。 Visual Studio 应该也可以,但我没有与该解决方案兼容的正确版本的 VS。
第 3 步:
在 Rider 的解决方案面板中,在“服务”下创建一个新的解决方案文件夹,将其命名为“GameLift”。
右键单击“GameLift”文件夹并选择“添加现有项目”。在弹出窗口 windows 中,浏览并选择“sdk\src\Services\GameLift\AWSSDK.GameLift.Net35.csproj”。
现在解决方案应该如下所示:
第 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 是从默认情况下包含在解决方案中的任何其他项目设置复制而来的。
不要忘记保存文件。
第 5 步:
右键单击“AWSSDK.GameLift.Net35.csproj”并选择“生成所选项目”。
第 6 步:
转到“sdk\src\Services\GameLift\bin\Debug\net35”或“sdk\src\Services\GameLift\bin\Release\net35”,将除“UnityEngnine.dll”之外的所有 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 凭证。
全部完成。
我正在尝试使用 Unity3d 游戏作为 GameList 客户端。
根据GameLift forum的说法,亚马逊似乎不建议直接使用游戏客户端作为GameLift客户端。
但我想试一试,因为我不想再有一个单独的游戏服务。
第一步是从GitHub下载AWS SDK源代码并构建.net35版本的dll;
将AWSSDK.Core.dll和AWSSDK.GameLift.dll放入/Assets/Plugins;
从 MonoBehaviour 创建一个新的派生 class 来创建 AmazonGameLiftClient,下面是我的代码:
public class MyGameLiftClient : MonoBehaviour
{
private void Awake()
{
AmazonGameLiftConfig gameLiftConfig =
new AmazonGameLiftConfig {RegionEndpoint = RegionEndpoint.USWest1};
AmazonGameLiftClient client = new AmazonGameLiftClient(
"AwsAccessKeyId",
"AwsSecrectAcessKey",
gameLiftConfig);
}
}
这里我遇到了第一个问题:
解决上述问题后,我尝试使用 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)
有人知道这个异常吗?
我的环境:
- OS: 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)
最终,我找到了一种在 Unity3d 中使用 GameLiftClient 的方法。
先决条件:
- Windows 10
- JetBrain Rider、Visual Studio 也应该有效
- 将“UnityEngine.dll”放到C:\Program Files\Unity\Editor\Data\Managed\UnityEngine.dll
- 在 Unity3d 项目的项目设置中将“脚本运行时版本”设置为“.net35 等效版本”。
第 1 步: 从 Github 下载 AWS SDK 源并将其解压缩到您喜欢的任何位置。
下载与您使用的 GameLift 服务器 SDK 兼容的版本更安全。
第 2 步:
在 JetBrain Rider 中打开 sdk/AWSSDK.Unity.sln
。 Visual Studio 应该也可以,但我没有与该解决方案兼容的正确版本的 VS。
第 3 步: 在 Rider 的解决方案面板中,在“服务”下创建一个新的解决方案文件夹,将其命名为“GameLift”。 右键单击“GameLift”文件夹并选择“添加现有项目”。在弹出窗口 windows 中,浏览并选择“sdk\src\Services\GameLift\AWSSDK.GameLift.Net35.csproj”。
现在解决方案应该如下所示:
第 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 是从默认情况下包含在解决方案中的任何其他项目设置复制而来的。 不要忘记保存文件。
第 5 步: 右键单击“AWSSDK.GameLift.Net35.csproj”并选择“生成所选项目”。
第 6 步: 转到“sdk\src\Services\GameLift\bin\Debug\net35”或“sdk\src\Services\GameLift\bin\Release\net35”,将除“UnityEngnine.dll”之外的所有 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 凭证。
全部完成。