En este momento estás viendo enviar un RPC con instancia de clase da un error – unity código de red

 – Unity

enviar un RPC con instancia de clase da un error – unity código de red – Unity

enviar un RPC con instancia de clase da un error – unity código de red

– UnityAssets3Free

bienvenido , por aqui jorge y en esta ocasion os traigo
esta nueva pregunta

Estoy usando NetCode para GameObject 1.0.0 pre.5 en unity
y sigo recibiendo el siguiente error cuando intento enviar un ServerRPC

AssetsscripsWeaponsGrenades.cs(72,13): error – No sé cómo serializar PlayerMessenger – implementar INetworkSerializable o agregar un método de extensión a FastBufferWriter.WriteValueSafe para configurar la serialización.

el método que da el error es Grenades.SetHealthDownServerRpc()

cómo se ve una instancia de la clase PlayerMassenger

aquí está mi código:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using Unity.Netcode;

    namespace BeanBoxers.Weapons
   {
       [System.Serializable]
       [implement : INetworkSerializable]
       public class Grenades : NetworkBehaviour
    {
        public string PlayerTag;
        public GameObject Particals;
        public double Timer = 10;
        public bool IsThouned = false;
        public bool? Team get; private set; = null;
        public float HitRadius = 5;
        public float Demage = 120;
        public float effectTime = .15f;
        void Start()
        
            Particals.SetActive(false);
            if(!IsServer) return;
            GetComponent<NetworkObject>().Spawn();
        
        // Update is called once per frame
        void Update()
        
            if (!IsThouned) return; 
            else
            
                Timer -= Time.deltaTime;
            

            if (Timer <= 0) 
            
                explod();
            
        

        public void explod()
        
            Particals.SetActive(true);
            IsThouned = false;
            Collider[] hitColliders = Physics.OverlapSphere(transform.position, HitRadius);
            foreach (var hitCollider in hitColliders)
            
                if (!IsOwner) break;
                if (hitCollider.tag == PlayerTag)
                
            
            GetComponent<MeshRenderer>().enabled = false;
            Destroy(transform.gameObject, effectTime);
        
            public void setTeam(bool? team)
        
            Team = team;
        

        [ServerRpc]
        private void SetHealthDownServerRpc(BeanBoxers.Player.PlayerMessenger player, float Demage)
        
            player.SetHealth(player.GetHealth() - Demage);
        
    }
}

PlayerMassenger:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Netcode;
using TMPro;
namespace BeanBoxers.Player
{
    [System.Serializable]
    public class PlayerMessenger : NetworkBehaviour
    {
        protected static BeanBoxers.Guns.GunsTM GunsTaskManager = new BeanBoxers.Guns.GunsTM();//Managed the guns
        //you can get from him a gun like so: GunsTaskManager.GetGun(<Gun name>);  
        public LayerMask groundMask;//a ground mask
        public dynamic Gunget; private set;// store the gun from the GunsTM to a variable
        public GameObject groundCheckget; private set;// store the GameObject that checks if the player touching
        public CharacterController controllerget; private set;// control the player
        public GameObject GrenadePathget; private set;//store the force for the grande to fly to 
        private int MaxHealth = 100;//max health
        public NetworkVariable<float> Healthget; private set; = new NetworkVariable<float>(100);//my health
        public float HealthRegnertionget; private set; = 3;// how fast the player does regnertion
        
        public float gravity = -10.0f;//gravity
        public float speedget; private set; = 100;//current speed
        public float Ospeedget; private set;// oriaginal speed
        private float groundDistnce = 0.4f;//the radus of the spire that chack if the payer touching th ground
        private Vector3 velocity = new Vector3(0, 0, 0);//the player velocity
        public float JumpVelocityget; private set; = 10f;// jump velocity
        private bool isGrounded;// store if the player is grouded or not
        
        public bool isSlideingget; private set; = false;//store if the player is slideing or not
        private Vector3 slideScale = new Vector3(1.3f, 0.5f, 1.3f);//player scale
        public float MaxSlideTimeget; private set; = 10;// max slideing time
        public float SlideingTimeget; private set; = 0;//current slideing time
        public bool isDeadget; private set; = false;//is the player dead
        private float RespawnTime = 5f;//how mach time is take the player to do a respawn
        
        public bool? Teamget; private set; = null;//true; red team, false; blue team, null; free for all
        
