分爲兩種方法,一種用碰撞器解決,一種用距離判斷。地下城與迷宮等使用碰撞比較好,而外面的開放世界可以使用距離判斷
using UnityEngine;
using UnityEngine.SceneManagement;
public class LoadPartOfScene : MonoBehaviour
{
public enum CheckLoadPartOfMethod
{
UseDistance,
UseTrigger
}
public Transform player;
public CheckLoadPartOfMethod method;
public float distanceOfRange;
public bool isLoaded;
private bool shouldLoad;
void Start()
{
if (SceneManager.sceneCount > 0)
{
for (int i = 0; i < SceneManager.sceneCount; i++)
{
Scene scene = SceneManager.GetSceneAt(i);
if(scene.name == gameObject.name)
{
isLoaded = true;
}
}
}
}
// Update is called once per frame
void Update()
{
if(method == CheckLoadPartOfMethod.UseDistance)
{
CheckDistanceOfPart();
}
else if(method == CheckLoadPartOfMethod.UseTrigger){
CheckTriggerOfPart();
}
}
void CheckDistanceOfPart()
{
if (Vector3.Distance(player.position, transform.position) < distanceOfRange)
{
LoadParts();
}
else
{
UnLoadParts();
}
}
void CheckTriggerOfPart()
{
if (shouldLoad)
{
LoadParts();
}
else
{
UnLoadParts();
}
}
private void LoadParts()
{
if (!isLoaded)
{
SceneManager.LoadSceneAsync(gameObject.name, LoadSceneMode.Additive);
}
isLoaded = true;
}
private void UnLoadParts()
{
if (isLoaded)
{
SceneManager.UnloadSceneAsync(gameObject.name);
}
isLoaded = false;
}
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
shouldLoad = true;
}
}
private void OnTriggerExit(Collider other)
{
if (other.CompareTag("Player"))
{
shouldLoad = false;
}
}
}
源碼在https://github.com/amel-unity