Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

NameTag que mire a los otros jugadores Photon

Iniciado por Jose134, Mayo 17, 2015, 10:21:42 PM

Tema anterior - Siguiente tema
Hola, estoy trasteando con photon y me he encontrado con un problemilla, estoy intentando hacer un name tag que mire a los otros jugadores (como en minecraft y muchos otros juegos) el problema viene a asignarle hacia que objeto rotar, necesito que rote hacia el resto de jugadores,  y obviamente va a necesitar una rotacion distinta para cada jugador. Alguna idea de como empezar???

Hola, no entiendo bien el problema que planteas intenta explicarlo mejor para ver si puedo ayudarte, por que no se si lo que quieres es que por ejemplo un creeper mire al jugador cuando se acerque a x distancia, por que si ese fuese el caso es sensillo de xplicar.

Mayo 19, 2015, 03:10:41 PM #2 Ultima modificación: Mayo 19, 2015, 07:36:41 PM por Jose134
El problema que tengo es para hacer que encima de cada jugador salga su nombre, por ahora estoy usando un 3D Text (ahora estoy con el movil luego os paso el codigo), pero no funciona bien del todo y ademas tengo dudas a la hora de asignar al jugador al que mirar, ya que en cada cliente los NameTag deberan tener un target distinto
 
EDIT:
 
Parte del NetworkPlayer.cs

if(!photonView.isMine){
transform.parent.Find("NameTag").gameObject.GetComponent<NameTagLooker>().target = PhotonView.Find(PhotonNetwork.player.ID).gameObject.transform;
}

Eso esta dentro del Update, al principio lo tenia en el Start pero ya que me daba NullReferenceException en uno de los dos probe a cambiarlo, uno de los dos (no me ascuerdo si el primero que se conecta o el segundo) funcionaba pero luego al cambiar a la otra ventana dejaron de funcionar los dos. He comprobado y el Run in Background esta activado asi que no se me ocurre nada


Mayo 20, 2015, 05:56:51 AM #4 Ultima modificación: Mayo 20, 2015, 06:06:23 AM por Mackshoon
Me puse a investigar sobre como puedo mejorarlo y lo logre n.n aqui tienes.
 
colocar este en la algun Objeto este detecta los jugadores y escribe el nombre:

public var Jugadores:GameObject[]; // Almasena los Objetos de nombre.
public var Tag:String[]; // Los tags que se tomaran en cuanta para colocar los nombres.
private var P:Vector2;
function Update(){
}
function OnGUI () {
for(var x=0;x<Tag.Length;x++){
   Jugadores = GameObject.FindGameObjectsWithTag(Tag
  • );
   for(var x1=0;x1<Jugadores.Length;x1++){
      var Script:Jugador = Jugadores[x1].gameObject.GetComponent("Jugador");
      P = Camera.main.WorldToViewportPoint(Script.PNombre.position);// Busca la posicion dada en la Pantalla de la camara marcada.
      P.y += -1;P.y = -P.y;// Es para invertir los numeros ya que la mantalla superior inicia desde 0 y no la de abajo.
      // Cambias jugador por el Script donde contiene el nombre del jugador y el TextMesh o usas los mismos Scripts.
      GUI.Box(Rect(Screen.width*P.x-50/*se resta la mitad del Ancho de la GUI "50"*/,Screen.height*P.y,100,20),Script.Nombre);
   }
}
}

este es obcional este lo ise para identificar el nombre del jugador:

public var Nombre:String;
public var PNombre:Transform;

para utilizar tu script solo tienes que cambiar la variable de tipo Script.Jugador por el del script donde contengas el nombre del jugador,
y cambiar la Script.Nombre por la variable que contenga el nombre y Script.PNombre por la variable que contenga el transform con la posicion donde va el nombre.
 
aqui la demo actualizada http://www.mediafire.com/download/s81ta5qs41bcacc/MostrarNombres.unitypackage" rel="external nofollow">http://www.mediafire.com/download/s81ta5qs41bcacc/MostrarNombres.unitypackage
 
Espero y te sirva n.n
 
 
EDITO:
 
  Con este script no nesesitaras rotar los Nombres ya que crea una GUI con el nombre.


Mayo 21, 2015, 12:43:41 PM #6 Ultima modificación: Mayo 21, 2015, 12:48:02 PM por Jose134
Hola de nuevo, me he encontrado con un problemilla...
 
el caso es que el NameTag tambien se muestra si miras hacia la direccion contraria, no tengo ni idea de por que
 
os dejo una screenshot (se ve "rara" porque salen los dos monitores) y el script que hice a partir del que mackshoon me dio
 

 
como se puede ver, en unity sale el NameTag de Player2 pero en la otra ventana se ve que Player2 esta detras del Player1
 
NameTagLooker.cs

using UnityEngine;
using System.Collections;
public class NameTagLooker : Photon.MonoBehaviour {
public Vector3 offset = new Vector3(0,2,0);
[RPC]
void OnGUI () {
   if(!photonView.isMine){
      Vector3 textPos = Camera.main.WorldToScreenPoint(transform.position + offset);
      textPos.y = Screen.height - textPos.y;
      GUI.Box(new Rect(textPos.x - 50,textPos.y,100,20), "" + photonView.owner.name);
   
   }
}
}

Lol no sabia que pasa eso ya lo probe y me pasa igual, perdona la tardanza es que no estaba en casa xD.
 
Lo que tienes que hacer para corregir el error es usar OnBecameVisible() para activar el script cuando se puede ver y OnBecameInvisible() para desactivarlo cuando no se ve en la camara, lo malo y bueno desde cada punto de vista xD es que al bloquearse con un objeto se oculta la etiqueta.

Mayo 23, 2015, 03:14:43 PM #8 Ultima modificación: Mayo 23, 2015, 03:15:34 PM por Mackshoon
O simplemente usas un Raycast para confirmar que este frente a la camara... espero y mi respuesta no aya llegado tarde xD.
 
no edite la anterior por que no se quiso editar D:! y no se la razon...

muchas gracias me pondre con ello. No conocia el OnBecameVisible() en fin todos los dias se aprende algo nuevo (incluso los findes xD)

Etiquetas: