by kvfreedom » 2024/11/22 11:17
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 来改进。
我们正在研究可能的解决方案,但目前没有改善的希望。
- 3.png (26.36 KiB) Viewed 3463 times
- 2.png (28.37 KiB) Viewed 3463 times
- 1.png (26.3 KiB) Viewed 3463 times
- 4.png (28.71 KiB) Viewed 3463 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。
[quote=caitsithware post_id=152 time=1732270501 user_id=2]
Prefab Variant 的问题似乎是 Unity 的规范。
LogicPlayer 中的覆盖变量内部会维护一个要覆盖的 ID 和值的列表。
Prefab Variant 不会合并此列表中的元素,因此原始 Prefab 中的更改不会反映在 Prefab Variant 中。
用最少的代码进行验证如下。
[code]
using System.Collections.Generic;
using UnityEngine;
public class ListScript : MonoBehaviour
{
public List<int> list;
}
[/code]
ListVariantCheck.png
这是数据结构和 Prefab Variant 规范的问题,所以我不认为可以用 Inspector UI 来改进。
我们正在研究可能的解决方案,但目前没有改善的希望。
[/quote]
[attachment=3]1.png[/attachment]
[attachment=2]2.png[/attachment]
[attachment=1]3.png[/attachment]
[attachment=0]4.png[/attachment]
当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。