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

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: 如何实现LogicAsset复用时黑板中变量的值不同

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

by caitsithware » 2024/07/11 22:08

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);
    }
}
(这不是确切的代码,因为它是一个概念解释)

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

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

by kvfreedom » 2024/07/11 16:51

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

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

by kvfreedom » 2024/07/11 16:18

caitsithware wrote: 2024/07/11 14:40 首先,最初的需求是“当我开始使用 Logic Player 时,我想覆盖 Logic Asset 变量的初始值。”
这是一个很高的需求,因此我们计划在未来的更新中添加覆盖功能。
当然,“变量覆盖资产”也包括在内。
我已经将其添加到我的路线图中: Roadmap

对于标准功能无法满足的复杂需求,我们建议实施 C# 脚本。
请参阅手册中的Scripting以及脚本参考中的LogicPlayer LogicController Blackboard等。
如果添加了覆盖功能,LogicPlayer是否能像LogicBehavior一样可以在运行后被外部C#脚本临时修改变量,而不是把资产中的变量永久改掉。

如果有一个需求不是想修改LogicBehavior黑板变量的初始值,而是在LogicBehavior运行后的某个时刻,由外部的C#脚本来修改变量值,目前是不是只能通过Blackboat.GetVariableAt方法来修改,index和变量名一样不容易维护,期待有更好的方法。

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

by caitsithware » 2024/07/11 15:18

总而言之,请求似乎是“我想将 LogicAsset 作为子图执行” 或 “我想在 TaskGraphAsset 中使用事件节点等”。
该领域的细节尚未确定,但我们希望在未来的更新中对此进行改进。

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

by kvfreedom » 2024/07/11 14:58

caitsithware wrote: 2024/07/11 14:40 首先,最初的需求是“当我开始使用 Logic Player 时,我想覆盖 Logic Asset 变量的初始值。”
这是一个很高的需求,因此我们计划在未来的更新中添加覆盖功能。
当然,“变量覆盖资产”也包括在内。
我已经将其添加到我的路线图中: Roadmap

对于标准功能无法满足的复杂需求,我们建议实施 C# 脚本。
请参阅手册中的Scripting以及脚本参考中的LogicPlayer LogicController Blackboard等。
是的,我也认为覆盖LogicAsset变量和变量覆盖资产是不容易实现的,而增加一个LogicGraphAsset能被覆盖变量或传入参数可能是更好用且更容易实现的方式。

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

by kvfreedom » 2024/07/11 14:47

kvfreedom wrote: 2024/07/11 13:34 有一种复杂的需求,例如有2个角色A B,角色都有2个阶段,生命高于50%时为阶段一,否则为阶段二。有3种行为A B C,行为A有变量A B,行为B有变量C,行为C有变量C D。角色A的阶段一使用行为A并设置变量A,阶段二使用行为B并设置变量C,角色B的阶段一使用行为A并设置变量A B,阶段二使用行为C并设置变量C D,这种需求就不能用4个预制件的方式去实现了。
增加一种LogicGraphAsset,它可以像TaskGraphAsset一样被LogicAsset嵌套引用。LogicGraphAsset的黑板变量可以设置是否公开,当LogicGraphAsset被LogicAsset引用时,公开的变量可以被外部选择是否覆盖,或者像TaskGraphAsset一样可以设置传入参数,使用传入参数去修改变量。
LogicAsset能引用LogicGraphAsset并能覆盖变量或传入参数,LogicPlayer能随时替换LogicAsset,再搭配PrefabVariant功能,几乎可以很方便的实现所有需求,这样就不需要增加在LogicPlayer和LogicBehavior的Inspector中填写覆盖变量的功能了。

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

by caitsithware » 2024/07/11 14:40

首先,最初的需求是“当我开始使用 Logic Player 时,我想覆盖 Logic Asset 变量的初始值。”
这是一个很高的需求,因此我们计划在未来的更新中添加覆盖功能。
当然,“变量覆盖资产”也包括在内。
我已经将其添加到我的路线图中: Roadmap

对于标准功能无法满足的复杂需求,我们建议实施 C# 脚本。
请参阅手册中的Scripting以及脚本参考中的LogicPlayer LogicController Blackboard等。

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

by kvfreedom » 2024/07/11 13:34

caitsithware wrote: 2024/07/11 11:32 我明白了,您想通过使用“变量覆盖资产”来抑制预制件的增加。
“用相同的名称覆盖”很容易受到名称更改的影响,因此我们会考虑是否有更好的方法。
你说的很好,“使用相同名称覆盖”确实会大大增加维护成本,应该用引用等更好的方法代替。

有一种复杂的需求,例如有2个角色A B,角色都有2个阶段,生命高于50%时为阶段一,否则为阶段二。有3种行为A B C,行为A有变量A B,行为B有变量C,行为C有变量C D。角色A的阶段一使用行为A并设置变量A,阶段二使用行为B并设置变量C,角色B的阶段一使用行为A并设置变量A B,阶段二使用行为C并设置变量C D,这种需求就不能用4个预制件的方式去实现了。

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

by caitsithware » 2024/07/11 11:32

我明白了,您想通过使用“变量覆盖资产”来抑制预制件的增加。
“用相同的名称覆盖”很容易受到名称更改的影响,因此我们会考虑是否有更好的方法。

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

by kvfreedom » 2024/07/11 11:01

caitsithware wrote: 2024/07/11 10:09 目前,Logic Player 中还没有设置变量值的功能。
我们计划在未来的更新中在 Inspector 窗口中实现此设置。
一个常见的需求,例如一个角色,有5个等级,1-3级复用LogicAsset A,4-5级复用LogicAsset B,LogicAsset A中有变量A B C,LogicAsset B中有变量C D,1级设置变量A,2级设置变量A B,3级设置变量A B C,4级设置变量C,5级设置变量C D

如果只能在LogicPlayer上填写需要设置的变量,则需要5个Prefab来实现
是否可以通过组合的形式,例如LogicPlayer上可以添加BlackboardAsset,BlackboardAsset的变量会覆盖LogicAsset中的同名的变量

Top