Entidad 3D :: Creación de juegos en 3D sin programar

Foro de Entidad 3D
 
PortalÍndiceBuscarMiembrosGrupos de UsuariosFAQChatAnalisisRegistrarseConectarse
. . . . . . . . . . . . . . . . . . . . . . . .
Visita el sitio oficial de Entidad 3D para descargar la última versión!
Si encuentras un bug en la útlima versión de Entidad 3D, comunícaselo directamente al autor de Entidad 3D, Jordi Perez via correo electronico. Si no estás seguro si es un bug o no, consúltalo con la gente del foro!
Si eres un usuario nuevo preséntate en el subforo de saludos y despedidas para asegurar tu cuenta! (Los usuarios que tengan 0 mensajes pasados los primeros 10 días de creada su cuenta serán eliminados como política de limpieza del foro)

Comparte | 
 

 unity 3d multiplayer

Ver el tema anterior Ver el tema siguiente Ir abajo 
AutorMensaje
estantaya
Avanzado
Avanzado
avatar

Último Juego : Sur Survival
Sexo : Masculino
Mensajes : 273
Edad : 30
Localización : Mi casa

MensajeTema: unity 3d multiplayer   Dom Ago 13, 2017 10:12 pm

[Tienes que estar registrado y conectado para ver esa imagen]
Estube programando esto:
estantaya.itch.io/no-citizens-sky
sera un sandbox
por ahora hay:
personaje con movimiento wasd y mouse
crear una partida
lista de partidas online
comunicación por voz
objetos que se pueden agarrar y soltar con f
este es el script principal multiplayer:
Código:
//menu.js by estantaya 2017
/*
enum E_QUERY {
 SESSION_UPDATE,
 SESSION_DEL,
 HOST_LIST,
 HOST_IP,
 HOST_NEW,
 HOST_UPDATE,
 HOST_DEL
}
*/
enum E_EVT {
 NADA,
 QUERY,
 HOST_LIST,
 HOST,//CREAR HOST
 HOST_INFO,//INFO DE HOST
 CONN,//CONECTARSE A UN SERVER
 MENU,
 EXIT
}

enum E_TAG {
 LABEL,
 BUTTON,
 BOX,
 TOGGLE,
 ENTRADA,
 SLIDER
}

enum E_ALIGN {
 LEFT,
 CENTER,
 RIGHT
}

/*
class Texto extends String {
 //var texto:Texto;
 //var titulo:String;
 //var texto:String;
 var paginas:Pagina[];
}
*/

//HudItem usado para listar en un menu elementos 3d
class HudItem {
 var instance:Renderer;
 var pos:Vector3;
 var size:Vector2;
 var name:String;
 //var centerBound:Vector3;
 //function HudItem(i:Transform,c:Vector3) {
 function HudItem(n:String,r:Renderer) {
 instance=r;
 //name=r.gameObject.tag;
 name=n;
 //centerBound=c;
 }
}

class Tag {
 var nombre:String;
 var enabled=true;
 var eTag:E_TAG;
 var evt:E_EVT;
 //var pTag:int;
 //var texto:Texto[];
 var texto:String;
 //var activo:boolean;
 var sValor:String;
 var fValor:float;
 var bValor:boolean;
 //var slider:float;
 //label
 function Tag(txt:String) {
 eTag=E_TAG.LABEL;
 texto=txt;
 //activo=false;
 }
 //SupportsRenderTextureFormat,
 //modificable label
 function Tag(n:String,txt:String) {
 nombre=n;
 eTag=E_TAG.LABEL;
 texto=txt;
 }
 //input
 function Tag(n:String,txt:String,v:String) {
 nombre=n;
 eTag=E_TAG.ENTRADA;
 texto=txt;
 sValor=v;
 }
 //slider
 function Tag(n:String,txt:String,v:float) {
 nombre=n;
 eTag=E_TAG.SLIDER;
 texto=txt;
 fValor=v;
 }
 //toggle
 function Tag(n:String,txt:String,v:boolean) {
 nombre=n;
 eTag=E_TAG.TOGGLE;
 texto=txt;
 bValor=v;
 }
 //boton
 /*
 function Tag(txt:String,ev:E_EVT) {
 eTag=E_TAG.BUTTON;
 texto=txt;
 evt=ev;
 //activo=false;
 }
 */
 //boton
 function Tag(txt:String,ev:E_EVT,v:String) {
 eTag=E_TAG.BUTTON;
 texto=txt;
 evt=ev;
 sValor=v;
 }
 /*function Render() {
 switch(this.eTag) {
 case E_TAG.LABEL:
 GUILayout.Label(this.texto);
 break;
 case E_TAG.BUTTON:
 if (GUILayout.Button(this.texto)) ;
 break;
 }
 }*/
}

