Когда игрок стреляет, он теряет жизнь - PullRequest
0 голосов
/ 18 апреля 2020

Я делаю многопользовательскую игру2d, и когда мой игрок стреляет (у оружия тоже есть коллайдер), это влияет на его жизнь, и я не знаю почему. Вероятно, потому что, когда у цели "больно" есть RPCtarget.all, но я не Я не знаю, что изменить, чтобы повлиять на других игроков в игре, а не на моих. Чем я могу все заменить?

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;
    public Rigidbody2D bulletPrefabs;
    Vector3 localScale;
    public DeathsCount myCounts;
    public Transform barrel;
    public Rigidbody2D bullet;

 

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

        }
    }
    

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

    private void OnTriggerEnter2D(Collider2D col)
    {
        if (col.gameObject.CompareTag("Hurt"))
        {
            if (photonView.IsMine)
            {
                photonView.RPC("Damage", RpcTarget.All);
            }
        }
        if (col.gameObject.tag == "PowerUp")
        {
            if (photonView.IsMine)
            {
                var powerup = col.GetComponent<PowerUp>();
                powerup.Pickup(this);
            }
            else
            {

            }

        }
        if (col.gameObject.CompareTag("Bullet"))
        {
            if (photonView.IsMine)
            {
                photonView.RPC("Damage", RpcTarget.All);
                bullet = bulletPrefabs;
            }
        }
        else
        {

        }
    }

    [PunRPC]
    void Damage()
    {
        if (Health > 0)
        {
            Health -= 20;
        }
        if (Health <= 0) // check health status
        {
            Health = 0; // make that Heath don't be < 0

            if (photonView.IsMine)
            {
                myCounts.RpcRespawn(); //Here you should to call counter
                photonView.transform.position = Vector2.zero;
                Health = 100;
            }
        }

    }
    // 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()
    {
        
            var firedBullet = PhotonNetwork.Instantiate(bullet.name, barrel.position, barrel.rotation).GetComponent<Rigidbody2D>();
            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;
        }

    }
}

1 Ответ

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

Я думаю, вам не нужно RP C в этом случае.

Я вижу вашего персонажа IPunObservable и, я думаю, добавлен в PhotonView. Так что его здоровье будет синхронизироваться c автоматически. Вы также создаете экземпляры пуль в PhotonNetwork, что означает, что они тоже будут синхронизироваться c и иметь PhotonView.

Таким образом, у каждого игрока есть все синхронизированные пули и другие игроки.

Это означает, что все, что вы нужно проверить, была ли пуля у другого игрока и установить урон локально (не волнуйтесь, результат будет синхронизироваться c) следующим образом:

. . .
    private void OnTriggerEnter2D(Collider2D col)
    {
        if (col.gameObject.CompareTag("Hurt"))
        {
            // if hurt object is not mine, take damage
            if (!col.gameObject.GetPhotonView().isMine) 
                Damage();
        }
        if (col.gameObject.tag == "PowerUp")
        {
            if (photonView.IsMine)
            {
                var powerup = col.GetComponent<PowerUp>();
                powerup.Pickup(this);
            }
            else
            {

            }

        }
        if (col.gameObject.CompareTag("Bullet"))
        {
            // if bullet is not mine, take damage
            if (!col.gameObject.GetPhotonView().isMine)
                Damage();
        }
        else
        {

        }
    }

    // no rpc
    void Damage()
    {
        if (!photonView.IsMine) // only player can change his life
            return;

        if (Health > 0)
        {
            Health -= 20;
        }
        if (Health <= 0) // check health status
        {
            myCounts.RpcRespawn(); //Here you should to call counter
            photonView.transform.position = Vector2.zero;
            Health = 100;
        }

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