把人物用 Unity 进行 2D 传送,拢共分四步 | 原力计划

本文详细介绍如何在Unity中实现角色通过传送门瞬移的机制。关键步骤包括:使用C#脚本检测角色进入传送门,通过枚举区分不同类型的传送门,利用GameManager统一管理所有传送门并查找配对传送门,控制角色位置瞬移到目标传送门,以及通过状态控制避免连续瞬移。文章提供完整代码示例。

作者 | 珞珈大胖强TURBO

来源 | 优快云博客,责编 | 夕颜

封面图 | 优快云 下载自视觉中国

出品 | 优快云(ID:优快云news)

首先,假设传送门是两两之间可以传送,那么具体是实现,重要的点有以下四点:

  1. 传送门检测人物进入

  2. 传送门得到目的传送门(也就是和当前传送门相同种类的门)的GameObject

  3. 传送门代码控制人物的位置到目的传送门

  4. 暂时关闭目的传送门的传送功能,当人物走出去之后再重新开启传送功能

接下来逐个攻破:

传送门检测人物进入

此图中的圆圈为传送门,给他加C#脚本,命名为PortalGateway

1private void OnTriggerEnter2D(Collider2D collision)
2    {
3        if ( collision.gameObject.layer == 8)
4    }

其实这两行代码就解决问题了,也就是在OnTriggerEnter2D检测碰撞体的图层是不是人物图层,这里是8的原因是因为我的项目的人物图层是8.

获得目的传送门的 GameObject

传送门得到目的传送门(也就是和当前传送门相同种类的门)的GameObject。

1 public enum KindofGate
2    {
3        Gate1,
4        Gate2,
5        Gate3,
6        Gate4
7    }
8
9    public KindofGate kindofGate;

这些代码,设置传送门种类枚举,创建枚举对象kindofGate,自己设置想要互相传送的传送门kindofGate相同

那么,一个传送门怎么找到相同种类的传送门呢?

1. 在GameManager中加入注册方法,统计注册所以的PortalGateway为一个List。

 1 List<PortalGateway> portalGateways;
 2 portalGateways = new List<PortalGateway>();
 3 public static void RegistPortalGateway(PortalGateway portalGateway)
 4    {
 5        if (!instance.portalGateways.Contains(portalGateway))
 6            instance.portalGateways.Add(portalGateway);
 7    }
 8``

2. 每个传送门的代码的Start部分调用,将自身注册(也就是加入进List)。

