MagicOnion icon indicating copy to clipboard operation
MagicOnion copied to clipboard

6.1.6をUnityのImport Packageからインストールするとエラーで実行できない

Open ANIZA15 opened this issue 1 year ago • 15 comments

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だから起きるエラーなのでしょうか?

ANIZA15 avatar Dec 17 '24 13:12 ANIZA15

6000.0.23f1 で確認してみましたが単純なプロジェクトですとコンパイルエラーになることはありませんでした。

ただし、 Asssembly Definitinon (.asmdef) で切っている場合には、その Assembly Definition の Assembly Definition Reference に MagicOnion.Client がない場合に同様のエラーが発生したのでそれが原因でしょうか?

mayuki avatar Dec 19 '24 09:12 mayuki

お忙しい中ご確認してくださりありがとうございます。 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>

何か足らない情報などありましたらご教授願いたいです。

ANIZA15 avatar Dec 19 '24 14:12 ANIZA15

追加情報ありがとうございます。ちなみに Test.Shared ではなく MagicOnionGeneratedClientInitializer クラスの場所が .asmdef 配下になってませんでしょうか?

その場合ですと MagicOnionGeneratedClientInitializer が含まれる .asmdef に MagicOnion.Client への参照を追加する必要があります。

mayuki avatar Dec 20 '24 03:12 mayuki

MagicOnionGeneratedClientInitializer はAssets/Scriptsに配置しています。

またAssembly DefinitionはAssetsの階層で作ったのち、Test.Sharedのプロジェクト直下へ移動させました。

ANIZA15 avatar Dec 20 '24 10:12 ANIZA15

パッケージマネージャーから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'

が出るようになりました。

ANIZA15 avatar Dec 20 '24 12:12 ANIZA15

"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

neuecc avatar Dec 21 '24 09:12 neuecc

情報の提供ありがとうございます。 "Path could not be found for script compilation file"はUnity側での既知の不具合の件承知しました。 現状色々設定を見直して何とかできそうなのでもう少し設定しなおします。 お忙しい中お手数をおかけしました。 特に問題が無ければcloseさせていただきたいと思います。

ANIZA15 avatar Dec 21 '24 11:12 ANIZA15

現在の問題につながるか分かりませんが、以下のコードで、「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();で処理が正常に通らなくなる条件などありましたらご教授願いたいです。

ANIZA15 avatar Dec 23 '24 12:12 ANIZA15

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 

ANIZA15 avatar Dec 23 '24 22:12 ANIZA15

手元では再現できていないのですが

  • サーバーを起動していない状態で接続しようとしたらどうなるか
  • ”Project Settings/Player" の "Scripting Define Symbols" で YAHA_ENABLE_DEBUG_TRACING シンボルを設定したらログが出るかどうか

をご確認いただけますでしょうか。

mayuki avatar Dec 24 '24 03:12 mayuki

ご教授ありがとうございます

サーバーを起動していない状態で接続しようとしたらどうなるか

こちらエラーも吐かれず、接続できませんでした。(サーバー側でブレークポイントを置いても止まりませんでした。)

”Project Settings/Player" の "Scripting Define Symbols" で YAHA_ENABLE_DEBUG_TRACING シンボルを設定したらログが出るかどうか

こちら試してみましたが、出力されるログは何も変わりませんでした。

以上が報告となります。

ANIZA15 avatar Dec 24 '24 06:12 ANIZA15

GrpcChannelx の代わりに GrpcChannel を呼び出して使用した場合はどうなるでしょうか?

var channel = GrpcChannel.ForAddress("http://localhost:8080", new GrpcChannelOptions()
{
    HttpHandler = new YetAnotherHttpHandler()
    {
        Http2Only = true,
    },
    DisposeHttpClient = true,
});

mayuki avatar Dec 24 '24 07:12 mayuki

GrpcChannelに変更しても、変わらずなんのログも出ませんでした。

解決につながる情報か分かりませんが、ReadMeにありますexample.comへの通信はおこなえています。 またこの場合YAHA_ENABLE_DEBUG_TRACINGも機能しているように見えます。 image

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}");
            }
        }
    }
}

ANIZA15 avatar Dec 24 '24 07:12 ANIZA15

新規プロジェクトで一度作りなおしてみたところ、正常に動作するようになりました。 自分のクライアント・サーバのプロジェクトがどこかのタイミングで不具合になっていたようでした。 ご迷惑おかけして申し訳ありません。

ANIZA15 avatar Dec 26 '24 10:12 ANIZA15

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.

github-actions[bot] avatar Jun 25 '25 00:06 github-actions[bot]