class Tabla {
 var nombre="";
 var space=false;
 //float ...
 var horizontal=false;
 var align:E_ALIGN=E_ALIGN.LEFT;
 //var vertical:boolean;
 var tags:Tag[];//hojas
 var tablas:Tabla[];//ramas
 //texto
 function Tabla(n:String,t:Tag[]) {
 nombre=n;//tag array para modificar por script
 horizontal=false;
 align=E_ALIGN.CENTER;
 tags=t;
 }
 //tablas
 function Tabla(t:Tabla[]) {
 horizontal=true;
 align=E_ALIGN.CENTER;
 tablas=t;
 }
 //tablas
 function Tabla(f:boolean,t:Tabla[]) {
 space=f;
 align=E_ALIGN.CENTER;
 tablas=t;
 }
 //parrafos
 function Tabla(h:boolean,a:E_ALIGN,t:Tag[]) {
 horizontal=h;
 align=a;
 tags=t;
 }
 //tablas
 function Tabla(h:boolean,a:E_ALIGN,ta:Tabla[]) {
 horizontal=h;
 align=a;
 tablas=ta;
 }
 //formulario
 function Tabla(h:boolean,a:E_ALIGN,c:Tag[],t:Tabla[]) {
 horizontal=false;
 align=E_ALIGN.LEFT;
 tags=c;
 tablas=t;
 }
 //function Mostrar(evt:Evento) {
 function Mostrar(evt:Evento) {
 //var evTag:Tag=new Tag("null");
 //null
 //principio
 if (this.horizontal) GUILayout.BeginHorizontal();
 else GUILayout.BeginVertical();
 if (this.align>0) GUILayout.FlexibleSpace();//1,2
 //contenido hojas
 if (this.tags!=null) {
 //if (tags.length>0) {
 
 //woah
 
 for (var t:Tag in this.tags) {
 if (!t.enabled) GUI.enabled=false;
 switch(t.eTag) {
 case E_TAG.LABEL:
 GUILayout.Label(t.texto);
 break;
 case E_TAG.ENTRADA:
 GUILayout.Label(t.texto);
 t.sValor=GUILayout.TextField(t.sValor,GUILayout.Width(128));
 break;
 case E_TAG.SLIDER:
 GUILayout.Label(t.texto);
 if (!this.horizontal) t.fValor=GUILayout.VerticalSlider(t.fValor,0,1,GUILayout.Height(128));
 else t.fValor=GUILayout.HorizontalSlider(t.fValor,0,1,GUILayout.Width(128));
 break;
 case E_TAG.TOGGLE:
 t.bValor=GUILayout.Toggle(t.bValor,t.texto);
 break;
 case E_TAG.BUTTON:
 //if (GUILayout.Button(t.texto)) Event;
 if (GUILayout.Button(t.texto)) {
 //evTag=t;
 evt.tipo=t.evt;
 evt.texto=t.sValor;
 //con un Hashtable podria devolver valores de diferente tipo
 //argumentos
 //evt.tag=t;
 //t.activo=!t.activo;
 }
 //GUILayout.Button(t.texto);
 break;
 }
 if (!GUI.enabled) GUI.enabled=true;
 }
 }
 //contenido ramas
 if (this.tablas!=null) {
 for (var t:Tabla in this.tablas) {
 /*
 if (this.vertical) GUILayout.BeginVertical();
 if (this.vertical) GUILayout.EndVertical();
 */
 //evTag=t.Mostrar();
 t.Mostrar(evt);//evt colector de evento
 }
 }
 if (this.align<2) GUILayout.FlexibleSpace();//0,1
 //fin
 if (this.horizontal) GUILayout.EndHorizontal();
 else GUILayout.EndVertical();
 //return evTag;
 }
 
 function Geti(args:String[]) {
 if (args[1]=="null") {
 if (this.tags!=null) {
 for (var a:Tag in this.tags) {
 //a.Get(args);
 //if (args[1]!="") break;
 if (a.nombre==null) continue;
 if (a.nombre==args[0]) {
 if (a.eTag==E_TAG.SLIDER) {
 args[1]=""+a.fValor;
 } else if (a.eTag==E_TAG.TOGGLE) {
 if (a.bValor) args[1]="True";
 else args[1]="False";
 } else args[1]=a.sValor;
 //Debug.Log(a.texto);
 break;
 }
 }
 }
 }
 
 if (args[1]=="null") {
 if (this.tablas!=null) {
 for (var a:Tabla in this.tablas) {
 a.Geti(args);
 if (args[1]!="null") break;
 }
 }
 }
 }
 
 function Seti(parrafo:String,lineas:Array) {
 if (this.nombre==parrafo) {
 tags=lineas.ToBuiltin(Tag);
 parrafo="";
 }
 }
 
 function Textos(id:String,txt:String) {
 if (this.tags!=null) {
 for (var t:Tag in this.tags) {
 if (t.nombre==id) {
 if (txt=="False") {
 t.enabled=false;
 t.sValor="";
 } else {
 t.enabled=true;
 t.texto=txt;
 }
 id="";
 return;
 //break;
 }
 }
 }
 if (this.tablas!=null) {
 for (var tabla:Tabla in this.tablas) {
 tabla.Textos(id,txt);
 if (id=="") return;
 //if (id=="") break;
 }
 }
 }
 
}

class Area {
 var nombre:String;
 var visible:boolean;
 var area:Rect;
 //var skin:GUISkin;
 var style:String;
 var scroll:boolean;
 var scrollPosition:Vector2;
 //var contenido:Tabla;
 var tablas:Tabla[];
 var areas:Area[];
 //var tags:Tag[];
 //div
 function Area(n:String,r:Rect,s:String,v:boolean,c:Tabla[]) {
 nombre=n;
 area=r;
 //skin=s;
 style=s;
 visible=v;
 //contenido=c;
 tablas=c;
 }
 //pagina
 function Area(v:boolean,r:Rect,ar:Area[]) {
 visible=v;
 area=r;
 areas=ar;
 }
 //marco
 function Area(r:Rect,c:Tabla[],ar:Area[]) {
 visible=true;
 area=r;
 //contenido=c;
 tablas=c;
 areas=ar;
 }
 function Read(evt:Evento) {
 if (!this.visible) return;
 GUILayout.BeginArea(this.area,GUI.skin.GetStyle(this.style));
 if (this.scroll) this.scrollPosition = GUILayout.BeginScrollView (this.scrollPosition);
 
 if (evt.tipo==E_EVT.NADA) evt.area=this;//no paso nada, guardar area
 //this.contenido.Mostrar(evt);
 //evt colector de evento
 if (this.tablas!=null) {
 for (var tabla:Tabla in this.tablas) {
 /*
 if (this.vertical) GUILayout.BeginVertical();
 if (this.vertical) GUILayout.EndVertical();
 */
 if (tabla.space) GUILayout.FlexibleSpace();
 tabla.Mostrar(evt);
 }
 }
 //Command(this.contenido.Mostrar());
 //var evTag:Tag=new Tag("null");
 //null
 
 //if (evt.tipo!=E_EVT.NADA) evt.area=this;
 //paso algo en esta area
 //Command(evTag);
 if (this.areas!=null) {
 for (var a:Area in this.areas) {
 if (!a.visible) continue;
 a.Read(evt);
 }
 }
 if (this.scroll) GUILayout.EndScrollView();
 GUILayout.EndArea();
 }
 //function Display(n:String,v:boolean) {
 function Display(n:String) {
 //if (this.nombre==n) this.visible=true;
 //else this.visible=false;
 if (this.areas!=null) {
 for (var a:Area in this.areas) {
 //a.Display(n,v);
 //a.Display(n);
 if (a.nombre==n) a.visible=true;
 else a.visible=false;
 }
 }
 }
 
