当前位置: 首页 > article >正文

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

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

运行效果如下:


http://www.kler.cn/a/539182.html

相关文章:

  • 信息科技伦理与道德3-2:智能决策
  • Arbess基础教程-创建流水线
  • 2.9寒假作业
  • 2025-2-10 deepseek本地部署与本地训练最简版本
  • 14vue3实战-----获取用户信息和用户的菜单树信息
  • 使用 OpenGL ES 渲染一个四边形
  • 【神经网络框架】非局部神经网络
  • [LeetCode]day18 202.快乐数
  • Redis的数据过期策略和数据淘汰策略
  • 【计算机视觉】多分辨率金字塔全解析 ✨
  • 机试题——D路通信
  • Sparse4D v3:推进端到端3D检测和跟踪
  • Android系统SELinux详解
  • 携手AWS,零成本在EKS上体验AutoMQ企业版
  • 计算机网络知识速记:TCP 与 UDP
  • 六、OSG学习笔记-漫游(操作器)
  • ViewModel和LiveData
  • ES6中的模板字符串
  • 2025年2月9日(数据分析,在最高点和最低点添加注释,添加水印)
  • 面向对象设计在Java程序开发中的最佳实践研究
  • 【服务器知识】如何在linux系统上搭建一个nfs
  • springboot 事务管理
  • 植物神经紊乱:补充这些维生素,为健康 “充电”
  • Http 的响应码有哪些? 分别代表的是什么?
  • 算法基础之八大排序
  • C++设计模式 —— 工厂模式