Bienvenidos a la cuarta entrega de UNET.En esta tratare de cubrir lo necesario para efectuar un disparo, como vimos en anteriores tutoriales logramos un movimiento, sincronizacion y sistema de salud funcional, aun que no de la mejor manera.En este tutorial vamos a necesitar utilizar Commandos.Bueno vamos al grano, para empezar debemos crear nuestro componente PlayerWeapon(Opcional), cabe destacar que cada juego tiene un GAME PLAY propio por lo tanto obviamos como funcionan los aspectos del mismo.
Para poder enviar un dato, como lo necesitamos en este momento, el impacto de la bala con nuestro enemigo debemos tener los datos de nuestro enemigo, una forma muy simple de poder interactuar con otro jugadores es obteniendo su ID de red. Suponiendo que tenemos nuestro sistema de Armas con el método Raycast ya listo, nos daremos cuenta que siempre obtenemos un dato de las colisiones para frente a este seguir diferentes acciones. EJ:
private void Shot()
{
Ray = Camera.Look;
RaycastHit Hit;
if(Raycast out Hit)
{
if(Hit == "Enemy")
{
Ejecuta Accion
}
}
}
Por lo genera siempre es de esta manera, bueno cuando trabajamos con networking se sigue haciendo del mismo modo. y el dato que tomamos el el ID a este lo enviamos por comando, y el servidor se encarga de aplicarle el daño en este caso.
public void Shot()
{
Codigo de Disparo por RayCast, tomamos el net id y lo enviamos por commando
Cmd_TakeDamage(hit.NetID); //EJEMPLO
}
[Command]
private void Cmd_TakeDamage(uint PlayerTake, int Damage)
{
//buscamos los jugadores que corresponden al ID,con una simple funcion
var otherp = FindPlayer(PlayerTake);
if(otherp != null)
{
//llamamos la funcion de Take!
otherp.playerHealt.HealtTake(50);
}
}
private void FindPlayer(uint ID)
{
foreach(var p in GameObject.FindObjectsOfType<PlayerControl>())
{
if(p.netId.Value = ID)
{
return p;
}
}
return null;
}
public class PlayerControl : NetworkBehaviuor
{
public PlayerHealt playerHealt;
public override void OnStartClient()
{
playerHealt = GetComponent<PlayerHealt>();
}
}
public class PlayerHealt : NetworkBehaviuor
{
[SyncVar]
int current = 100;
[Server]
internal void HealtTake(int value)
{
current -= value;
}
}
De esta simple manera tendríamos ya nuestro sistema de disparo funcionando, ahora deberíamos mejorarlo para que funcione aun mejor. !Importante¡Cuando se trata de la programación de videojuegos o aplicaciones en red uno de los temas mas importantes son los de Seguridad, cuando se trabaja con dinero real este punto se refuerza con personal altamente calificado y experimentado, quiero decir que si la idea que tienes es crear un juego Online estilo AVA u otro MFPS y aun no tienes el personal y la experiencia necesaria, entonces no lo intentes. Esta serie de Información y Tutorial es solo para lograr juegos en red simple, para poder compartir con amigos o mejor aun un simple sistema networking donde la vulnerabilidad no se un problema grave.Bueno gente, como les prometí esta es la cuarte entrega, no es el material mas detallado pero se pueden dar cuanta de la fácil implementacion que UNET nos presta en su librería de Alto Nivel para networking. Mi idea es que si alguien necesita algo mas detallado solo comente y explicare paso por paso como lograr. obvio si es que entiendo lo que necesite.No olviden visitar mi Blog!Un abrazo -. Franco
Buenas
@francoe1Tengo una pequeña duda, aunque antes de exponerla tengo que aclarar que nunca he realizado ningun intento con UNET por lo que se entiende que tampoco he probado tu codigo ... dicho eso, mi duda es si cuando realizas un tutorial compruebas que funciona;
no es como critica, solo lo digo porque hay cosas que me chocan en ese codigo que a continuacion paso a nombrarte :Lo primero que me ha llamado la atencion es la clase
health que hereda de
Player ... aunque de entrada esto no deberia provocar ningun error, tampoco tiene mucho sentido (por no decir ningun sentido). La herencia se debe utilizar cuando es necesario hacer un subgrupo perteneciente a una clase para que tenga sus propios atributos y funciones, y en este caso quiero entender (o asi seria lo logico) que el contenido de la clase health sera comun a todos los objetos de la clase Player sin excepciones a no ser que existan jugadores sin vida. Ademas, aunque como digo no deberia provocar ningun error de entrada ... si que podrian darse situaciones en que provocase errores.Lo segundo que me ha llamado la atencion si que deberia provocar un error grave siempre y se encuentra en la funcion
Cmd_TakeDamage. La primera accion que realiza esa funcion es
buscar un objeto mediante un ID que siempre devolvera un objeto de tipo Player, y en caso de que este no sea nulo deberia pretender restarle X puntos de vida ... pero en este punto,
si no estoy muy equivocado se supone que saltara error :
- En primer lugar intentas acceder a la funcion HealtTake mediante otherp.healt.HealtTake (siendo otherp siempre un objeto de tipo Player). El problema es que healt no es una propiedad de Player, si no una clase que hereda de Player que es muy distinto.
- En segundo lugar, aunque se intentara acceder a la funcion de HealTake directamente desde el objeto otherp (porque la clase healt es tambien de la clase Player) se produciria una de las posibles situaciones de error que comentaba en el primer punto ... cuando se trabaja con herencia de clases, puedes acceder a las propiedades y funciones de la clase base (siempre que estas sean public o protected), pero no a la inversa. Dicho de otra manera, desde un objeto de la clase healt podras acceder a las funciones de la clase Player pero no sucede lo mismo a la inversa.
Tal vez este equivocado y todo este rollo sea para nada porque imagino que ya lo hayas probado y te funcionara jajajaja solo lo digo como observacion por si tiene algun error y quieres corregirlo. Un saludo
Esto debería de ir en Formación, Recursos.Gracias por el aporte.
[quote author=Arthure" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35164" data-ipsquote-contentcommentid="127225">Buenas
@francoe1Tengo una pequeña duda, aunque antes de exponerla tengo que aclarar que nunca he realizado ningun intento con UNET por lo que se entiende que tampoco he probado tu codigo ... dicho eso, mi duda es si cuando realizas un tutorial compruebas que funciona;
no es como critica, solo lo digo porque hay cosas que me chocan en ese codigo que a continuacion paso a nombrarte :Lo primero que me ha llamado la atencion es la clase
health que hereda de
Player ... aunque de entrada esto no deberia provocar ningun error, tampoco tiene mucho sentido (por no decir ningun sentido). La herencia se debe utilizar cuando es necesario hacer un subgrupo perteneciente a una clase para que tenga sus propios atributos y funciones, y en este caso quiero entender (o asi seria lo logico) que el contenido de la clase health sera comun a todos los objetos de la clase Player sin excepciones a no ser que existan jugadores sin vida. Ademas, aunque como digo no deberia provocar ningun error de entrada ... si que podrian darse situaciones en que provocase errores.Lo segundo que me ha llamado la atencion si que deberia provocar un error grave siempre y se encuentra en la funcion
Cmd_TakeDamage. La primera accion que realiza esa funcion es
buscar un objeto mediante un ID que siempre devolvera un objeto de tipo Player, y en caso de que este no sea nulo deberia pretender restarle X puntos de vida ... pero en este punto,
si no estoy muy equivocado se supone que saltara error :
- En primer lugar intentas acceder a la funcion HealtTake mediante otherp.healt.HealtTake (siendo otherp siempre un objeto de tipo Player). El problema es que healt no es una propiedad de Player, si no una clase que hereda de Player que es muy distinto.
- En segundo lugar, aunque se intentara acceder a la funcion de HealTake directamente desde el objeto otherp (porque la clase healt es tambien de la clase Player) se produciria una de las posibles situaciones de error que comentaba en el primer punto ... cuando se trabaja con herencia de clases, puedes acceder a las propiedades y funciones de la clase base (siempre que estas sean public o protected), pero no a la inversa. Dicho de otra manera, desde un objeto de la clase healt podras acceder a las funciones de la clase Player pero no sucede lo mismo a la inversa.
Tal vez este equivocado y todo este rollo sea para nada porque imagino que ya lo hayas probado y te funcionara jajajaja solo lo digo como observacion por si tiene algun error y quieres corregirlo. Un saludo[/quote]A Decir verdad, para este aporte ni para anteriores realice un Debug ya que es algo muy simple.No obstante, diría que tienes absoluta razón, después de publicarlo me di cuenta de la incoherencia de las herencias pero se da a entender lo que trato de explicar. Pido disculpas de todos modos por esto y lo modificare como corresponde para que el material tenga una mejor calidad.Gracias por tu Crítica
Sólo texto |
Texto con Imágenes