Я хочу, чтобы мой игрок умер, когда он касается нескольких объектов с разными тегами - PullRequest
1 голос
/ 04 мая 2019

Как я могу заставить своего игрока умереть, когда он касается двух разных игровых объектов с разными тегами.Игрок должен умереть, когда он касается тега «враг» и тега «земля».Кроме того, я не пытаюсь использовать один и тот же тег противника для наземных объектов, поскольку я уже использую тег «враг» для своего другого сценария.

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

public class Move2d : MonoBehaviour
{
    public float playerSpeed;  //allows us to be able to change speed in Unity
    public Vector2 jumpHeight;
    public bool isDead = false;
    private Rigidbody2D rb2d;
    private Score gm;

    void Start()
    {
        rb2d = GetComponent<Rigidbody2D>();
        gm = GameObject.FindGameObjectWithTag("gameMaster").GetComponent<Score>();
    }

    void Update()
    {
        if (isDead) { return; }
        transform.Translate(playerSpeed * Time.deltaTime, 0f, 0f);  //makes player run

        if (Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Space))  //makes player jump
        {
            GetComponent<Rigidbody2D>().AddForce(jumpHeight, ForceMode2D.Impulse);
        }
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.CompareTag("ground")) // this will return true if the collision gameobject has ground tag on it.
        {
            isDead = true;
            rb2d.velocity = Vector2.zero;
            GameController.Instance.Die();
        }
    }

    void OnTriggerEnter2D(Collider2D col)
    {
        if( col.CompareTag("coin"))
        {
            Destroy(col.gameObject);
            gm.score += 1;
        }
    }
}

Ответы [ 4 ]

1 голос
/ 04 мая 2019

Я думаю, что вы, возможно, задали вопрос неправильно, и что вы имеете в виду, что игрок умрет, если он ударит по земле или врагу, а не обоим одновременно.Легкое исправление делает то, что Никола предложил с небольшим изменением:

private void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.CompareTag("ground") || collision.gameObject.CompareTag("enemy"))
    {
        isDead = true;
        rb2d.velocity = Vector2.zero;
        GameController.Instance.Die();
    }
}
1 голос
/ 04 мая 2019

OnCollisionEnter будет вызываться индивидуально один раз для каждого объекта, который начинает касаться вашего игрока в течение этого кадра.

Вам потребуется создать способ отслеживания нескольких вызовов OnCollisionEnter группы объектов, касающейся вашего игрока в этой точке. Один из способов - создать логическое значение для каждого типа проверяемого тега:

private bool touchedGround = false;
private bool touchedEnemy = false;

private void LateUpdate() {
   touchedGround = false;
   touchedEnemy = false;
}

private void OnCollisionStay2D(Collision2D collision) {
    if (collision.gameObject.CompareTag("ground")) {
        touchedGround = true;
    }

    if (collision.gameObject.CompareTag("enemy")) {
        touchedEnemy = true;
    }

    if (touchedGround && touchedEnemy) {
       isDead = true;
       rb2d.velocity = Vector2.zero;
       GameController.Instance.Die();
    }
} 

В конце каждого OnCollisionEnter вы проверяете, встречались ли оба тега. В LateUpdate вы сбрасываете флаги в false, чтобы следующий кадр вы перепроверяли.

Как примечание, это решение не очень расширяемо. Вы можете использовать слои (LayerMask) и немного логической логики, позволяющей сравнивать несколько категорий за одну операцию. Но это был бы другой вопрос.

0 голосов
/ 04 мая 2019

Здравствуйте, почему бы просто не сделать это

private void OnCollisionEnter2D(Collision2D collision)
{
    switch (collision.gameobject.tag)
        case "tag_here"
           isDead = true;
           rb2d.velocity = Vector2.zero;
           GameController.Instance.Die();
           break;
       case "tag_here2"
           isDead = true;
           rb2d.velocity = Vector2.zero;
           GameController.Instance.Die();
           break;
       case "tag_here3"
           isDead = true;
           rb2d.velocity = Vector2.zero;
           GameController.Instance.Die();
           break;
       //Copy paste as long as you need more
    }

операторы переключения похожи на более короткую версию операторов if.

0 голосов
/ 04 мая 2019

Вы можете использовать следующий подход, он называется, когда враг || Gound Tag входит в && выходы.

private bool enemy, ground;

private void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.CompareTag("Enemy"))
    {
        enemy = true;
    }

    if (collision.gameObject.CompareTag("Ground"))
    {
        ground = true;
    }

    if(enemy && ground)
    {
        Debug.Log("Enemy and Ground collision");
    }
}

private void OnCollisionExit2D(Collision2D collision)
{
    if (collision.gameObject.CompareTag("Enemy"))
    {
        enemy= false;
    }

    if (collision.gameObject.CompareTag("Ground"))
    {
        ground = false;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...