 function Get(args:String[]) {
 if (args[1]=="null") {
 /*if (this.contenido!=null) {
 contenido.Geti(args);
 }*/
 if (this.tablas!=null) {
 for (var tabla:Tabla in this.tablas) {
 tabla.Geti(args);
 }
 }
 }
 if (args[1]=="null") {
 if (this.areas!=null) {
 for (var a:Area in this.areas) {
 a.Get(args);
 if (args[1]!="null") break;
 }
 }
 }
 }
 
 function Set(parrafo:String,lineas:Array) {
 /*if (this.contenido!=null) {
 contenido.Seti(parrafo,lineas);
 }*/
 if (this.tablas!=null) {
 for (var tabla:Tabla in this.tablas) {
 tabla.Seti(parrafo,lineas);
 }
 }
 if (parrafo=="") return;
 if (this.areas!=null) {
 for (var a:Area in this.areas) {
 a.Set(parrafo,lineas);
 if (parrafo=="") break;
 }
 }
 }
 
 function Texto(id:String,txt:String) {
 /*if (this.contenido!=null) {
 contenido.Seti(parrafo,lineas);
 }*/
 if (this.tablas!=null) {
 for (var tabla:Tabla in this.tablas) {
 tabla.Textos(id,txt);
 if (id=="") return;
 //if (id=="") break;
 }
 }
 if (id=="") return;
 if (this.areas!=null) {
 for (var a:Area in this.areas) {
 a.Texto(id,txt);
 if (id=="") break;
 }
 }
 }
 
 /*
 function Get(n:String) {
 if (this.areas!=null) {
 for (var a:Area in this.areas) {
 for (var b:Tag in this.tags) {
 
 }
 }
 }
 return "";
 }*/
}

class Evento {
 //var tipo=
 var tipo:E_EVT=E_EVT.NADA;
 var texto:String="";
 //var tag:Tag;
 var area:Area;
}

 /*
 function Parse(param:String,valor:String) {
 
 var False:byte=1>>0;//false
 
 }
 */
/*
class Sesion {
 var cliente:int;//in
 var mensaje:String;//in
 var status:String;//out
 var hostList:Partida[];//in
}

class Partida {
 var nombre:String;
 var masterId:int;
 var sesId:int;
 var ip:String;
 var port:int;
 var slots:int;
 var password:String;
}
*/
//var titulo:String;

//var documento:Tag[];
//var documento:Tag;

//var jugadores:Transform[];
var jugadores:Hashtable;
//var nviews:Hashtable;
var modelPlayer:Transform;
var model:Transform;
var jugador:Transform;
var sistemaSolar:Transform[];
var objetos:Transform[];
private var agarrando=-1;
//var jugadorId:int;

var zskin:GUISkin;
var menu=false;
//var mouseH:MouseLook;
//var mouseV:MouseLook;
var mouseH:MonoBehaviour;
var mouseV:MonoBehaviour;
var personaje:MonoBehaviour;
var player_layer:LayerMask;
var camara:Camera;

//items
var hudLabelAnchoMax=300;
var distanciaItems=3.0;
private var hudItems:HudItem[];

var server:String;
var clientCode:String;
//var ses:Sesion;
var sesion:Hashtable;//:o
var partidas:Hashtable[];//primera vez definiendo hashtables
private var documento:Area;
private var partidaSelect=0;
private var connection=0;
private var mensaje="";
private var server_publico:boolean;

//private var evt=[E_EVT.NADA,""];
//null
private var evt:Evento;//null

private var arrTags:Array;
private var arrPartidas:Array;

function Agarrar(t:Transform) {
 for (var i=0;i<objetos.length;i++) {
 if (objetos[i]==t) {
 agarrando=i;
 break;
 }
 }
}

function Soltar() {
 agarrando=-1;
}

