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