Уничтожение игрового объекта, являющегося частью префаба, после нажатия клавиши действия внутри триггера. - PullRequest
0 голосов
/ 05 октября 2019

так что я делаю 2d платформу. Мой уровень состоит из нескольких платформ, которые являются частью сборного. Я хочу сделать это так, когда мой игрок нажимает клавишу (в данном случае 'E') внутри коллайдера2d, платформа над игроком разрушается, и ящик, лежащий на платформе, падает.

У меня естьу вас срабатывает обнаружение, когда внутри триггера нажимается 'E', но он не может понять, как уничтожить только одну платформу в сборном.

Любая помощь будет признательна!

public class SwitchController : MonoBehaviour
{
    public Collider2D switchCollider;
    public Rigidbody2D player;

    void Start()
    {
        switchCollider = GetComponent<Collider2D>();
    }

    private void OnTriggerStay2D(Collider2D col)
    {
        // var player = col.GetComponent<PlayerController>();
        var actionBtn = PlayerController.action;
        if (player)
        {
            Debug.Log("Collided");

            if (Input.GetKeyDown(KeyCode.E))
            {
                actionBtn = true;
                Debug.Log("Action Pressed");
            }

        }
    }
}

1 Ответ

0 голосов
/ 05 октября 2019

Если возможно, самое простое решение - хранить платформу через инспектора (из префаба).
Затем вы уничтожите игровой объект при необходимости, например:

public class SwitchController : MonoBehaviour {

    // ...

    public GameObject targetPlatform;

    private void OnTriggerStay2D(Collider2D col) {
        // ...
        Destroy(targetPlatform); // Destroy the platform.
    }
}

Или, вы можете осуществлять радиопередачу вверх от игрока

public class SwitchController : MonoBehaviour {
    public Collider2D switchCollider;
    public Rigidbody2D player;

    [SerializeField, Tooltip("The layer mask of the platforms.")]
    public LayerMask platformLayerMask;
    void Start() {
        switchCollider = GetComponent<Collider2D>();
    }

    private void OnTriggerStay2D(Collider2D col) {
        var actionBtn = PlayerController.action;

        if (player) {
            if (Input.GetKeyDown(KeyCode.E)) {
                actionBtn = true;
                // Raycast upwards from the player's location.
                // (Raycast will ignore everything but those with the same layermask as 'platformPlayerMask')
                RaycastHit2D hit = Physics2D.Raycast(player.transform.position, Vector2.up, Mathf.Infinity, platformLayerMask);

                if (hit.collider != null) {
                    // Destroy what it hits.
                    Destroy(hit.transform.gameObject);
                }
            }
        }
    }
}

По сравнению с первым решением, это решение более динамичное.
Вам просто нужно установить Layers платформ в инспекторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...