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

323
24 июня 2022, 05:30

Делаю 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?

Answer 1

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

[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) {
        //...
    }
}
READ ALSO
c# Как скачать видео с vk.com?

c# Как скачать видео с vk.com?

С помощью VK API методом videoget получил ссылку на видео: Ссылка на видео

344
Синхронизация константа и JSON базы

Синхронизация константа и JSON базы

Я хочу, чтобы данные в константе или объекте обновлялись, те

194
Деплой Static Nuxt project

Деплой Static Nuxt project

Скажите, пожалуйста, сделал landing page для бизнеса на Nuxt, теперь не знаю как это все положить на хостингМогу положить на Netlify, но мне нужно с красивым...

227
Функция выравнивания строки на JavaScript

Функция выравнивания строки на JavaScript

Столкнулась с такой задачей, помогите пожалуйста!!

227