Page 1 of 1

改变LogicPlayer的Inspector界面中VariableOverides的UI逻辑

Posted: 2024/11/22 09:36
by kvfreedom
1.png
1.png (28.65 KiB) Viewed 3480 times
2.png
2.png (2.82 KiB) Viewed 3480 times
希望能将LogicPlayer的VariableOverides的UI逻辑改为显示所有的Root变量,默认是不勾选覆盖选项,只能查看变量值,当勾选覆盖选项,则可以填写覆盖的值。
这样可以实现快速查看未覆盖的Root变量的值,还可以更好的兼容Prefab Variant系统。
3.png
3.png (39.05 KiB) Viewed 3480 times
4.png
4.png (42.27 KiB) Viewed 3480 times
5.png
5.png (39.55 KiB) Viewed 3480 times
Prefab A中没有设置变量覆盖,Prefab B 是Prefab A的变体,Prefab B有一个AttackPower变量覆盖,如果将Prefab A中增加一个Speed变量覆盖,当前的UI逻辑不能实现Prefab B自动增加Speed变量覆盖。

Re: 改变LogicPlayer的Inspector界面中VariableOverides的UI逻辑

Posted: 2024/11/22 10:15
by caitsithware
Prefab Variant 的问题似乎是 Unity 的规范。
LogicPlayer 中的覆盖变量内部会维护一个要覆盖的 ID 和值的列表。
Prefab Variant 不会合并此列表中的元素,因此原始 Prefab 中的更改不会反映在 Prefab Variant 中。

用最少的代码进行验证如下。

Code: Select all

using System.Collections.Generic;
using UnityEngine;

public class ListScript : MonoBehaviour
{
    public List<int> list;
}
ListVariantCheck.png
ListVariantCheck.png (64.97 KiB) Viewed 3470 times
这是数据结构和 Prefab Variant 规范的问题,所以我不认为可以用 Inspector UI 来改进。
我们正在研究可能的解决方案,但目前没有改善的希望。

Re: 改变LogicPlayer的Inspector界面中VariableOverides的UI逻辑

Posted: 2024/11/22 11:17
by kvfreedom
caitsithware wrote: 2024/11/22 10:15 Prefab Variant 的问题似乎是 Unity 的规范。
LogicPlayer 中的覆盖变量内部会维护一个要覆盖的 ID 和值的列表。
Prefab Variant 不会合并此列表中的元素,因此原始 Prefab 中的更改不会反映在 Prefab Variant 中。

用最少的代码进行验证如下。

Code: Select all

using System.Collections.Generic;
using UnityEngine;

public class ListScript : MonoBehaviour
{
    public List<int> list;
}
ListVariantCheck.png

这是数据结构和 Prefab Variant 规范的问题,所以我不认为可以用 Inspector UI 来改进。
我们正在研究可能的解决方案,但目前没有改善的希望。
1.png
1.png (26.3 KiB) Viewed 3464 times
2.png
2.png (28.37 KiB) Viewed 3464 times
3.png
3.png (26.36 KiB) Viewed 3464 times
4.png
4.png (28.71 KiB) Viewed 3464 times
当Prefab变体不修改List Count数量时可以继承Parent Prefab的值,我思考了一种方案以供参考。
Root变量有一个StorageIndex值,第一个创建的Root变量A的StorageIndex值为0,然后创建Root变量B的StorageIndex值为1,接着创建Root变量C的StorageIndex值为2,再删除Root变量A,最后创建Root变量D的StorageIndex值为0。
VariableOverides List按Root变量最大的StorageIndex值设置Count,假设Prefab B是Prefab A的变体,Prefab B覆盖Root变量C,存储的位置就是List的Index 2,Prefab A再覆盖Root变量B,存储的位置就是List的Index 1,由于Prefab B没有修改List的Index 1位置的值,这样Prefab B也会自动覆盖Root变量B。
当Blackboard中删除或增加一个Root变量,LogicPlayer则判断GameObject是否为变体,若不为变体则按最大的StorageIndex值修正List Count。

Re: 改变LogicPlayer的Inspector界面中VariableOverides的UI逻辑

Posted: 2024/11/22 12:04
by caitsithware
谢谢。
我们会考虑您的反馈。