Unity實現2D傳送門功能,當人物走進去的時候傳送

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;
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章