Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
ANIZA15 opened this issue Dec 17, 2024 · 14 comments

Comments

@ANIZA15
Copy link

ANIZA15 commented Dec 17, 2024

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

@mayuki
Copy link
Member

mayuki commented Dec 19, 2024

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

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

@ANIZA15
Copy link
Author

ANIZA15 commented Dec 19, 2024

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

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

@mayuki
Copy link
Member

mayuki commented Dec 20, 2024

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

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

@ANIZA15
Copy link
Author

ANIZA15 commented Dec 20, 2024

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

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

@ANIZA15
Copy link
Author

ANIZA15 commented Dec 20, 2024

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

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

@neuecc
Copy link
Member

neuecc commented Dec 21, 2024

"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

@ANIZA15
Copy link
Author

ANIZA15 commented Dec 21, 2024

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

@ANIZA15
Copy link
Author

ANIZA15 commented Dec 23, 2024

現在の問題につながるか分かりませんが、以下のコードで、「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
Copy link
Author

ANIZA15 commented Dec 23, 2024

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 

@mayuki
Copy link
Member

mayuki commented Dec 24, 2024

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

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

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

@ANIZA15
Copy link
Author

ANIZA15 commented Dec 24, 2024

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

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

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

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

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

以上が報告となります。

@mayuki
Copy link
Member

mayuki commented Dec 24, 2024

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

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

@ANIZA15
Copy link
Author

ANIZA15 commented Dec 24, 2024

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
Copy link
Author

ANIZA15 commented Dec 26, 2024

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants