Двери работают странно

Делаю 2д платформер, захотел двери. По идее должно работать так - есть дверь, и у нее есть linkeddoor, при нажатии E пока в двери происходит телепортация на позицию linkeddoor. Вот код:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class door : MonoBehaviour
{
    Rigidbody2D rb;

    public move character;
    public Rigidbody2D plr;
    public LayerMask doorlayer;
    public Transform linkeddoor;
    public GameObject doortip;



    void Start()
    {
        doortip.gameObject.SetActive(false);
    }



    void Update()
    {
        Collider2D plrcollider = Physics2D.OverlapCircle(plr.position, 0.01f, doorlayer);
        if (plrcollider != null)
        {
            character.canenter = true;
            doortip.gameObject.SetActive(true);
        }
        else
        {
            character.canenter = false;
            doortip.gameObject.SetActive(false);
        }



        if (character.entered)
        {
            plr.position = linkeddoor.position;
            character.entered = false;
            character.canenter = false;
        }
    }
}

Код с телепортацией при нажатии E(из скрипта персонажа):

if (canenter)
{
    if (Input.GetKeyDown(KeyCode.E))
    {
        entered = true;
    }
}

Проблема в том, что из-за public в скрипте, все двери считают один linkeddoor своим. Как можно заставить их смотреть только на свой linkeddoor?


Ответы (1 шт):

Автор решения: Yaroslav

Коллайдер должен быть триггером.

[DisallowMultipleComponent]
[RequireComponent(typeof(Collider))]

public class Door : MonoBehaviour {

    [SerializeField] private Door _linkDoor;
    private Player _player;

    private void Update () {
        if (Input.GetKeyDown(KeyCode.E))
            TransferPlayer();
    }

    private void OnTriggerEnter (Collider other) {
        Player Player = GetComponent<Player>();
        if (Player != null)
            PlayerEnter(Player);
    }

    private void OnTriggerExit (Collider other) {
        Player Player = GetComponent<Player>();
        if (Player != null)
            PlayerExit();
    }
    
    private void PlayerEnter (Player player) {
        _player = player;
        SetTipEnable(true);
    }

    private void PlayerExit () {
        _player = null;
        SetTipEnable(false);
    }

    private void TransferPlayer () {
        if (_player != null && _linkDoor != null) {
            //...
            PlayerExit();
        }
    }

    private void SetTipEnable (bool enable) {
        //...
    }
}
→ Ссылка