function Start() {
 
 arrTags=new Array();
 arrPartidas=new Array();
 
 //partidas=new Hashtable;
 
 //items-------------------------
 /*
 var renders:Object[]= FindObjectsOfType (Renderer);
 var a:Array=new Array();
 for (var r:Renderer in renders) {
 a.Add(new HudItem(r));
 }
 */
 
 sesion=new Hashtable();
 sesion["instancia"]=PlayerPrefs.GetInt("instancia");
 PlayerPrefs.SetInt("instancia",sesion["instancia"]+1);
 jugadores=new Hashtable();
 
 if (PlayerPrefs.HasKey("client")) {
 //var www : WWW = new WWW ("https://zurvivepvp.000webhostapp.com/pvp/server.php?z7query="+proc+params);
 //yield www;
 //sesion[];
 sesion["client"]=PlayerPrefs.GetString("client");
 Query("auth");
 }
 
 var rigids:Object[]= FindObjectsOfType (Rigidbody);
 var a:Array=new Array();
 for (var rigid:Rigidbody in rigids) {
 var renders:Component[]=rigid.transform.GetComponentsInChildren(Renderer);
 for (var r:Renderer in renders) {
 a.Add(new HudItem(rigid.name,r));
 }
 }
 if (a.length>0) hudItems=a.ToBuiltin(HudItem);
 
 
 //gui -----------------------------
 /*
 documento.areas["body"]=new Area(Rect(20,20,Screen.width-40,Screen.height-40));
 documento.tablas["menu"]=new Tabla("body");
 documento.tags["hosts"]=new Tag("menu");
 documento.tags["new_host"]=new Tag("menu");
 documento.tags["config"]=new Tag("menu");
 documento.tags["exit"]=new Tag("menu");
 */
 documento=new Area(
 "Body",Rect(20,20,Screen.width-40,Screen.height-40),"box",true,
 [new Tabla(true,E_ALIGN.CENTER,[
 new Tag("Partidas",E_EVT.HOST_LIST,""),
 new Tag("Crear Partida",E_EVT.MENU,"new_host"),
 new Tag("Configuración",E_EVT.MENU,"config"),
 new Tag("Salir",E_EVT.EXIT,"")
 ])]
 );
 documento.areas=[
 new Area(
 "hosts",Rect(0,100,documento.area.width,documento.area.height-100),"label",false,
 [
 new Tabla("host_list",[new Tag("No hay partidas.")]),
 new Tabla(
 true,[
 new Tabla(
 true,E_ALIGN.CENTER,[
 new Tag("remote_ip","IP:","localhost")
 ]
 ),
 new Tabla(
 true,E_ALIGN.CENTER,[
 //new Tag("Puerto: "),
 new Tag("remote_port","Puerto:","25000")
 ]
 ),
 new Tabla(
 true,E_ALIGN.CENTER,[
 new Tag("Conectar",E_EVT.CONN,"directa")
 ]
 )
 ]
 )
 ]
 ),
 new Area(
 "new_host",Rect(0,100,documento.area.width,documento.area.height-100),"label",false,
 [
 new Tabla(
 false,E_ALIGN.CENTER,[
 new Tabla(
 true,E_ALIGN.CENTER,[
 new Tag("host_name","Nombre de partida:","")
 ]
 ),
 new Tabla(
 true,E_ALIGN.CENTER,[
 new Tag("host_port","Puerto Local:","25000")
 ]
 ),
 new Tabla(
 true,E_ALIGN.CENTER,[
 new Tag("host_slots","Cantidad de jugadores:","100")
 ]
 ),
 new Tabla(
 true,E_ALIGN.CENTER,[
 new Tag("host_password","Establecer contraseña:","")
 ]
 ),
 new Tabla(
 true,E_ALIGN.CENTER,[
 new Tag("server_publico","Server Público",true),
 new Tag("Crear Partida",E_EVT.HOST,"")
 ]
 )
 ]
 )
 ]
 ),
 new Area(
 "config",Rect(0,100,documento.area.width,documento.area.height-100),"label",false,
 [new Tabla(false,E_ALIGN.CENTER,[new Tag(":v")])]
 ),
 new Area(
 "server_panel",Rect(0,100,documento.area.width,documento.area.height-100),"label",false,
 [new Tabla(false,E_ALIGN.CENTER,[new Tag("Esperando conecciones...")])]
 ),
 new Area(
 "lobby",Rect(0,100,documento.area.width,documento.area.height-100),"label",false,
 [
 new Tabla(
 false,E_ALIGN.CENTER,[
 new Tabla(
 true,E_ALIGN.CENTER,[
 new Tag("Nombre de partida:"),
 new Tag("partida_name","")
 ]
 ),
 new Tabla(
 true,E_ALIGN.CENTER,[
 new Tag("Jugadores conectados:"),
 new Tag("partida_jugadores","")
 ]
 ),
 new Tabla(
 true,E_ALIGN.CENTER,[
 new Tag("Capacidad:"),
 new Tag("partida_slots","")
 ]
 ),
 new Tabla(
 true,E_ALIGN.CENTER,[
 new Tag("partida_password","Contraseña:","")
 ]
 ),
 new Tabla(
 true,E_ALIGN.CENTER,[
 new Tag("Entrar",E_EVT.CONN,"")
 ]
 )
 ]
 )
 ]
 )
 ];
 //evt=new Evento(E_EVT.NADA,"",documento);
 evt=new Evento();
 evt.tipo=E_EVT.NADA;
 evt.texto="";
 //evt.tag;
 evt.area=documento;
}

function OnSerializeNetworkView(str : BitStream, info : NetworkMessageInfo) {
 //esto se ejecuta Network.sendRate de veces por segundo
 //if (Network.isServer) {
 //servidor
 
 //es lo mismo para todos
 var sesLargo:int;
 var miObj:int;
 var ses:char[];
 var mPos:Vector3;
 var mRot:Quaternion;
 var clientName:String;
 if (str.isWriting) {
 //ESCRIBIR
 //enviar id
 //enviar pos, rotation model
 //enviar audio id y data
 //-------------UPLOAD---------------
 clientName=sesion["client"]+"_"+sesion["instancia"];
 //ses=new char[clientName.length];
 //sesId=int.Parse(sesion["client"]);
 sesLargo=clientName.length;
 str.Serialize(sesLargo);
 ses=new char[sesLargo];
 for (var i=0;i<sesLargo;i++) {
 ses[i]=clientName[i];
 str.Serialize(ses[i]);
 }
 mPos=model.position;
 str.Serialize(mPos);
 mRot=model.rotation;
 str.Serialize(mRot);
 //str.Serialize(sendAudioScript.secuencia);
 miObj=agarrando;
 str.Serialize(miObj);
 if (agarrando!=-1) {
 mPos=objetos[miObj].position;
 str.Serialize(mPos);
 mRot=objetos[miObj].rotation;
 str.Serialize(mRot);
 }
 /*
 for (var obj:Transform in objetos) {
 mPos=obj.position;
 str.Serialize(mPos);
 mRot=obj.rotation;
 str.Serialize(mRot);
 }
 */
 if (Network.isServer) {
 for (var sis:Transform in sistemaSolar) {
 mPos=sis.position;
 str.Serialize(mPos);
 mRot=sis.rotation;
 str.Serialize(mRot);
 }
 }/* else {
 miObj=agarrando;
 str.Serialize(miObj);
 }*/
 }
 if (str.isReading) {
 //LEER
 //recibir id
 //modificar un model
 //audio id
 //reproducir audio si hubiera
 //-------------DOWNLOAD------------
 str.Serialize(sesLargo);
 ses=new char[sesLargo];
 for (var j=0;j<sesLargo;j++) {
 str.Serialize(ses[j]);
 clientName+=""+ses[j];
 }
 //Debug.Log(clientName);
 if (jugadores.Contains(clientName)) {
 //Debug.Log("aarr"); j :v
 /*str.Serialize(jugadores[sesId].position);
 str.Serialize(jugadores[sesId].rotation);*/
 str.Serialize(mPos);
 jugadores[clientName].position=mPos;
 str.Serialize(mRot);
 jugadores[clientName].rotation=mRot;
 }
 str.Serialize(miObj);
 if (miObj!=-1) {
 str.Serialize(mPos);
 objetos[miObj].position=mPos;
 str.Serialize(mRot);
 objetos[miObj].rotation=mRot;
 }
 /*
 for (var obj:Transform in objetos) {
 str.Serialize(mPos);
 obj.position=mPos;
 str.Serialize(mRot);
 obj.rotation=mRot;
 }
 */
 if (Network.isClient) {
 for (var sis:Transform in sistemaSolar) {
 str.Serialize(mPos);
 sis.position=mPos;
 str.Serialize(mRot);
 sis.rotation=mRot;
 }
 }/* else {
 str.Serialize(miObj);
 misObjetos[clientName]=miObj;
 }*/
 //stream.Serialize(jugadores[jugadorId].audio);
 }
 //Debug.Log(info.timestamp);
}