1```c
2  GameManager.RegistPortalGateway(this);

3. 在GameManager中加入寻找方法,参数为PortalGateway对象,遍历List,寻找和该对象的kindofGate相同的对象。

 1  public static  PortalGateway FindSameGate(PortalGateway portalGateway)
 2    {
 3
 4            foreach(PortalGateway portalGateway1 in instance.portalGateways)
 5            {
 6                if(portalGateway1!=portalGateway)
 7                {
 8                if (portalGateway1.kindofGate == portalGateway.kindofGate)
 9                    return portalGateway1;
10                }
11            }
12        return null;
13    }

4. 在PortalGateway中调用方法,寻找到相同种类的传送门

1GameManager.FindSameGate(this)

(Gamemanage就是个一个场景自始至终只有一次生成的代码,不会因为关卡重启而删除),具体实现可以学习单例模式,代码就是这种

 1 private void Awake()
 2    {
 3
 4        if (instance != null)
 5        {
 6            Destroy(gameObject);
 7            return;
 8        }
 9
10        instance = this;
11
12        DontDestroyOnLoad(this);
13    }

传送门代码控制人物的位置到目的传送门

有了上面的东西,现在就简单了

1  collision.transform.position = GameManager.FindSameGate(this).transform.position;

重新开启传送功能

暂时关闭目的传送门的传送功能,当人物走出去之后再重新开启传送功能。

设置一个bool状态,控制传送功能:

 1  public bool CanCheckAnother;
 2  //进
 3  private void OnTriggerEnter2D(Collider2D collision)
 4    {
 5        if ( collision.gameObject.layer == 8)
 6        {
 7
 8            if (CanCheckAnother == true)
 9            {
10
11                if (GameManager.FindSameGate(this).CanCheckAnother == true)
12                {
13                    collision.transform.position = GameManager.FindSameGate(this).transform.position;
14                    CanCheckAnother = false;
15                } 
16            }
17
18        }
19        }
20      //出  
21    private void OnTriggerExit2D(Collider2D collision)
22    {
23        if (collision.gameObject.layer == 8 )
24            GameManager.FindSameGate(this).CanCheckAnother = true;
25    }

总代码如下:

 1using System.Collections;
 2using System.Collections.Generic;
 3using UnityEngine;
 4
 5public class PortalGateway : MonoBehaviour
 6{
 7    public enum KindofGate
 8    {
 9        Gate1,
10        Gate2,
11        Gate3,
12        Gate4
13    }
14
15    public KindofGate kindofGate;
16    public bool CanCheckAnother;
17
18    private void Start()
19    {
20
21        CanCheckAnother = true;
22
23        GameManager.RegistPortalGateway(this);
24
25    }
26
27    private void OnTriggerEnter2D(Collider2D collision)
28    {
29        if ( collision.gameObject.layer == 8)
30        {
31
32            if (CanCheckAnother == true)
33            {
34
35                if (GameManager.FindSameGate(this).CanCheckAnother == true)
36                {
37                    collision.transform.position = GameManager.FindSameGate(this).transform.position;
38                    CanCheckAnother = false;
39                } 
40            }
41
42        }
43
44
45
46
47    }
48
49
50    private void OnTriggerExit2D(Collider2D collision)
51    {
52        if (collision.gameObject.layer == 8 )
53            GameManager.FindSameGate(this).CanCheckAnother = true;
54    }
55
56}

原文链接:

https://blog.youkuaiyun.com/weixin_44739495/article/details/104742250

推荐阅读 

李彦宏:百度今年全员涨薪,比去年还多;谷歌暂停Chrome浏览器更新;Eclipse 4.15发布 | 极客头条

GitHub 移动端正式发布!

检测、量化、追踪新冠病毒,基于深度学习的自动CT图像分析有多靠谱?

深度学习“三巨头”、图灵奖得主 Yann LeCun:我没有天赋,所以才追随聪明人

Docker 开发环境的滑坡

来,让我们逐一澄清以太坊 2.0 五大误解

你点的每一个在看,我认真当成了喜欢

### 传送系统功能的实现 在Unity2D中,传送系统通常通过触发器(Trigger)和脚本来实现。当玩家进入特定区域时,可以通过触发器检测到该事件,并将玩家传送到另一个位置或场景[^3]。 以下是一个简单的代码示例,展示如何使用触发器来实现基本的传送功能: ```csharp using UnityEngine; public class TeleportSystem : MonoBehaviour { public Transform destination; // 设置目标传送位置 void OnTriggerEnter2D(Collider2D other) { if (other.gameObject.CompareTag("Player")) // 检查是否为玩家对象 { other.transform.position = destination.position; // 将玩家传送到目标位置 Debug.Log("玩家已传送到新位置!"); } } } ``` #### 说明 1. **触发器设置**:需要确保触发器对象的Collider 2D组件启用了“Is Trigger”选项。 2. **目标位置**:`destination`变量应绑定到场景中的一个空物体或特定位置,表示玩家传送的目标点。 3. **标签检查**:通过`Tag`判断进入触发器的对象是否为玩家,以避免误操作。 此外,如果希望实现跨场景传送,可以结合`SceneManager.LoadScene()`方法加载目标场景,并在新场景中设置玩家的初始位置[^1]。 ```csharp using UnityEngine; using UnityEngine.SceneManagement; public class SceneTeleportSystem : MonoBehaviour { public string targetSceneName; // 目标场景名称 public Vector2 spawnPosition; // 玩家在目标场景的初始位置 void OnTriggerEnter2D(Collider2D other) { if (other.gameObject.CompareTag("Player")) { // 加载目标场景并设置玩家初始位置 SceneManager.LoadScene(targetSceneName); GameObject.FindGameObjectWithTag("Player").transform.position = spawnPosition; Debug.Log("玩家已传送到新场景!"); } } } ``` #### 注意事项 - 在跨场景传送中,需确保目标场景已正确配置,并且玩家对象在新场景中有对应的初始位置[^1]。 - 使用`SceneManager.LoadScene()`时,可能需要额外处理场景间的过渡效果或保存游戏状态。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

优快云资讯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值