如何在生存类游戏中保存和加载环境?
How to save and load environment in a survival type game?
我正在开发一款生存类游戏,在这个游戏中,整个地图都是手动制作的,并分成多个 512x512 大小 chunks/terrains。根据玩家位置加载和卸载块。
我面临的问题是保存和加载块环境。游戏中玩家可以砍树也可以重新种树
考虑到不知道块中的位置和数量,我不能使用池系统,如果我在加载块时实例化所有树,我可能会调用数千个实例化调用,这会破坏性能。
我应该如何处理这个问题,有什么好的解决方案吗?谢谢
那好吧,我刚刚找到了解决办法。 可寻址。使用 Addressables.LoadAssetAsync and Addressables.InstantiateAsync.
我做了一个简单的测试,我创建了 5000 个复杂的网格并得到了零延迟。非常难以置信。
这是代码,如果有人感兴趣的话。
using System.Collections;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using SystemRan = System.Random;
public class Massinstantiation : MonoBehaviour
{
const string location = "Assets/TestObject.prefab";
private void Update()
{
if (Input.GetKeyDown(KeyCode.P))
{
StartCoroutine(Instantiate());
}
}
public IEnumerator Instantiate()
{
var loadAsset = Addressables.LoadAssetAsync<GameObject>(location);
yield return loadAsset;
if (loadAsset.Status == AsyncOperationStatus.Succeeded)
{
SystemRan rand = new SystemRan();
for (int i = 0; i < 5000; i++)
{
var obj = Addressables.InstantiateAsync(location, new Vector3(rand.Next(-250, 250), 0, rand.Next(-250, 250)), Quaternion.identity, null);
yield return obj.IsDone;
}
}
}
}
我正在开发一款生存类游戏,在这个游戏中,整个地图都是手动制作的,并分成多个 512x512 大小 chunks/terrains。根据玩家位置加载和卸载块。
我面临的问题是保存和加载块环境。游戏中玩家可以砍树也可以重新种树
考虑到不知道块中的位置和数量,我不能使用池系统,如果我在加载块时实例化所有树,我可能会调用数千个实例化调用,这会破坏性能。
我应该如何处理这个问题,有什么好的解决方案吗?谢谢
那好吧,我刚刚找到了解决办法。 可寻址。使用 Addressables.LoadAssetAsync and Addressables.InstantiateAsync.
我做了一个简单的测试,我创建了 5000 个复杂的网格并得到了零延迟。非常难以置信。
这是代码,如果有人感兴趣的话。
using System.Collections;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using SystemRan = System.Random;
public class Massinstantiation : MonoBehaviour
{
const string location = "Assets/TestObject.prefab";
private void Update()
{
if (Input.GetKeyDown(KeyCode.P))
{
StartCoroutine(Instantiate());
}
}
public IEnumerator Instantiate()
{
var loadAsset = Addressables.LoadAssetAsync<GameObject>(location);
yield return loadAsset;
if (loadAsset.Status == AsyncOperationStatus.Succeeded)
{
SystemRan rand = new SystemRan();
for (int i = 0; i < 5000; i++)
{
var obj = Addressables.InstantiateAsync(location, new Vector3(rand.Next(-250, 250), 0, rand.Next(-250, 250)), Quaternion.identity, null);
yield return obj.IsDone;
}
}
}
}