我创建了一个脚本,在Start()
上的场景中的随机位置产生(实例化)随机游戏对象。但我有两个问题:
如果我改变了场景并且我回来了,实例化的对象就不再存在了,即它们不是永久性的。如何使它们像我通过Unity编辑器放置在场景中的对象一样永久化?我不是在谈论dontdestroyonload
,它将对象保持在所有场景中,并且永远不会破坏它们。
我想要在第一次加载场景时只运行一次的spawn脚本,每次进入场景时都会运行,即使我在脚本中添加了一行来破坏两者脚本和父游戏对象。我想让它运行一次并永远消失。如何做到这一点?
答案 0 :(得分:0)
使用PlayerPrefs保存位置,然后阅读:
//Write
PlayerPrefs.SetFloat("PlayerX", player.transform.position.x);
PlayerPrefs.SetFloat("PlayerY", player.transform.position.y);
PlayerPrefs.SetFloat("PlayerZ", player.transform.position.z)
//Read
var x = PlayerPrefs.GetFloat("PlayerX");
var y = PlayerPrefs.GetFloat("PlayerY");
var z = PlayerPrefs.GetFloat("PlayerZ");
//Apply
Vector3 posVec = new Vector3(x,y,z);
player.transform.position = posVec;
答案 1 :(得分:0)
为什么要在离开场景时保留对象?那么您是否更容易获得Unity Editor Extension来生成随机对象?然后,您可以随时生成对象并将其保存到场景中。
如果使用编辑器扩展,则无需担心Start()。
修改强> 根据您的评论,您需要的是一个保存/加载系统,您可以在离开场景时存储生成的对象的ID和位置,然后在返回场景时将其加载回来。将运行时场景保存为场景文件是不可能的,因为它被编译成游戏数据。
最简单的方法是从资产商店获取一个系统,并根据您自己的经验,这可能是您的最佳选择。
否则,你必须亲自制作。在这个问题中回答了如何做到这一点: What is the best way to save game state?
总结那里所说的内容:您必须创建一个允许您将数据保存到文件的类。这可以通过在Unity中使用BinaryFormatter来完成。虽然还有更多选项,比如XML。
答案 2 :(得分:0)
您可以在班级中添加ExecuteInEditMode
属性。如果你不希望它的逻辑在被加载的场景上执行 - 用if(!Application.isPlaying)
包围这个逻辑。
话虽如此 - 我宁愿制作一个编辑工具,一个督察按钮,一个上下文菜单 - 我认为这样的事情会更好。
答案 3 :(得分:0)
我将在您的资产中创建一个JSON文件,其中包含一个JsonArray,每个对象及其场景,文件路径及其位置/旋转。每次切换到新文件时,该文件都会循环遍历所有文件,并且如果来自其的场景不是所存储的场景,则不会存储该文件。如果是,那么它将解析json对象内部,并使用位置和旋转设置放置一个新对象。
如果没有意义,这里有一些伪代码:
要加载:
jsonArray = parseJsonArray
foreach Json object inside of jsonArray
if object["scene"] = currentscene
intantiate new object and set properties to properties that are parsed by the json file
要保存:
Convert Array of all of the gameObjects to jsonArray
Write Json Array => json file
答案 4 :(得分:0)
这似乎是解决方案:
public static void UnpackPrefabInstance(GameObject instanceRoot, PrefabUnpackMode unpackMode, InteractionMode action);
来自:https://docs.unity3d.com/ScriptReference/PrefabUtility.UnpackPrefabInstance.html