        private string GunName = "PickerKicker";// my current gun name
        public bool ShootTrigerget; private set; = false;// am I polling the triger 

        public int GrandesLeftget; private set; = 3;
        public int MaxNumberOfHoldedGrenadesget; private set; = 3;
        public bool IsHoldingGrenadeget; private set; = false;
        public float GrandeHoldTimerget; private set; = 0;
        public float MaxHoldGrandeTimeget; private set; = 5;
        public int SmookeGrandesLeftget; private set; = 3;
        public int MaxNumberOfHoldSmookeGrenadesget; private set; = 3;
        public bool IsHoldingSmookeGrenadeget; private set; = false;
        public float SmookeGrandeHoldTimerget; private set; = 0;
        public float MaxHoldSmookeGrandeTimeget; private set; = 5;
        public int MortarLeftget; private set; = 3;
        public int MaxNumberOfHoldedMortorget; private set; = 6;
        public RayCheck Rayget; private set;// a RayCheck object
        private GameObject UI;
        private BeanBoxers.UI.Player.FaceTheCamera UIclass;

        public double timerget; private set; = 0;// a timer
        public NetworkVariable<bool> TryVariable = new NetworkVariable<bool>(false);
        void Start()
        
            groundCheck = transform.GetChild(0).gameObject;

            Ospeed = speed;

            controller = GetComponent<CharacterController>();

            groundCheck.transform.parent = this.transform;
            groundCheck.transform.localPosition = new Vector3(0, -1f, 0);

            Ray = this.GetComponent<RayCheck>();

            this.SetGunName(GunName);

            EasterEggs();

            groundMask = LayerMask.GetMask("Ground");

            this.transform.position = new Vector3(0f, 10f, 0f);

            if (IsOwner)
            
                SetName(GameObject.Find("Menu").GetComponent<BeanBoxers.Multiplayer.MainMenu.MainMenu>().Name);
            
        

        void Update()
        {
            //update UI
            UIclass.update(this.transform.position, Health.Value, MaxHealth, name);

            if (!isDead)
            
                print(TryVariable);
                //update
                slideUpdate();

                velocity.y += gravity * Time.deltaTime;

                Vector3 move = new Vector3(velocity.x * speed, velocity.y, velocity.x * speed);
                controller.Move(move * Time.deltaTime);
                
                isGrounded = Physics.CheckSphere(groundCheck.transform.position, groundDistnce, groundMask);

                if (isGrounded && velocity.y <= 0)
                
                    velocity.y = -2f;
                
                //update the gun
                Gun.Update();

                //update the grenade
                if (IsHoldingGrenade)
                
                    if (GrandeHoldTimer > MaxHoldGrandeTime)
                    
                        GrandeHoldTimer = MaxHoldGrandeTime;
                    
                    else
                    
                        GrandeHoldTimer += Time.deltaTime;
                    
                
                
                //update the smooke grenade
                if (IsHoldingSmookeGrenade)
                
                    if (SmookeGrandeHoldTimer > MaxHoldSmookeGrandeTime)
                    
                        SmookeGrandeHoldTimer = MaxHoldSmookeGrandeTime;
                    
                    else
                    
                        SmookeGrandeHoldTimer += Time.deltaTime;
                    
                

                //check the ray cast
                if (ShootTriger)
                
                    if (Gun.Shoot())
                    
                        PlayerMessenger output = Ray.CheckWhatRayHit();
                        if (output != null)
                            
                            output.SetHealth(output.GetHealth() - Gun.TakeDemage(this.transform.position, output.transform.position));
                        
                    
                
                if (Health.Value <= 0)
                
                    isDead = true;
                    // ServerRpc();
                    if (!IsOwner) return;
                    DiedServerRpc();
                    //make Sure the player position update when he die
                    Disable();
                    Invoke("Spawn", 5);
                
                else if (Health.Value < MaxHealth)
                
                    Health.Value += HealthRegnertion * Time.deltaTime;
                
            
        }
        public void Spawn()
        
            Enable();
            isDead = false;
            timer = 0;
            Health.Value = MaxHealth;
            GrandesLeft = MaxNumberOfHoldedGrenades;
            SmookeGrandesLeft = MaxNumberOfHoldSmookeGrenades;
            MortarLeft = MaxNumberOfHoldedMortor;
            
        
        public void SetGunName(string gunName)
        