function OnPlayerConnected(p:NetworkPlayer) {
 if (server_publico) Query("updatePartida&partidaId="+sesion["host"]+"&jugadores="+Network.connections.length);
 //var viewID=Network.AllocateViewID();
 //networkView.RPC("SetView", p, networkView.viewID);
}

function OnServerInitialized() {
 jugador.position=Vector3((Random.value-0.5)*50,0.1,(Random.value-0.5)*50);
 //var viewID=Network.AllocateViewID();
 //networkView.viewID=viewID;
 //networkView.RPC("SetView", RPCMode.OthersBuffered,viewID,Network.player);
 //networkView.RPC("SetView", RPCMode.OthersBuffered,viewID);
 networkView.RPC("SpawnPlayer", RPCMode.OthersBuffered,networkView.viewID,sesion["client"]+"_"+sesion["instancia"]);
}

@RPC
function SetView(viewID : NetworkViewID) {
 networkView.viewID=viewID;
}

function OnConnectedToServer() {
 for (var o:Transform in objetos) {
 var rigids:Component[]=o.GetComponentsInChildren(Rigidbody);
 for (var ri:Rigidbody in rigids) {
 ri.isKinematic=true;//solo el server simula fisica
 }
 
 }
 GetComponent(orbitas).enabled=false;
 jugador.position=Vector3((Random.value-0.5)*50,0.1,(Random.value-0.5)*50);
 var viewID=Network.AllocateViewID();
 //networkView.viewID=viewID;
 var nview:NetworkView = gameObject.AddComponent(NetworkView);
 nview.observed=this;
 nview.viewID=viewID;
 networkView.RPC("SpawnPlayer", RPCMode.OthersBuffered,viewID,sesion["client"]+"_"+sesion["instancia"]);
}

@RPC
//function SpawnPlayer(viewID:NetworkViewID,c:String) {
function SpawnPlayer(viewID:NetworkViewID,c:String) {
 Debug.Log("nuevo jugador");
 jugadores[c]=Instantiate(modelPlayer);
 if (viewID!=networkView.viewID) {
 var nview:NetworkView = gameObject.AddComponent(NetworkView);
 nview.observed=this;
 nview.viewID=viewID;
 }
 //networkView.viewID=viewID;
 //jugadores[c].gameObject.layer=LayerMask.NameToLayer("Octree Atmosfera");
}

function OnDisconnectedFromServer() {
 if (!Network.isServer) networkView.RPC("BorrarPlayer", RPCMode.Others,sesion["client"]+"_"+sesion["instancia"]);
}

@RPC
function BorrarPlayer(c:String) {
 Destroy(jugadores[c]);
 jugadores.Remove(c);
}

function OnPlayerDisconnected() {
 if (server_publico) Query("updatePartida&partidaId="+sesion["host"]+"&jugadores="+Network.connections.length);
}

function Update() {
 if (Input.GetKeyDown(KeyCode.Escape)) {
 menu=!menu;
 mouseH.enabled=!menu;
 mouseV.enabled=!menu;
 Screen.showCursor=menu;
 Screen.lockCursor = !menu;
 personaje.enabled=!menu;
 }
}

