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

kvfreedom
Posts: 69
Joined: 2024/07/11 04:36

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

Post by kvfreedom »

屏幕截图 2024-07-11 165413.png
屏幕截图 2024-07-11 165413.png (32.11 KiB) Viewed 24738 times
同一个LogicAsset被多个LogicPlayer使用,如何能让每一个LogicPlayer单独设定A的值
User avatar
caitsithware
管理人
Posts: 90
Joined: 2024/03/26 01:56

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

Post by caitsithware »

目前,Logic Player 中还没有设置变量值的功能。
我们计划在未来的更新中在 Inspector 窗口中实现此设置。

从 UI/UX 角度来看,实施需要一些时间。
在此期间,请添加一个用于传递的 MonoBehavior 并通过字段获取脚本生成来设置它。

Code: Select all

using UnityEngine;

public class SettingVariable : MonoBehaviour
{
    public string a;
}
传输脚本必须包含在Assembly Definition File(asmdef)中。
关于Assembly Definition File,请参考Unity手册中的 : https://docs.unity3d.com/Manual/ScriptC ... Files.html

Logic Asset 如下。
LogicToolkit_LogicPlayer_SettingVariable_LogicAsset.png
LogicToolkit_LogicPlayer_SettingVariable_LogicAsset.png (25.11 KiB) Viewed 24732 times

在 Logic Player 的 Inspector 中,设置如下。
LogicToolkit_LogicPlayer_SettingVariable_LogicPlayer_Inspector.png
LogicToolkit_LogicPlayer_SettingVariable_LogicPlayer_Inspector.png (37.51 KiB) Viewed 24732 times

但设置方法比较复杂,我们会考虑尽快实现。
kvfreedom
Posts: 69
Joined: 2024/07/11 04:36

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

Post by kvfreedom »

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中的同名的变量
User avatar
caitsithware
管理人
Posts: 90
Joined: 2024/03/26 01:56

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

Post by caitsithware »

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

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

Post by kvfreedom »

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个预制件的方式去实现了。
User avatar
caitsithware
管理人
Posts: 90
Joined: 2024/03/26 01:56

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

Post by caitsithware »

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

对于标准功能无法满足的复杂需求,我们建议实施 C# 脚本。
请参阅手册中的Scripting以及脚本参考中的LogicPlayer LogicController Blackboard等。
kvfreedom
Posts: 69
Joined: 2024/07/11 04:36

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

Post by kvfreedom »

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中填写覆盖变量的功能了。
kvfreedom
Posts: 69
Joined: 2024/07/11 04:36

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

Post by kvfreedom »

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

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

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

Post by caitsithware »

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

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

Post by kvfreedom »

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和变量名一样不容易维护,期待有更好的方法。
Post Reply