1、目标
Player可以在Scene1_Farm和Scene2_Field之间自动切换。通过Trigger实现该功能。同时创建一个预设体绑定该功能,这样可以把预设体放到任何场景中,通过配置即可实现Player在Scene之间的自由切换。
2、创建场景切换的工具对象
在Hierarchy中,加载Scene1_Farm,创建新物体命名为SceneTeleport。
在Assets -> Scripts -> Scene下创建新的脚本命名为SceneTeleport,同时给SceneTeleport物体绑定SceneTeleport脚本。
给SceneTeleport物体添加Box Collider 2D组件,并且勾选"Is Trigger"。
3、编写脚本
SceneTeleport脚本代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(BoxCollider2D))]
public class SceneTeleport : MonoBehaviour
{
[SerializeField] private SceneName sceneNameGoto = SceneName.Scene1_Farm; // 要去的场景的名称
[SerializeField] private Vector3 scenePositionGoto = new Vector3(); // 新场景的player的位置信息
private void OnTriggerEnter2D(Collider2D collision)
{
Player player = collision.GetComponent<Player>();
if (player != null)
{
// Calculate player's new position
float xPosition = Mathf.Approximately(scenePositionGoto.x, 0f) ? player.transform.position.x : scenePositionGoto.x;
float yPosition = Mathf.Approximately(scenePositionGoto.y, 0f) ? player.transform.position.y : scenePositionGoto.y;
float zPosition = 0f;
// Teleport to new scene
SceneControllerManager.Instance.FadeAndLoadScene(sceneNameGoto.ToString(), new Vector3(xPosition, yPosition, zPosition));
}
}
}
4、创建预设体并配置参数
将SceneTeleport 放到Assets -> Prefabs -> Scene下
(1)处理Scene1_Farm
选择SceneTeleport对象,其Box Collider 2D -> Size设为x=0.3,y=12
选择Tilemap Grid下的Collisions对象,勾选Tilemap Renderer。
然后拖动SceneTeleport到右边缘,和Collisions对象没有重合。
选择Tilemap Grid下的Collisions对象,再反勾选Tilemap Renderer。
(2)处理Scene2_Field
在Hierarchy中卸载Scene1_Farm,加载Scene2_Field。
给Scene2_Field添加预设体SceneTeleport。
选择Tilemap Grid下的Collisions对象,勾选Tilemap Renderer。
配置SceneTeleport对象:
1)Box Collider 2D -> Size设为x=0.3,y=12,
2)SceneTeleport -> SceneNameGoto=Scene1_Farm,ScenePositionGoto -> x=39。
选择Tilemap Grid下的Collisions对象,再反勾选Tilemap Renderer。
(3)再处理Scene1_Farm
卸载Scene2_Field,重新加载Scene1_Farm,
配置SceneTeleport -> SceneNameGoto=Scene2_Field,ScenePositionGoto -> x=-39。
(4)配置启动场景名称
在Hierarchy -> PersistentScene中,配置SceneControllerManager -> StartingSceneName=Scene1_Field。
5、运行程序
同时卸载掉Scene1_Farm和Scene2_Field,然后运行程序。
因为SceneControllerManager会加载某一个场景,如果当前已经有一个加载中的场景,则会导致重复加载2次。
运行效果如下: