6.1.6をUnityのImport Packageからインストールするとエラーで実行できない
Unity 6000.0.23.f Windows 11
YetAnotherHttpHandler 1.8.1
まずはエラーとなるコードです。
using MagicOnion;
using MagicOnion.Client;
[MagicOnionClientGeneration(typeof(Test.Shared.IUserService))]
partial class MagicOnionGeneratedClientInitializer { }
エラー文
Assets\Test\Programs\Commons\MagicOnionGeneratedClientInitializer.cs(4,2): error CS0246: The type or namespace name 'MagicOnionClientGenerationAttribute' could not be found (are you missing a using directive or an assembly reference?)
これはUnity6000.0.23f1だから起きるエラーなのでしょうか?
6000.0.23f1 で確認してみましたが単純なプロジェクトですとコンパイルエラーになることはありませんでした。
ただし、 Asssembly Definitinon (.asmdef) で切っている場合には、その Assembly Definition の Assembly Definition Reference に MagicOnion.Client がない場合に同様のエラーが発生したのでそれが原因でしょうか?
お忙しい中ご確認してくださりありがとうございます。 MagicOnion.Clientを追加してもUnityのエラーは消えませんでした。
Test.Shared.Unity.asmdefにMagicOnion.Clientを追加した状態が以下のようになります。
{
"name": "Test.Shared",
"references": [
"MessagePack",
"MagicOnion.Client",
"MagicOnion.Abstractions"
],
"optionalUnityReferences": [],
"includePlatforms": [],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": []
}
いちおうTest.Sharedのフォルダ直下にありますpackage.jsonとDirectory.Buildも貼っておきます。
{
"name": "com.test.shared",
"version": "1.0.0",
"displayName": "Test Shared Library",
"description": "Shared library for Testproject, used by both Unity and ASP.NET.",
"unity": "6000.0"
}
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<!-- Unity ignores . prefix folder -->
<ArtifactsPath>$(MSBuildThisFileDirectory).artifacts</ArtifactsPath>
</PropertyGroup>
</Project>
Test.Sharedの中身も貼っておきます。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MagicOnion.Abstractions" Version="6.1.6" />
<PackageReference Include="MessagePack" Version="3.1.0" />
<PackageReference Include="MessagePack.Annotations" Version="3.1.0" />
<PackageReference Include="MessagePackAnalyzer" Version="3.1.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
</ItemGroup>
<ItemGroup>
<None Remove="**\package.json" />
<None Remove="**\*.asmdef" />
<None Remove="**\*.meta" />
</ItemGroup>
<Target Name="RestoreLocalTools" BeforeTargets="GenerateMessagePack">
<Exec Command="dotnet tool restore" />
</Target>
<Target Name="GenerateMessagePack" AfterTargets="Build">
<PropertyGroup>
<_MessagePackGeneratorArguments>-i ./Test.Shared.csproj -o ../test-client/test/Assets/Scripts/Generated/MessagePack.Generated.cs</_MessagePackGeneratorArguments>
</PropertyGroup>
<Exec Command="mpc $(_MessagePackGeneratorArguments)" />
</Target>
</Project>
何か足らない情報などありましたらご教授願いたいです。
追加情報ありがとうございます。ちなみに Test.Shared ではなく MagicOnionGeneratedClientInitializer クラスの場所が .asmdef 配下になってませんでしょうか?
その場合ですと MagicOnionGeneratedClientInitializer が含まれる .asmdef に MagicOnion.Client への参照を追加する必要があります。
MagicOnionGeneratedClientInitializer はAssets/Scriptsに配置しています。
またAssembly DefinitionはAssetsの階層で作ったのち、Test.Sharedのプロジェクト直下へ移動させました。
パッケージマネージャーからMagicOnionのsampleのsrcを相対パスでしていすると
Assets\Test\Programs\Commons\MagicOnionGeneratedClientInitializer.cs(4,2): error CS0246: The type or namespace name 'MagicOnionClientGenerationAttribute' could not be found (are you missing a using directive or an assembly reference?)
のエラーはなくなりましたが、
Path could not be found for script compilation file 'MagicOnion.Client.SourceGenerator.Unity/MagicOnion.Client.SourceGenerator.MagicOnionClientSourceGenerator/MagicOnionClientSourceGeneratorAttributes.g.cs'
が出るようになりました。
"Path could not be found for script compilation file"に関しては、最新のUnityのKnown Issuesで書かれているのですが、 Source Generatorにおける既知のバグでまだ修正されていないようです。 Unity 6000.0.20f1から発生しているらしいので、6000.0.19f1を利用するか、修正を待つ必要があります。 逆に言えば、このエラーが発生したということは、Source Generatorは正常に動作するようになったということでもあります。 https://unity.com/ja/releases/editor/whats-new/6000.0.31
情報の提供ありがとうございます。 "Path could not be found for script compilation file"はUnity側での既知の不具合の件承知しました。 現状色々設定を見直して何とかできそうなのでもう少し設定しなおします。 お忙しい中お手数をおかけしました。 特に問題が無ければcloseさせていただきたいと思います。
現在の問題につながるか分かりませんが、以下のコードで、「var result = await client.CreateUser();」という処理が通らない状態となっています。
using MagicOnion.Client;
using MagicOnion;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Linq;
using Grpc.Core;
using System;
using System.Threading.Tasks;
namespace Test.Shared
{
public class SceneTest : MonoBehaviour
{
async public void Start()
{
await StartAsync();
}
private async Task StartAsync()
{
try
{
var channel = GrpcChannelx.ForAddress("http://localhost:8080");
var client = MagicOnionClient.Create<IUserService>(channel);
var result = await client.CreateUser();
Debug.Log($"Result: {result.UserId}");
}
catch (RpcException ex)
{
Debug.LogError($"gRPC Error: {ex.Status.Detail}");
Debug.LogError($"gRPC Status: {ex.Status.StatusCode}");
}
catch (Exception ex)
{
Debug.LogError($"Unexpected Error: {ex.Message}");
Debug.LogError($"Stack Trace: {ex.StackTrace}");
}
}
}
}
ただコンソールのプロジェクトからでは普通に通信が可能でした。
現在例外処理を挟んで確認しようと試みているのですが、上記のコードではエラーすら吐いてくれませんでした。 var result = await client.CreateUser();で処理が正常に通らなくなる条件などありましたらご教授願いたいです。
Unityのメニューにあります、MagicOnionのgrpc chanelのスタックトレースも添付しておきます。
at MagicOnion.GrpcChannelx..ctor (System.Int32 id, System.Action1[T] onDispose, Grpc.Core.ChannelBase channel, System.Uri targetUri, MagicOnion.Unity.GrpcChannelOptionsBag channelOptions) [0x0003e] in <a281ce6d64d540b793a9b791a7bf14c3>:0
at MagicOnion.Client.GrpcNetClientGrpcChannelProvider.CreateChannelCore (System.Int32 id, MagicOnion.Unity.CreateGrpcChannelContext context) [0x00079] in <a281ce6d64d540b793a9b791a7bf14c3>:0
at MagicOnion.Unity.GrpcChannelProviderBase.CreateChannel (MagicOnion.Unity.CreateGrpcChannelContext context) [0x00001] in <a281ce6d64d540b793a9b791a7bf14c3>:0
at MagicOnion.Unity.GrpcChannelProviderExtensions.CreateChannel (MagicOnion.Unity.IGrpcChannelProvider provider, MagicOnion.Unity.GrpcChannelTarget target) [0x00000] in <a281ce6d64d540b793a9b791a7bf14c3>:0
at MagicOnion.GrpcChannelx.ForAddress (System.Uri target) [0x00000] in <a281ce6d64d540b793a9b791a7bf14c3>:0
at MagicOnion.GrpcChannelx.ForAddress (System.String target) [0x00000] in <a281ce6d64d540b793a9b791a7bf14c3>:0
at Lepton.Shared.SceneTest.StartAsync () [0x00018] in <c857c171d48741a3a496e6e58b1e5e3a>:0
at System.Runtime.CompilerServices.AsyncTaskMethodBuilder.Start[TStateMachine] (TStateMachine& stateMachine) [0x00000] in <b11ba2a8fbf24f219f7cc98532a11304>:0
at Lepton.Shared.SceneTest.StartAsync () [0x00000] in <c857c171d48741a3a496e6e58b1e5e3a>:0
at Lepton.Shared.SceneTest.Start () [0x0000f] in <c857c171d48741a3a496e6e58b1e5e3a>:0
at System.Runtime.CompilerServices.AsyncVoidMethodBuilder.Start[TStateMachine] (TStateMachine& stateMachine) [0x00000] in <b11ba2a8fbf24f219f7cc98532a11304>:0
at Test.Shared.SceneTest.Start () [0x00000] in <c857c171d48741a3a496e6e58b1e5e3a>:0
手元では再現できていないのですが
- サーバーを起動していない状態で接続しようとしたらどうなるか
- ”Project Settings/Player" の "Scripting Define Symbols" で
YAHA_ENABLE_DEBUG_TRACINGシンボルを設定したらログが出るかどうか
をご確認いただけますでしょうか。
ご教授ありがとうございます
サーバーを起動していない状態で接続しようとしたらどうなるか
こちらエラーも吐かれず、接続できませんでした。(サーバー側でブレークポイントを置いても止まりませんでした。)
”Project Settings/Player" の "Scripting Define Symbols" で YAHA_ENABLE_DEBUG_TRACING シンボルを設定したらログが出るかどうか
こちら試してみましたが、出力されるログは何も変わりませんでした。
以上が報告となります。
GrpcChannelx の代わりに GrpcChannel を呼び出して使用した場合はどうなるでしょうか?
var channel = GrpcChannel.ForAddress("http://localhost:8080", new GrpcChannelOptions()
{
HttpHandler = new YetAnotherHttpHandler()
{
Http2Only = true,
},
DisposeHttpClient = true,
});
GrpcChannelに変更しても、変わらずなんのログも出ませんでした。
解決につながる情報か分かりませんが、ReadMeにありますexample.comへの通信はおこなえています。
またこの場合YAHA_ENABLE_DEBUG_TRACINGも機能しているように見えます。
using MagicOnion.Client;
using MagicOnion;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Linq;
using Grpc.Core;
using System;
using System.Threading.Tasks;
using Cysharp.Net.Http;
using Grpc.Net.Client;
using System.Net.Http;
namespace Test.Shared
{
public class SceneTest : MonoBehaviour
{
async public void Start()
{
await StartAsync();
}
private async Task StartAsync()
{
Debug.Log($"あああああああああああああああああ");
try
{
using var handler = new YetAnotherHttpHandler();
var httpClient = new HttpClient(handler);
var result = await httpClient.GetStringAsync("https://www.example.com");
Debug.Log($"Result: {result}");
//var channel = GrpcChannel.ForAddress("http://0.0.0.0:8080", new GrpcChannelOptions()
//{
// HttpHandler = new YetAnotherHttpHandler()
// {
// Http2Only = true,
// },
// DisposeHttpClient = true,
//});
//var client = MagicOnionClient.Create<IUserService>(channel);
//var result = await client.CreateUser();
//Debug.Log($"Result: {result.UserId}");
}
catch (RpcException ex)
{
Debug.LogError($"gRPC Error: {ex.Status.Detail}");
Debug.LogError($"gRPC Status: {ex.Status.StatusCode}");
}
catch (Exception ex)
{
Debug.LogError($"Unexpected Error: {ex.Message}");
Debug.LogError($"Stack Trace: {ex.StackTrace}");
}
}
}
}
新規プロジェクトで一度作りなおしてみたところ、正常に動作するようになりました。 自分のクライアント・サーバのプロジェクトがどこかのタイミングで不具合になっていたようでした。 ご迷惑おかけして申し訳ありません。
This issue is stale because it has been open 180 days with no activity. Remove stale label or comment or this will be closed in 30 days.