            if (!IsServer) return;
            this.GunName = gunName;
            Gun = GunsTaskManager.GetGun(GunName);
            Gun.setParent(Ray.RayStarter);
        

        public string GetGunName()
        
            return GunName;
        

        public void SetName(string name)
        
            if (!IsServer) return;
            this.name = name;
            EasterEggs();
        

        public string GetName(string name)
        
            return name;
        

        public void SetHealth(float Health)
        
            if (!IsServer) return;
            this.Health.Value = Health;
            if (Health > 0) return;
            DiedServerRpc();
        
        
        public float GetHealth()
        
            return Health.Value;
        

        [ServerRpc]
        private void DiedServerRpc()
        
            DiedClientRpc();
        

        [ClientRpc]
        private void DiedClientRpc()
        
            if (IsOwner) return;
            //make Sure the player position update when he die
            isDead = true;
            Disable();
            Invoke("Spawn", 5);
        
        public void SetSpeed(float NewSpeed)
        
            if (!IsServer) return;
            speed = NewSpeed;
        

        public void SetMaxHealth(int Max_Health)
        
            if (!IsServer) return;
            MaxHealth = Max_Health;
        

        public void changeTeam(bool? team)
        
            if (!IsServer) return;
            Team = team;
        
        private void Disable()
        
            transform.gameObject.SetActive(false);
        

        private void Enable()
        
            transform.gameObject.SetActive(true);
        

        private void EasterEggs() 
        
            if (name == "Eti Ben Simon") MaxHealth *= 2; Health.Value = MaxHealth;
        
        public void shootTriger(bool val)
        
            ShootTriger = val;
            shootTrigerServerRpc(val);
        

        [ServerRpc]
        private void shootTrigerServerRpc(bool val)
        
            ShootTriger = val;
            shootTrigerClientRpc(val);
        

        [ClientRpc]
        private void shootTrigerClientRpc(bool val)
        
            if(IsOwner) return;
            ShootTriger = val;
        
        public void Jump()
        
            if(!IsOwner) return;
            JumpServerRpc();
            if (isGrounded)
            
                velocity.y = JumpVelocity;
                unslide();
            
        
        
        [ServerRpc]
        private void JumpServerRpc()
        
            JumpClientRpc();
        

        [ClientRpc]
        private void JumpClientRpc() 
        

            if (isGrounded)
            
                velocity.y = JumpVelocity;
                unslide();
            
        
        public void slide()
        
            if(!IsOwner) return;
            slideServerRpc();
                    if (isGrounded)
                   
                speed = Ospeed * 2;
                isSlideing = true;
                transform.localScale = slideScale;
            
        

        [ServerRpc]
        private void slideServerRpc()
        
            slideClientRpc();
                        speed = Ospeed;
            isSlideing = false;
            Vector3 newScale = new Vector3(1f, 1f, 1f);
            transform.localScale = newScale;
        

        [ClientRpc]
        private void slideClientRpc()
        
            if(IsOwner) return;
            if (isGrounded)
                   
                speed = Ospeed * 2;
                isSlideing = true;
                transform.localScale = slideScale;
            
        
        public void unslide()
        
            if(!IsOwner) return;
            unslideServerRpc();
            speed = Ospeed;
            isSlideing = false;
            Vector3 newScale = new Vector3(1f, 1f, 1f);
            transform.localScale = newScale;
        
        [ServerRpc]
        private void unslideServerRpc()
        
            unslideClientRpc();
            speed = Ospeed;
            isSlideing = false;
            Vector3 newScale = new Vector3(1f, 1f, 1f);
            transform.localScale = newScale;
        

        [ClientRpc]
        private void unslideClientRpc()
        
            if(IsOwner) return;
            speed = Ospeed;
            isSlideing = false;
            Vector3 newScale = new Vector3(1f, 1f, 1f);
            transform.localScale = newScale;
        

        public void slideUpdate()
        
            if (isSlideing)
            
                SlideingTime += Time.deltaTime;
            
            else
            
                SlideingTime -= Time.deltaTime / 2;
                if (SlideingTime < 0)
                
                    SlideingTime = 0;
                
            

            if (SlideingTime >= MaxSlideTime)
            
                unslide();
            
        
        public void ThrowGrenade()
        
