Unity3D仿星露谷物语开发28之切换场景

发布于:2025-02-10 ⋅ 阅读:(35) ⋅ 点赞:(0)

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次。

运行效果如下:


网站公告

今日签到

点亮在社区的每一天
去签到