Unity實現2D傳送門功能,當人物走進去的時候傳送
首先,假設傳送門是兩兩之間可以傳送,那麼具體是實現,重要的點有以下四點
總代碼在文章末尾
一 傳送門檢測人物進入
二 傳送門得到目的傳送門(也就是和當前傳送門相同種類的門)的GameObject
三 傳送門代碼控制人物的位置到目的傳送門
四暫時關閉目的傳送門的傳送功能,當人物走出去之後再重新開啓傳送功能
接下來逐個攻破:
一傳送門檢測人物進入
此圖中的圓圈爲傳送門,給他加C#腳本,命名爲PortalGateway
private void OnTriggerEnter2D(Collider2D collision)
{
if ( collision.gameObject.layer == 8)
}
其實這兩行代碼就解決問題了,也就是在OnTriggerEnter2D檢測碰撞體的圖層是不是人物圖層,這裏是8的原因是因爲我的項目的人物圖層是8.
二 傳送門得到目的傳送門(也就是和當前傳送門相同種類的門)的GameObject
public enum KindofGate
{
Gate1,
Gate2,
Gate3,
Gate4
}
public KindofGate kindofGate;
這些代碼,設置傳送門種類枚舉,創建枚舉對象kindofGate,自己設置想要互相傳送的傳送門kindofGate相同
那麼,一個傳送門怎麼找到相同種類的傳送門呢
1,在GameManager中加入註冊方法,統計註冊所以的PortalGateway爲一個List。
List<PortalGateway> portalGateways;
portalGateways = new List<PortalGateway>();
public static void RegistPortalGateway(PortalGateway portalGateway)
{
if (!instance.portalGateways.Contains(portalGateway))
instance.portalGateways.Add(portalGateway);
}
``
2,每個傳送門的代碼的Start部分調用,將自身註冊(也就是加入進List)。
```c
GameManager.RegistPortalGateway(this);
3,在GameManager中加入尋找方法,參數爲PortalGateway對象,遍歷List,尋找和該對象的kindofGate相同的對象。
public static PortalGateway FindSameGate(PortalGateway portalGateway)
{
foreach(PortalGateway portalGateway1 in instance.portalGateways)
{
if(portalGateway1!=portalGateway)
{
if (portalGateway1.kindofGate == portalGateway.kindofGate)
return portalGateway1;
}
}
return null;
}
4,在PortalGateway中調用方法,尋找到相同種類的傳送門
GameManager.FindSameGate(this)
(Gamemanage就是個一個場景自始至終只有一次生成的代碼,不會因爲關卡重啓而刪除),具體實現可以學習單例模式,代碼就是這種
private void Awake()
{
if (instance != null)
{
Destroy(gameObject);
return;
}
instance = this;
DontDestroyOnLoad(this);
}
三 傳送門代碼控制人物的位置到目的傳送門
有了上面的東西,現在就簡單了
collision.transform.position = GameManager.FindSameGate(this).transform.position;
四暫時關閉目的傳送門的傳送功能,當人物走出去之後再重新開啓傳送功能
設置一個bool狀態,控制傳送功能
public bool CanCheckAnother;
//進
private void OnTriggerEnter2D(Collider2D collision)
{
if ( collision.gameObject.layer == 8)
{
if (CanCheckAnother == true)
{
if (GameManager.FindSameGate(this).CanCheckAnother == true)
{
collision.transform.position = GameManager.FindSameGate(this).transform.position;
CanCheckAnother = false;
}
}
}
}
//出
private void OnTriggerExit2D(Collider2D collision)
{
if (collision.gameObject.layer == 8 )
GameManager.FindSameGate(this).CanCheckAnother = true;
}
總代碼如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PortalGateway : MonoBehaviour
{
public enum KindofGate
{
Gate1,
Gate2,
Gate3,
Gate4
}
public KindofGate kindofGate;
public bool CanCheckAnother;
private void Start()
{
CanCheckAnother = true;
GameManager.RegistPortalGateway(this);
}
private void OnTriggerEnter2D(Collider2D collision)
{
if ( collision.gameObject.layer == 8)
{
if (CanCheckAnother == true)
{
if (GameManager.FindSameGate(this).CanCheckAnother == true)
{
collision.transform.position = GameManager.FindSameGate(this).transform.position;
CanCheckAnother = false;
}
}
}
}
private void OnTriggerExit2D(Collider2D collision)
{
if (collision.gameObject.layer == 8 )
GameManager.FindSameGate(this).CanCheckAnother = true;
}
}