            if (!IsOwner) return;
            if (GrandesLeft > 0)
            
                Debug.Log("Grenade.Throw");
                GameObject Grande = Instantiate(Resources.Load("3Dmodels/Weapons/Grenade")) as GameObject;
                Grande.transform.position = GrenadePath.transform.position;
                BeanBoxers.Weapons.Grenades G = Grande.GetComponent<BeanBoxers.Weapons.Grenades>();
                Rigidbody GrenadeRigidbody = Grande.GetComponent<Rigidbody>(); 
                G.setTeam(Team);
                G.IsThouned = true;
                GrenadeRigidbody.AddForce((GrenadePath.transform.position - transform.position) * GrandeHoldTimer * 170);
                GrenadeRigidbody.AddTorque(new Vector3(UnityEngine.Random.Range(-180, 180), UnityEngine.Random.Range(-180, 180), UnityEngine.Random.Range(-180, 180)));
                GrandeHoldTimer = 0;
                IsHoldingGrenade = false;
                GrandesLeft -= 1;
            
        
        public void isHoldingGrenade(bool val)
        
            if (!IsOwner) return;
            IsHoldingGrenade = val;
        
        [ServerRpc]
        private void IsHoldingGrenadeServerRpc(bool val)
        
            IsHoldingGrenade = val;
            IsHoldingGrenadeClientRpc(val);
        
        [ClientRpc]
        private void IsHoldingGrenadeClientRpc(bool val)
        
            if (IsOwner) return;
            IsHoldingGrenade = val;
        
        public void ThrowSmookeGrenade()
        
            if (!IsOwner) return;
            if (SmookeGrandesLeft < 0) return; 
            Debug.Log("SmookeGrenade.Throw");
            GameObject Grande = Instantiate(Resources.Load("3Dmodels/Weapons/SmookeGrenade")) as GameObject;
            Grande.transform.position = GrenadePath.transform.position;
            BeanBoxers.Weapons.Grenades G = Grande.GetComponent<BeanBoxers.Weapons.Grenades>();
            Rigidbody GrenadeRigidbody = Grande.GetComponent<Rigidbody>(); 
            G.setTeam(Team);
            G.IsThouned = true;
            GrenadeRigidbody.AddForce((GrenadePath.transform.position - transform.position) * SmookeGrandeHoldTimer * 170);
            GrenadeRigidbody.AddTorque(new Vector3(UnityEngine.Random.Range(-180, 180), UnityEngine.Random.Range(-180, 180), UnityEngine.Random.Range(-180, 180)));
            SmookeGrandeHoldTimer = 0;
            IsHoldingSmookeGrenade = false;
            SmookeGrandesLeft -= 1;
        
        public void isHoldingSmookeGrenade(bool val)
        
            if (!IsOwner) return;
            IsHoldingSmookeGrenade = val;
        
        [ServerRpc]
        private void IsHoldingSmookeGrenadeServerRpc(bool val)
        
            IsHoldingSmookeGrenade = val;
            IsHoldingSmookeGrenadeClientRpc(val);
        
        [ClientRpc]
        private void IsHoldingSmookeGrenadeClientRpc(bool val)
        
            if (IsOwner) return;
            IsHoldingSmookeGrenade = val;
        
        public void PutMortar()
        
            if (!IsOwner) return;
            if (MortarLeft < 0) return;
            GameObject mortor = Instantiate(Resources.Load("3Dmodels/Weapons/Mortor")) as 
    GameObject;
            mortor.transform.position = GrenadePath.transform.position;
            mortor.transform.Rotate(46f, GrenadePath.transform.eulerAngles.y + 180, -90f);
            MortarLeft -= 1;
        
    }
}

mis guiones no son los mejores que conozco, pero ¿alguien tiene idea de por qué recibo el error? Me ayudará mucho

1 respuesta 1

Creo que primero podría intentar hacer lo que dice el error: «Implementar INetworkSerializable». Para implementar esta interfaz, escribiría: … Granadas: Comportamiento de red, INetworkSerializable. yo no sé si [implement: …] funciona, por lo que es solo una suposición basada en su error.

nota: si aun no se resuelve tu pregunta por favor dejar un comentario y pronto lo podremos de nuevo , muchas gracias

por hoy,espero que te halla servido

Deja una respuesta