function OnGUI() {
 for (var hudItem:HudItem in hudItems) {
 hudItem.pos=camara.WorldToViewportPoint(hudItem.instance.bounds.center);
 if (hudItem.pos.x>0&&hudItem.pos.x<1&&hudItem.pos.y>0&&hudItem.pos.y<1&&hudItem.pos.z<20&&hudItem.pos.z>0) {
 //redondear distancia por 100
 var alpha:float=1;
 if (hudItem.pos.z>distanciaItems-1) alpha=distanciaItems-hudItem.pos.z;
 GUI.color=Color(1,1,1,alpha);
 var con:GUIContent=GUIContent(hudItem.name+" Distancia: 00.00"); //la distancia maxima es 20 asi que :v
 hudItem.size=GUI.skin.box.CalcSize(con);/*/64;//redondear el tamaño por 32 para que no joda tanto cambiando de tamaño
 hudItem.size=Vector2(Mathf.Ceil(hudItem.size.x),Mathf.Ceil(hudItem.size.y))*64;*/
 hudItem.pos.z=Mathf.FloorToInt(hudItem.pos.z*100)/100.0;
 con.text=hudItem.name+" Distancia: "+hudItem.pos.z;
 var scale=hudLabelAnchoMax/hudItem.size.x;
 hudItem.pos.x*=Screen.width;
 hudItem.pos.y=Screen.height-Screen.height*hudItem.pos.y;
 //var pivot:Vector2=GUIUtility.ScreenToGUIPoint(Vector2(hudItem.pos.x,hudItem.pos.y));
 var pivot:Vector2=Vector2(hudItem.pos.x,hudItem.pos.y);
 hudItem.pos.x-=hudItem.size.x*0.5;
 hudItem.pos.y-=hudItem.size.y*0.5;
 if (scale<1) GUIUtility.ScaleAroundPivot(Vector2(scale,scale),pivot);
 GUI.Box(Rect(hudItem.pos.x,hudItem.pos.y,hudItem.size.x,hudItem.size.y),con);
 if (scale<1) {
 scale=hudItem.size.x/hudLabelAnchoMax;
 GUIUtility.ScaleAroundPivot(Vector2(scale,scale),pivot);
 }
 //GUI.Label(Rect(hudItem.pos.x*Screen.width,Screen.height-Screen.height*hudItem.pos.y,hudItem.size.x,hudItem.size.y),con,style);
 }
 }
 GUI.backgroundColor=Color(0.4,0.2,0.3,0.7);
 GUI.color=Color.white;
 GUI.skin=zskin;
 if (menu) {
 documento.Read(evt);
 Ev();
 if (connection==1) GUILayout.Label("Cargando...");
 else if (connection==-1) GUILayout.Label("[ERROR]"+sesion["error"]);
 }
 /*
 for (var ar:Area in documento["body"].areas.Values) {
 GUILayout.BeginArea();
 for (var ta:Tabla in ar.tablas.Values) {
 if (this.horizontal) GUILayout.BeginHorizontal();
 else GUILayout.BeginVertical();
 for (var tg:Tag in ta.tags.Values) {
 GUILayout.BeginArea();
 GUILayout.BeginArea();
 }
 if (this.horizontal) GUILayout.EndHorizontal();
 else GUILayout.EndVertical();
 }
 GUILayout.BeginArea();
 }
 */
 
 //evt=[E_EVT.NADA,""];
 //null
 /*while () {
 Render(documento);
 }*/
 /*
 for (var t:Tag in documento) {
 if (!t.visible) continue;
 switch(t.eTag) {
 case E_TAG.BUTTON:
 
 break;
 }
 }
 */
 
}

function Get(n:String) {
 var args=[n,"null"];
 documento.Get(args);
 return args[1];
}

function Ev() {
 
 //function Command(t:Tag) {
 if (evt.tipo==E_EVT.NADA) return;
 switch(evt.tipo) {
 case E_EVT.QUERY:
 //Debug.Log("Conectarse al master server");
 //Query(E_QUERY);
 Query(evt.texto);
 break;
 case E_EVT.HOST_LIST:
 documento.Display("hosts");
 Query("partidas");
 break;
 case E_EVT.HOST:
 Debug.Log("Crear server");
 if (Get("server_publico")=="True") {
 Query("newPartida");
 server_publico=true;
 } else server_publico=false;
 documento.Display("server_panel");
 //area c:
 //if () Network.incomingPassword = "HolyMoly";
 var pw=Get("host_password");
 if (pw!="") Network.incomingPassword = pw;
 Network.InitializeServer(int.Parse(Get("host_slots")),int.Parse(Get("host_port")));
 break;
 case E_EVT.HOST_INFO:
 if (evt.texto!="") partidaSelect=int.Parse(evt.texto);
 //Debug.Log("Host("+evt.texto+") info, nombre:"+partidas[partidaSelect]["nombre"]);
 Query("host&sesId="+partidas[partidaSelect]["sesionId"]);
 //crear lobby
 documento.Texto("partida_name",partidas[partidaSelect]["nombre"]);
 documento.Texto("partida_jugadores",partidas[partidaSelect]["jugadores"]);
 documento.Texto("partida_slots",partidas[partidaSelect]["slots"]);
 if (partidas[partidaSelect]["password"]=="") documento.Texto("partida_password","False");
 else documento.Texto("partida_password","");
 documento.Display("lobby");//area c:
 //Network.InitializeServer();
 break;
 case E_EVT.CONN:
 if (evt.texto!="directa") {
 Debug.Log("Conectar con partida: "+partidas[partidaSelect]["nombre"]+
 ", ip:"+partidas[partidaSelect]["ip"]+", port:"+partidas[partidaSelect]["port"]);
 
 if (partidas[partidaSelect]["password"]=="") Network.Connect(Get("remote_ip"),int.Parse(Get("remote_port")));
 else if (Get("partida_password")==partidas[partidaSelect]["password"]) {
 Network.Connect(partidas[partidaSelect]["ip"],int.Parse(partidas[partidaSelect]["port"]),partidas[partidaSelect]["password"]);
 } else {
 sesion["error"]="Contraseña incorrecta";
 connection=-1;
 }
 
 } else {
 Debug.Log("Conección directa, ip:"+Get("remote_ip")+" port:"+Get("remote_port"));
 
 Network.Connect(Get("remote_ip"),int.Parse(Get("remote_port")));
 }
 
 //Network.InitializeServer();
 break;
 case E_EVT.MENU:
 evt.area.Display(evt.texto);//area c:
 //Debug.Log("Mostrar "+evt.texto);
 break;
 case E_EVT.EXIT:
 Application.Quit();
 break;
 }
 evt.tipo=E_EVT.NADA;
 //}
 
}

