【发布时间】:2016-12-11 15:43:24
【问题描述】:
假设我有一个简单的MonoBehaviour
public class FooScript : MonoBehaviour {
public int someValue = 0;
}
我制作游戏对象,附上FooScript。我从中制作了一个预制件并在场景中删除实例。
在编辑器中,我可以选择项目中的预制件,我可以编辑someValue。
假设我知道预制件的路径,我如何制作一个编辑时间脚本来编辑预制件内的FooScript 实例?
尝试了什么
GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(pathToPrefab);
GameObject root = ???? // WHAT DO I CALL HERE!?
FooScript fooScript = root.GetComponent<FooScript>();
fooScript.someValue = 789;
其实在那种情况下prefab 是空的
如果切换到
Object prefab = AssetDatabase.LoadMainAssetAtPath(prefabPath);
GameObject root = prefab as GameObject;
prefab 不为空,但root 为
接下来我尝试了这个
Object[] objs = AssetDatabase.LoadAllAssetsAtPath(prefabPath);
foreach (var o in obs)
{
Debug.Log(" type:" + (o.GetType().Name));
}
打印出来的
type: GameObject
type: Transform
type: FooScript
但是使用它是一个 hacky 解决方案,因为我必须尝试每个 GameObject 和/或 FooScript。我的意思是我认为作为一个务实的解决方案它可能会起作用,但感觉就像增加了我必须稍后解决的技术债务
我尝试过的其他事情是使用新的 GameObject 和新的 FooScript 创建一个新的预制件并调用 PrefabUtility.ReplacePrefab
GameObject newGameObject = new GameObject();
FooScript fooScript = newGameObject.AddComponent<FooScript>();
fooScript.someValue = 789;
Object prefab = AssetDatabase.LoadAssetAtPath<GameObject>(prefabPath);
PrefabUtility.ReplacePrefab(newGameObject, prefab, ReplacePrefabOptions.ConnectToPrefab);
GameObject.Destory(newGameObject); // don't want this in the scene
但这对我不起作用。预制件中的值被替换,但场景中的所有实例都断开连接。
重申。我不是要编辑预制件的实例。我正在尝试在编辑时从脚本编辑预制件本身。
【问题讨论】:
-
是的,对不起。
Asset.是一个错字。更新了问题 -
here 他们建议使用Resources.LoadAssetAtPath 但文档说它被贬低了
-
@gman 你能说一下
prefab.GetType ().Name;说什么吗? -
打印
Object