Page 2 of 2

Re: 如何实现LogicAsset复用时黑板中变量的值不同

Posted: 2024/07/11 16:51
by kvfreedom
caitsithware wrote: 2024/07/11 15:18 总而言之,请求似乎是“我想将 LogicAsset 作为子图执行” 或 “我想在 TaskGraphAsset 中使用事件节点等”。
该领域的细节尚未确定,但我们希望在未来的更新中对此进行改进。
我不明白为什么要分TaskGraph和EvaluateGraph,TaskGraph不是包含了EvaluateGraph所有功能吗,如果一个TaskGraph中只有Action节点是不是和EvaluateGraph没有区别?
如果LogicGraph可以作为子图执行,LogicGraph包含了TaskGraph的所有功能又能使用事件节点,是不是TaskGraph和EvaluateGraph就不需要了?

Re: 如何实现LogicAsset复用时黑板中变量的值不同

Posted: 2024/07/11 22:08
by caitsithware
kvfreedom wrote: 2024/07/11 16:18 如果添加了覆盖功能,LogicPlayer是否能像LogicBehavior一样可以在运行后被外部C#脚本临时修改变量,而不是把资产中的变量永久改掉。

如果有一个需求不是想修改LogicBehavior黑板变量的初始值,而是在LogicBehavior运行后的某个时刻,由外部的C#脚本来修改变量值,目前是不是只能通过Blackboat.GetVariableAt方法来修改,index和变量名一样不容易维护,期待有更好的方法。
目前,此添加应该满足覆盖功能的要求。
我们将在实施过程中继续提高可用性。
请注意,这可能需要一段时间。
kvfreedom wrote: 2024/07/11 16:51 我不明白为什么要分TaskGraph和EvaluateGraph,TaskGraph不是包含了EvaluateGraph所有功能吗,如果一个TaskGraph中只有Action节点是不是和EvaluateGraph没有区别?
如果LogicGraph可以作为子图执行,LogicGraph包含了TaskGraph的所有功能又能使用事件节点,是不是TaskGraph和EvaluateGraph就不需要了?
EvaluateGraph 明确只使用了 Actions。
这样一来,在判断SignalEvaluation或Decorator时,保证不使用Task,即时做出判断。
TaskGraph 和 EvaluateGraph 之间的区别类似于 C# 中常规方法和 async/await 方法之间的区别。

Code: Select all

bool Equals(int a, int b)
{
    return a == b;
}
很少有人特意将其写成如下。

Code: Select all

async Task<bool> Equals(int a, int b)
{
    return await Task.FromResult(a == b);
}
LogicGraph(LogicController)在概念上与MonoBehavior类似。
例如,这是使用 Start 方法、Update 方法等实现组件行为的地方。
也称为“事件驱动”。
也就是说,事件驱动和函数从宏观和微观角度来看是不同的,因此是分开创建的,以避免混淆。

如果 TaskGraph 也可以使用事件节点,我认为能够在 TaskGraph 中构建如下所示的代码将是一个优势。

Code: Select all

async Task Wait(Button button, int timeout)
{
    var tcs = new TaskCompletionSource<bool>();

    try
    {
        button.onClick.AddListener(OnClick);

        await Task.WhenAny(tcs.Task, Task.Delay(timeout));

        return;
    }
    finally
    {
        button.onClick.RemoveListener(OnClick);
    }

    void OnClick()
    {
        tcs.SetResult(true);
    }
}
(这不是确切的代码,因为它是一个概念解释)

我们目前尚未决定如何实施,但我们将探索更易于使用的规范,因此请等到那时。