スクリプト生成に失敗する

Forum rules
Please confirm before reporting
  • Please confirm in advance that it is a problem with LogicToolkit and not with Unity itself, other assets, or the user's project.
  • Please confirm that the problem occurs in a project with the smallest possible configuration and clarify how to reproduce it.
  • Please check if it is described in Known Issues.

Information required to report a bug
  • Logic Toolkit version
  • Unity version
  • How to reproduce

=======

報告する前の確認のお願い
  • Unity本体や他のアセット、ユーザーのプロジェクト側による問題ではなくLogicToolkitの問題であることを事前に確認してください。
  • 可能な限り最小構成のプロジェクトで問題の発生を確認し、再現方法を明確にしてください。
  • 既知の問題に記述されているかを確認してください。

バグを報告するために必要な情報
  • Logic Toolkit バージョン
  • Unity バージョン
  • 再現方法

=======

We accept posts in languages ​​other than English and Japanese, but replies will be sent via machine translation.
Thank you for your understanding.

Post a reply

Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :arrow: :| :mrgreen: :geek: :ugeek:

BBCode is ON
[img] is ON
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: スクリプト生成に失敗する

Re: スクリプト生成に失敗する

by Yumineko » 2025/01/07 10:36

ありがとうございます。動作しました!

Re: スクリプト生成に失敗する

by caitsithware » 2025/01/07 00:16

暫定対処方法は以下の通りです。
  • Packages/com.caitsithware.logictoolkit/Editor/Generator/EditorGeneratorUtility.csを開く
  • 689行目から705行目までを以下のコードに変更

    Code: Select all

    foreach (var script in scripts)
    {
        string currentAssemblyName = script.Member.DeclaringType.AssemblyName;
        AddAssemblyReferences(currentAssemblyName);
    
        try
        {
            var assembly = System.Reflection.Assembly.Load(currentAssemblyName);
            foreach (var referenceAssembly in assembly.GetReferencedAssemblies())
            {
                AddAssemblyReferences(referenceAssembly.Name);
            }
        }
        catch
        {
            continue;
        }
    }
    
    void AddAssemblyReferences(string assemblyName)
    {
        var asmdefGUID = GetAssemblyDefinitionReferenceGUID(assemblyName);
        if (asmdefGUID != null)
        {
            references.Add(asmdefGUID);
        }
        else
        {
            var assemblyPath = CompilationPipeline.GetPrecompiledAssemblyPathFromAssemblyName(assemblyName);
            if (assemblyPath != null)
            {
                precompiledReferences.Add(assemblyName + ".dll");
            }
        }
    }
    

Re: スクリプト生成に失敗する

by caitsithware » 2025/01/06 23:50

ご報告ありがとうございます。

対象メンバーから参照しているアセンブリの追加が必要なことを失念しておりました。
修正いたします。

Re: スクリプト生成に失敗する

by Yumineko » 2025/01/06 15:17

また、以下のようにUniTaskだけを追加した最小限のメソッドの場合でもコンパイルエラーが発生します。

Code: Select all

using System;
using Cysharp.Threading.Tasks;
using UnityEngine;

namespace Game.AssetManagement
{
    [Serializable]
    public sealed class AddressableAssetLoader
    {
        public async UniTask<GameObject> InstantiateAsync()
        {
            await UniTask.DelayFrame(1);
            return null;
        }

        public void ReleaseAsset()
        {
        }
    }
}

Code: Select all

LogicToolkit_ScriptGenerator\LogicToolkit.ScriptGenerator.Generator\Generated_Invoke_GameːAssetManagementːAddressableAssetLoaderːInstantiateAsync_LjjneyLDFKRJ6R_v7ZKkOCasaqQDrmqKy2z1gjn7r10.g.cs(22,40): error CS0400: The type or namespace name 'Cysharp' could not be found in the global namespace (are you missing an assembly reference?)
なお、当該Scriptと同じディレクトリに別途asmdefファイルが定義されており、そこでUniTaskやAddressablesを参照しています。

スクリプト生成に失敗する

by Yumineko » 2025/01/06 15:03

  • Logic Toolkit バージョン:1.6.4
  • Unityバージョン:6000.0.32f1
お世話になっております。
以下のスクリプトの各種メソッドの生成に失敗します。

Code: Select all

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using Object = UnityEngine.Object;

namespace Game.AssetManagement
{
    [Serializable]
    public sealed class AddressableAssetLoader
    {
        private  List<AsyncOperationHandle> _handles = new();

        public async UniTask<T> LoadAssetAsync<T>(AssetReference assetReference, CancellationToken cancellationToken = default) where T : Object
        {
            var loadedHandle = _handles.FirstOrDefault(handle => handle.IsValid() && handle is { IsDone: true, Result: not null });
            if (loadedHandle.IsValid())
            {
                // ロード済みの場合、そのまま返す
                return loadedHandle.Result as T;
            }

            // ロードされていない場合、新たにロードする
            var newHandle = assetReference.LoadAssetAsync<T>();
            _handles.Add(newHandle);
            return await newHandle.Task;
        }

        public async UniTask<GameObject> InstantiateAsync(AssetReferenceGameObject assetReferenceGameObject, Transform parent = null,
            CancellationToken cancellationToken = default)
        {
            var loadedHandle = _handles.FirstOrDefault(handle => handle.IsValid() && handle is { IsDone: true, Result: not null });
            if (loadedHandle.IsValid())
            {
                // ロード済みの場合、そのまま返す
                var gameObjects = await Object.InstantiateAsync(loadedHandle.Result as GameObject, parent).ToUniTask(cancellationToken: cancellationToken);
                return gameObjects.FirstOrDefault();
            }

            // ロードされていない場合、新たにロードする
            var newHandle = assetReferenceGameObject.InstantiateAsync(parent);
            _handles.Add(newHandle);
            return await newHandle.Task;
        }

        public void ReleaseAsset(AssetReference assetReference)
        {
            var handle = _handles.FirstOrDefault(handle => handle.IsValid() && handle is { Result: not null });
            if (!handle.IsValid())
            {
                Debug.Log("有効なハンドルが見つからないため、解放せずに終了します。");
                return;
            }

            Addressables.Release(handle);
            _handles.Remove(handle);
            Debug.Log("アセットを解放しました。");
        }
    }
}
厳密に言うと、Logic Script Generatorウィンドウでは正常に追加されているにも関わらず、

Code: Select all

Assets\Logic Toolkit\Generated Scripts\LogicToolkitGeneratedScripts\LogicToolkitGeneratedScripts.LogicToolkit_ScriptGenerator.additionalfile(2,1): error LT_CS1061: 'AddressableAssetLoader' does not contain a definition for 'InstantiateAsync'
のコンパイルエラーが発生し、アクションを追加できません。


LogicToolkitGeneratedScripts.asmdefの中を見てみると、UniTaskやAddressables,
ResourceManagementなどの必要なasmdefが参照できていないようで、手動で追加してもコンパイル時に自動で削除されてしまいます。

新規プロジェクトでも再現しましたので、バグの類かと思い記載しました。
Attachments
スクリーンショット 2025-01-07 000034.png
スクリーンショット 2025-01-07 000034.png (120.13 KiB) Viewed 3257 times

Top