function Query(proc:String) {
 
 if (connection==1) return;
 connection=1;//1 download, 2 lag, 0 idle, -1 error
 
 sesion["error"]="";
 var params="";
 
 if (proc=="auth") params="&nombre="+System.Environment.UserName;
 else if (proc=="partidas") {
 //arrTags.Add();
 /*
 if (partidas==null) {
 arrTags.Add(new Tag("Cargando..."));
 documento.Set("host_list",arrTags);
 arrTags=new Array();
 }
 */
 //arrPartidas=new Array();
 params="&by=id";//DESC = del ultimo al primero, ASC = viceversa
 params+="&order=DESC";//DESC = del ultimo al primero, ASC = viceversa
 params+="&offset=0";
 //params+="&max=10";
 params+="&limit=10";
 } else if (proc=="newPartida") {
 params+="&name="+[Tienes que estar registrado y conectado para ver este vínculo]
 params+="&port="+int.Parse(Get("host_port")+" " );
 params+="&slots="+int.Parse(Get("host_slots")+" ");
 params+="&password="+[Tienes que estar registrado y conectado para ver este vínculo]
 }
 
 if (sesion.Contains("client")) params+="&client="+sesion["client"];
 
 var www : WWW = new WWW (server+"?"+clientCode+"="+proc+params);
 
 Debug.Log(www.url);
 yield www;
 //Debug.Log(www.url);
 Debug.Log(www.data);
 connection=-1;
 
 if (www.error!=null) {
 sesion["error"]=www.error;
 Debug.Log("[ERROR]"+sesion["error"]);
 } else {
 var escribirParam=false;
 var cerrarParam=false;
 var escribirPartidas=false;
 //var openParam="";
 var param="";
 var valor="";
 //ses.masterId="";
 for (var letra:char in www.data) {
 /*if (escribirPartidas) {
 if (""+letra=="<") {
 escribirParam=true;
 continue;
 }
 if (""+letra==">") {
 if (escribirParam) {
 escribirParam=false;
 if (cerrarParam) {
 arrPartidas[arrPartidas.length-1][param]=valor;
 valor="";
 param="";
 }
 continue;
 }
 }
 if (escribirParam) {
 //escribir variable
 if (""+letra=="/") {
 //cerrarParam=true;
 continue;
 }
 param+=""+letra;
 } if (param!="") ses.Partidas(param,""+letra);
 } else */
 
 
 
 //sino escribimos un param escribimos un valor
 if (escribirParam) {
 if (""+letra==">") {
 escribirParam=false;
 if (param=="partida") {
 escribirPartidas=!escribirPartidas;
 if (escribirPartidas) arrPartidas.Add(new Hashtable());
 cerrarParam=false;
 param="";
 valor="";
 continue;
 }
 if (cerrarParam) {
 //si es el param de cierre guardar valor
 //ses.Parse(param,valor);
 //Debug.Log("p:"+param+" v:"+valor);
 if (param=="hostIp") {
 partidas[partidaSelect]["ip"]=[Tienes que estar registrado y conectado para ver este vínculo]
 } else if (!escribirPartidas) sesion[param]=[Tienes que estar registrado y conectado para ver este vínculo]
 else arrPartidas[arrPartidas.length-1][param]=[Tienes que estar registrado y conectado para ver este vínculo]
 param="";
 cerrarParam=false;
 //hashtable
 }
 valor="";//se sumaban valores del param <br>
 continue;
 }
 //escribir variable
 if (""+letra=="/") {
 cerrarParam=true;
 param="";//clientclient :v
 continue;
 }
 param+=""+letra;
 } else {
 if (""+letra=="<") {
 escribirParam=true;
 param="";
 continue;
 }
 if (param!="") valor+=""+letra;
 }
 }
 
 //if (proc=="partidas") ses.hostList=arrPartidas.ToBuiltin(Partida);
 if (proc=="partidas") {
 if (arrPartidas.length==0) {
 arrTags.Add(new Tag("No hay partidas."));
 } else {
 partidas=arrPartidas.ToBuiltin(Hashtable);
 //documento.Set("host_list",partidas);
 //documento.Set("host_list",arrPartidas);
 //for (var i=0;i<arrPartidas.length;i++) {
 for (var i=0;i<partidas.length;i++) {
 arrTags.Add(new Tag(
 partidas[i]["nombre"]+" "+partidas[i]["jugadores"]+"/"+partidas[i]["slots"],
 E_EVT.HOST_INFO,""+i
 ));
 }
 }
 
 documento.Set("host_list",arrTags);
 //arrTags.Clear();
 //arrPartidas.Clear();
 arrTags=new Array();
 arrPartidas=new Array();
 }/* else if (proc=="host") {
 //obtener ip del server
 partidas[partidaSelect]["ip"]=sesion["hostIp"];
 }*/
 if (sesion["error"]=="") connection=0;
 //if (sesion.Contains("client")) Debug.Log(sesion["client"]);
 }
}

function OnApplicationQuit() {
 if (sesion.Contains("client")) PlayerPrefs.SetString("client",sesion["client"]);
 Query("delPartida");
}

casi todo se trata del menu pero en la mitad del script esta como funciona el multipayer
el chat de voz lo hago con un RPC que envia bytes:
Código:
//SendAudio.js by estantaya 2017
//Lee y escribe el audio en formato short y lo almacena hasta completar un buffer entonces lo reproduce

//import System.Runtime.InteropServices;
import System;
import System.IO;
import WinMM;
/*
@DllImport("winmm.dll")
static private function mciSendString(
MciComando:String, MciRetorno:String, MciRetornoLeng:int, CallBack:int) : int{};
*/
//@DllImport("winmm.dll")
//static private function waveInGetNumDevs() : void;
/*
function OnSerializeNetworkView(stream : BitStream, info : NetworkMessageInfo) {
 var newAudio : int = 0;
 if (stream.isWriting)
 {
 health = currentHealth;
 }
 stream.Serialize(health);
 if (!stream.isWriting)
 {
 currentHealth = health;
 }
}
*/

//@DllImport("WinMM.Net.dll")
//static private var WinMM;
/*
@DllImport("WinMM.Net.dll")
static private var WaveIn : System.IDisposable;
@DllImport("WinMM.Net.dll")
static private var WaveOut : System.IDisposable;

@DllImport("WinMM.Net.dll")
static private var WaveFormat : void;
*/



