Зарегистрировано столкновение, но с неправильным тегом: Hurt - PullRequest
1 голос
/ 03 апреля 2020

Я играю в 2d игру, и мой игрок сталкивается с 2 разными объектами. Один для получения здоровья, а другой для его повреждения. Итак, у меня есть два тега: PowerUp (и этот работает) и Hurt (я получаю в консоли сообщение, подобное этому, и я не понимаю, почему: зарегистрировал столкновение, но с неправильным тегом: Hurt). Это сценарий, который я использовал , что я должен изменить в этом для того, чтобы это действие DAMAGE имело место (и я попробовал на входе столкновения тоже)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
public class PowerUpDetector : MonoBehaviourPun
{
    // reference this via the Inspector
    [SerializeField] private Character healthbar;
    [SerializeField] private Character health;
   

    private void Awake()
    {
        if (!healthbar) healthbar = GetComponent<Character>();
        
    }

    private void OnTriggerEnter2D(Collider2D other)
    {
        // or whatever tag your powerups have
        if (!other.CompareTag("PowerUp"))
        {
            Debug.LogWarning($"Registered a collision but with wrong tag: {other.tag}", this);
            return;
        }
        
        var powerup = other.GetComponent<PowerUp>();
        if (!powerup)
        {
            Debug.LogError($"Object {other.name} is tagged PowerUp but has no PowerUp component attached", this);
            return;
        }

        Debug.Log("Found powerup, pick it up!", this);
        powerup.Pickup(healthbar);

        if (!other.CompareTag("Hurt"))
        {
            if (photonView.IsMine)
            {
                photonView.RPC("Damage", RpcTarget.All);
                
            }

            
        }



    }
    [PunRPC]
    void Damage()
    {
        health.Health -= 20;
    }

}

Опция 2 та же ошибка введите описание изображения здесь

private void OnCollisionEntered2D(Collision2D col)
    {
        if( col.gameObject.CompareTag ("Hurt"))
        {
            if (photonView.IsMine)
            {
                photonView.RPC("Damage", RpcTarget.All);
            }
        }
    }
    [PunRPC]
    void Damage()
    {
        health -= 20;
    }

Мой скрипт для игроков с индикатором здоровья

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;
using Photon.Pun;
using Photon.Realtime;
using Photon;
using UnityEngine.UI;


public class Character : MonoBehaviourPun,IPunObservable
{

    Rigidbody2D rb;
    float dirX;

    [SerializeField]
    float moveSpeed = 5f, jumpForce = 400f, bulletSpeed = 500f;

    [SerializeField] private float health = 100;
    [SerializeField] private Slider slider;
    [SerializeField] private Gradient gradient;
    [SerializeField] private Image fill;

    Vector3 localScale;
   
    public Transform barrel;
    public Rigidbody2D bullet;

    // Use this for initialization
    void Start()
    {
        localScale = transform.localScale;
        rb = GetComponent<Rigidbody2D>();
        if (photonView.IsMine)
        {
            
            
        }
        else
        {

        }
    }
    public float Health
    {
        get { return health; }
        set
        {
            health = value;
            slider.value = health;
            fill.color = gradient.Evaluate(slider.normalizedValue);
        }
    }

  /*  private void OnCollisionEntered2D(Collision2D col)
    {
        if( col.gameObject.CompareTag ("Hurt"))
        {
            if (photonView.IsMine)
            {
                photonView.RPC("Damage", RpcTarget.All);
            }
        }
    }
    [PunRPC]
    void Damage()
    {
        health -= 20;
    }*/
    // Update is called once per frame
    void Update()
    {
        if (photonView.IsMine)
        {
            dirX = CrossPlatformInputManager.GetAxis("Horizontal");
            if (dirX != 0)
            {
                barrel.up = Vector3.right * Mathf.Sign(dirX);
            }

            if (CrossPlatformInputManager.GetButtonDown("Jump"))
                Jump();

            if (CrossPlatformInputManager.GetButtonDown("Fire1"))
                Fire();
            
        }
        else
        {

        }
    }

    void FixedUpdate()
    {
        if (photonView.IsMine)
        {
            rb.velocity = new Vector2(dirX * moveSpeed, rb.velocity.y);
        }
    }




    void Jump()
    {
        if (photonView.IsMine)
        {
            if (rb.velocity.y == 0)
                rb.AddForce(Vector2.up * jumpForce);
        }
    }

    void Fire()
    {
        if (photonView.IsMine)
        {
            var firedBullet = Instantiate(bullet, barrel.position, barrel.rotation);
            firedBullet.AddForce(barrel.up * bulletSpeed);
        }
    }

    public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        if (stream.IsWriting)
        {
            stream.SendNext(health);
        }else if (stream.IsReading)
        {
           health = (float)stream.ReceiveNext();
        }
    }
    public void SetMaxHealth(int value)
    {
        if (photonView.IsMine)
        {
            slider.maxValue = value;
            // The property handles the rest anyway
            Health = value;
        }

    }
}

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Примерно так, смотрите ниже. Но, пожалуйста, прочитайте комментарий, связанный с тегом "Hurt". Написал это в этом текстовом редакторе, но я думаю, что синтаксис правильный.

   private void OnTriggerEnter2D(Collider2D other)
    {

        switch (other.tag)
        {

            case "PowerUp":
                var powerup = other.GetComponent<PowerUp>();
                powerup.Pickup(healthbar);
                break;


            // You use '!other.CompareTag("Hurt")'. So you check if the tag is NOT hurt? Is that correct? I would assume you would check to see if it IS 'Hurt'?
            case "Hurt":
                if (photonView.IsMine)
                {
                    photonView.RPC("Damage", RpcTarget.All);
                }
                break;

            default:

                Debug.Log("did not recognize this tag:" + other.tag);
                break;

        }

    }
0 голосов
/ 03 апреля 2020
// or whatever tag your powerups have
if (!other.CompareTag("PowerUp")) {
  Debug.LogWarning($"Registered a collision but with wrong tag: {other.tag}", this);
  return;
}

Этот оператор будет регистрировать ошибку всякий раз, когда вы сталкиваетесь с чем-то, что не помечено как «PowerUp» (IE, если оно помечено как «Hurt»).
Затем оператор return загружает вас из функции и это означает, что он не достигает той части, где наносит ущерб.

Вы можете изменить это, чтобы включить && !other.CompareTag("Hurt") в оператор if. Лучшим подходом может быть удаление этого оператора if целиком. Вы должны проверять теги так:

if(has this tag) {
  Do this
}
if(has that tag) {
  Do that
}

Вместо того, чтобы видеть, нет ли у него тега, и возвращаться.

...