使实例化对象永久化并制作游戏对象......在Unity

时间:2018-03-28 00:50:58

标签: unity3d instance gameobject

我创建了一个脚本,在Start()上的场景中的随机位置产生(实例化)随机游戏对象。但我有两个问题:

  1. 如果我改变了场景并且我回来了,实例化的对象就不再存在了,即它们不是永久性的。如何使它们像我通过Unity编辑器放置在场景中的对象一样永久化?我不是在谈论dontdestroyonload,它将对象保持在所有场景中,并且永远不会破坏它们。

  2. 我想要在第一次加载场景时只运行一次的spawn脚本,每次进入场景时都会运行,即使我在脚本中添加了一行来破坏两者脚本和父游戏对象。我想让它运行一次并永远消失。如何做到这一点?

5 个答案:

答案 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