private var waveIn:WaveIn;
private var waveOut:WaveOut;
//private var waveFormat:WaveFormat=WaveFormat.Pcm44Khz16BitMono;
private var waveFormat:WaveFormat=WaveFormat.Pcm16Khz16BitMono;

//var streamAudioOut:WaveFormat[];
//var streamAudioIn:WaveFormat;

//private var speech:byte[];

private var record=false;
private var play=false;
private var waveOpen=false;

private var secuencia:Array;//byte array

function Start() {
 //Record();
 
 //buscar dispositivos de grabación
 //var dispositivos:System.UInt32=0;
 //var windowsError:int{};
 //try
 //{
 //dispositivos=riff.waveInGetNumDevs();
 
 waveOut = new WaveOut(WaveOut.WaveOutMapperDeviceId);
 //waveOut.MessageReceived += new EventHandler(Play);
 waveOut.Open(waveFormat);//formato de entrada
 
 waveIn = new WaveIn(WaveIn.WaveInMapperDeviceId);
 //registrar function local que reciba la data del buffer
        waveIn.BufferQueueSize = 200;
        waveIn.BufferSize = 64;
 waveIn.DataReady += new EventHandler(Record);
 waveIn.Open(waveFormat);//formato de entrada
 
 waveOpen=true;
 
 secuencia=new Array();
 
 //Debug.Log(waveIn);
        
 //waveOut = new WaveOut(WaveOut.WaveOutMapperDeviceId);
 
 //}
 /*if (dispositivos>0) {
 //abrir dispositivo
 try {
 //windowsError=riff.waveInGetDevCaps(0,,);
 
 }
 }*/
}


function Update() {
 if (waveOpen) {
 if (Input.GetKeyDown(KeyCode.Mouse2)) {
 //play=false;
 //waveOut.Stop();
 record=true;
 waveIn.Start();//escribiendo en el buffer DataReady
 }
 if (Input.GetKeyUp(KeyCode.Mouse2)) {
 record=false;
 //play=true;
 //waveOut.Start();
 waveIn.Stop();
 //waveOut.Write(secuencia.ToBuiltin(byte));
 networkView.RPC("SendWave", RPCMode.Others, secuencia.ToBuiltin(byte));
 secuencia.Clear();
 
 //if (!play) {
 //Debug.Log(waveIn.DataReady.Data.Length);
 //play=true;
 //}
 }
 }
}

@RPC
function SendWave(sonido:byte[]) {
 
 waveOut.Write(sonido);
}

function Record(sender:Object,e:DataReadyEventArgs) {
 if (!record) return;
/*
MMRESULT waveInOpen(
   LPHWAVEIN       phwi,
   UINT            uDeviceID,
   LPCWAVEFORMATEX pwfx,
   DWORD_PTR       dwCallback,
   DWORD_PTR       dwCallbackInstance,
   DWORD           fdwOpen
);
*/
 if (waveIn != null)
 {
 //guardar stream
 //waveOut.Write(e.Data);
 //nView.RPC("SendWave", RPCMode.AllBuffered, e.Data[i]);
 for (i=0;i<e.Data.Length;i++) {
 secuencia.Add(e.Data[i]);
 }
 //Debug.Log(secuencia.length);
 /*speech=e.Data;
 waveIn.Stop();
 Debug.Log(speech.Length);
 waveOut.Write(speech);
 play=true;
 record=false;//terminar de gravar al llenar el buffer
 */
 }
}

function Play() {
 while(play) {
 yield WaitForSeconds(1);
 }
}

function rPlay(sender:Object,s:WaveOutMessageReceivedEventArgs) {
 if (!play) return;
 //repriducir grabación
 //speech
 if (waveOut != null)
 {
 //reproducir stream
 //waveOut.Write(secuencia[i]);
 
 }
}

function OnApplicationQuit () {
 //if (grabando) Stop();
 //try {
 if (waveIn) {
 waveIn.Dispose();
 waveIn=null;
 }
 if (waveOut) {
 waveOut.Dispose();
 waveOut=null;
 }
 //}
}

/*
function Record() {
 
 //create Test alias
 mciSendString("open new type waveaudio alias Test", null, 0, 0);

 //start
 mciSendString("record Test", null, 0, 0);
 
 Debug.Log("Grabando");
 
 grabando = true;

 //Thread.Sleep(3000);
 
}
function Stop() {
 
 //yield WaitForSeconds(30);
 
 //pause
 mciSendString("pause Test", null, 0, 0);

 //save
 mciSendString("save Test " +Application.dataPath+  "/test.wav", null, 0, 0);
 mciSendString("close Test", null, 0, 0);
 
 Debug.Log("Guardar audio");
 
 grabando = false;

 //press any key
 //Console.ReadKey();
}
*/
donde dice
import WinMM;
es porque uso la libreria winmm.codeplex.com/releases/view/25712
se trata de un port .net de winmm.dll de windows
Volver arriba Ir abajo
Ver perfil de usuario http://33.media.tumblr.com/04ce0ed37cbf34da18782f49a8b3765d/tumb
Th_Rh_luis
Avanzado
Avanzado
avatar

Sexo : Masculino
Mensajes : 210
Edad : 23
Localización : DF, México

MensajeTema: Re: unity 3d multiplayer   Jue Ago 17, 2017 11:30 pm

En que esta programado? en c?
Volver arriba Ir abajo
Ver perfil de usuario
 

unity 3d multiplayer

Ver el tema anterior Ver el tema siguiente Volver arriba 
Página 1 de 1.

 Temas similares

-
» ¿Se puede instalar una app en 3D creada con Unity3D?
» material pasto

Permisos de este foro:No puedes responder a temas en este foro.
Entidad 3D :: Creación de juegos en 3D sin programar :: Off-Topic :: Otros Proyectos-