PFM: Cambiando el personaje en UDK (y parte 2)

En la parte 1 vimos cómo importar un modelo a UDK y asignarle materiales con texturas. En esta parte 2 final importaremos las animaciones del modelo y veremos cómo usarlo como personaje manejado por el jugador.

AnimSet

El primer paso es importar las animaciones y guardarlas en un AnimSet, que es un tipo de asset del Content Browser que agrupa diferentes animaciones. Lo primero es crear dicho AnimSet. Para ello hacemos clic derecho en el visor de assets del Content Browser y seleccionamos New AnimSet, le damos un nombre y aceptamos. Aparecerá el editor que se abría al clicar en el modelo, pero el modelo mostrado no será el nuestro. En el panel superior izquierdo, seleccionamos nuestro Skeletal Mesh para que se muestre:

pfm03_01

En ese mismo panel, en la pestaña Anim, seleccionamos el AnimSet recién creado en caso de no estarlo ya. Ahora podemos importar las animaciones. Vamos a File > Import FBX Animation y vamos importando las animaciones del modelo. Según las importamos podemos comprobar que funcionan correctamente con el botón Play de la parte inferior del visor del modelo:

pfm03_02

Cuando estén todas las animaciones importadas correctamente podemos cerrar el editor del modelo y pasar al siguiente paso.

AnimTree

El AnimTree le dirá al motor cómo y en qué momento usar qué animaciones de las incluidas en el AnimSet. En el visor del Content Browser hacemos clic con el botón derecho del ratón y escogemos New AnimTree, le damos nombre y aceptamos. Aparecerá el editor de AnimTree. De forma parecida al editor de materiales, mediante un sistema de cajas enlazadas, podemos decirle al motor cómo interpolar entre unas animaciones y otras. El primer paso es configurar el nodo central para que use el modelo y las animaciones que queremos. Lo seleccionamos y vemos sus propiedades en la parte inferior de la ventana.

Desplegamos la pestaña Anim Tree y entre las propiedades veremos Preview Mesh List y Preview Anim Set List. Primero añadiremos nuestro modelo a Preview Mesh List. Para ello pulsamos en el simbolo de más verde que hay a la derecha de la propiedad, creandose un elemento vacío en la lista. Lo desplegamos y vemos que tiene una propiedad Preview Skel Mesh. Vamos al Content Browser y seleccionamos nuestro modelo en el visor y ya en el Editor de AnimTree pulsamos la flecha verde a la derecha de la propiedad antes citada Preview Skel Mesh, quedando así asignado el modelo, que aparecerá en el editor. Para el Preview Anim Set List repetimos, pulsando el ‘más’ verde. Esto añadirá un elemento a la lista. Desplegándolo, veremos la propiedad Preview Anim Sets. Pulsando el ‘más’ de su derecha añadiremos un elemento. Teniendo seleccionado nuestro AnimSet en el ContentBrowser, haremos clic en la flecha verde que aparece a la derecha de este recién creado elemento, haciendo así que aparezca la ruta del AnimSet en la propiedad. El resultado final debería quedar algo así:

pfm03_03

Ahora es momento de crear el árbol de animaciones para que UDK sepa qué animaciones usar según la situación. El árbol final quedará así

pfm03_04

Veamos cómo crearlo. Los diferentes nodos o cajitas se crean con el menú que aparece haciendo clic con el botón derecho del ratón dentro del editor (en el área en que se encuentra la caja AnimTree). En primer lugar creamos el nodo UDKAnimBlendByPhysics, que se encuentra en New Animation Node > Blend By > UDKAnimBlendByPhysics. Este nodo interpolará las animaciones dependiendo del estado físico del personaje. Para que funcione es necesario configurar sus propiedades de esta manera:

pfm03_05

Lo conectamos al nodo AnimTree y creamos los siguientes nodos. En el mismo menú de antes podemos encontrar los nodos UDKAnimBlendByIdle y UDKAnimBlendByFall, que interpolan respectivamente las animaciones de movimiento y saltos/caídas. Conectamos los nodos a UDKAnimBlendByPhysics.

Finalmente crearemos los nodos que indican las animaciones a utilizar, que podemos encontrar en New Animation Sequence > AnimNodeSequence. Estos nodos representan cada una de las animaciones que las otras cajitas interpolarán. Para asignar las animaciones podemos escribir su nombre en las propiedades de cada nodo, por ejemplo para la animación ‘Robot@Idle’:

pfm03_06

Marcaremos la propiedad Playing y, para aquellas animaciones que queramos que sean cíclicas la propiedad Looping. En mi caso tengo 4 animaciones: correr, idle (quieto), saltar y caer. Se conectan convenientemente a las otras cajitas. En las cajitas hay una barra de desplazamiento en la parte inferior que permite pasar entre los diferentes estados de interpolación para comprobar que se realizan correctamente. Una vez comprobado todo podemos cerrar el editor de AnimTree y guardar el paquete. Ya está todo preparado para que nuestro modelo se convierta en un personaje manejable por el jugador. Para esto habrá que meterse a tocar código.

UnrealScript

En el post sobre la cámara en tercera persona comenté que el Pawn era la clase que representaba al jugador en el mundo de juego, por tanto parece lógico que sea esta clase la que hay que modificar para cambiar la apariencia de nuestro ‘avatar’. Nuestro Pawn era PFMPawn, que extendía de UTPawn. Si modificáramos PFMPawn tal cual, indicándole que use el modelo que hemos preparado, no funcionaría… El problema es que PFMPawn hereda de UTPawn, que es el personaje por defecto de UT. Los personajes de UT pueden agacharse y tienen un comportamiento mucho más complejo que el que hemos creado, que puede correr, saltar y poco más, por lo que el padre de PFMPawn, UTPawn, no sabe cómo controlar correctamente nuestro modelo. Para solucionar esto, haremos que PFMPawn pase a extender de UDKPawn, que es la clase que extiende UTPawn y es más genérica, quedando la jerarquía de clases así:

pfm03_07

El código de PFMPawn pasaría a quedar así:


class PFMPawn extends UDKPawn;

/* Iluminación de entorno */
var DynamicLightEnvironmentComponent LightEnvironment;

/******************************************************************************
Propiedades de Cámara
******************************************************************************/
var float CameraScale;          // Multiplicador de la distancia por defecto
var float CurrentCameraScale;   // Se usa para interpolar entre distintos CameraScales
var float CameraZOffset;        // Usado para interpolar el offset en z de la cámara
var vector CamOffset;           // Offset de la cámara en tercera persona

// Sobreescribe una función para que se vea al pawn por defecto
// La llama la Camara cuando este actor se convierte en su ViewTarget
simulated event BecomeViewTarget( PlayerController PC )
{
    local UTPlayerController UTPC;

    // Por defecto esta llamada pone los brazos al Pawn y el arma inicial (y otras cosas)
    Super.BecomeViewTarget(PC);

    if (LocalPlayer(PC.Player) != None)
    {
        UTPC = UTPlayerController(PC);
        if (UTPC != None)
        {
            // Activa la vista trasera (Poner la camara en tercera persona y hace desaparecer brazos y armas de primera persona
            UTPC.SetBehindView(true);
            // Esto no es necesario
            //SetMeshVisibility(UTPC.bBehindView);
        }
    }
}

// Función que calcula la posición de la cámara
// Es un ripoff de la función CalcThirdPersonCam de UTPawn, quitando los casos de DebugCam o cuado se gana la partida
simulated function bool CalcCamera( float fDeltaTime, out vector out_CamLoc,
                        out rotator out_CamRot, out float out_FOV )
{
    local vector CamStart, HitLocation, HitNormal, CamDirX, CamDirY, CamDirZ, CurrentCamOffset;
    local float DesiredCameraZOffset;

    // El punto inicial de la cámara es la posición del Pawn
    CamStart = Location;
    CurrentCamOffset = CamOffset;

    // Si está vivo pone un offset en Z (hacia arriba) del alto del mesh * 1.2
    DesiredCameraZOffset = (Health > 0) ? 1.0 * GetCollisionHeight() + Mesh.Translation.Z : 0.f;

    // Hace una interpolación si el tiempo entre frames es suficientemente pequeño (Se veria si cambiara el offset en Z)
    CameraZOffset = (fDeltaTime < 0.2) ? DesiredCameraZOffset * 5 * fDeltaTime + (1 - 5*fDeltaTime) * CameraZOffset : DesiredCameraZOffset;

    if ( Health <= 0 )
    {
        CurrentCamOffset = vect(0,0,0);
        CurrentCamOffset.X = GetCollisionRadius();
    }

    // Se suma a la posición inicial el offset de Z
    CamStart.Z += CameraZOffset;
    // Se extraen los ejes de la rotación de la cámara
    GetAxes(out_CamRot, CamDirX, CamDirY, CamDirZ);
    // Escala de la camara (zoom)
    CamDirX *= CurrentCameraScale;

    if ( (Health <= 0) || bFeigningDeath )
    {
        // adjust camera position to make sure it's not clipping into world
        // @todo fixmesteve.  Note that you can still get clipping if FindSpot fails (happens rarely)
        FindSpot(GetCollisionExtent(),CamStart);
    }

    // Se interpola la escala de la cámara suavemente (lo que sería el zoom)
    if (CurrentCameraScale < CameraScale)
    {
        CurrentCameraScale = FMin(CameraScale, CurrentCameraScale + 1 * FMax(CameraScale - CurrentCameraScale, 0.3)*fDeltaTime);
    }
    else if (CurrentCameraScale > CameraScale)
    {
        CurrentCameraScale = FMax(CameraScale, CurrentCameraScale - 1 * FMax(CameraScale - CurrentCameraScale, 0.3)*fDeltaTime);
    }

    // No parece que entre aquí nunca
    if (CamDirX.Z > GetCollisionHeight())
    {
        CamDirX *= square(cos(out_CamRot.Pitch * 0.0000958738)); // 0.0000958738 = 2*PI/65536
    }

    // Posición final de la cámara
    out_CamLoc = CamStart - CamDirX*CurrentCamOffset.X + CurrentCamOffset.Y*CamDirY + CurrentCamOffset.Z*CamDirZ;

    // Se traza un rayo para calcular posibles colisiones con la geometría
    if (Trace(HitLocation, HitNormal, out_CamLoc, CamStart, false, vect(12,12,12)) != None)
    {
        out_CamLoc = HitLocation;
    }

    return true;
}

defaultproperties
{
    // Iluminación de entorno del Pawn
    Begin Object Class=DynamicLightEnvironmentComponent Name=MyLightEnvironment
        bSynthesizeSHLight=TRUE
        bIsCharacterLightEnvironment=TRUE
        bUseBooleanEnvironmentShadowing=FALSE
        InvisibleUpdateTime=1
        MinTimeBetweenFullUpdates=.2
    End Object
    Components.Add(MyLightEnvironment)
    LightEnvironment=MyLightEnvironment

    // Componente SkeletalMesh para el robot
    Begin Object Class=SkeletalMeshComponent Name=SkeletalMeshComponentRobot
        SkeletalMesh=SkeletalMesh'Test.Robot.Robot'
        AnimSets(0)=AnimSet'Test.Robot.RobotAnimSet'
        AnimTreeTemplate=AnimTree'Test.Robot.RobotAnimTree'
        LightEnvironment=MyLightEnvironment
        bEnableSoftBodySimulation=True
        bSoftBodyAwakeOnStartup=True
        bAcceptsLights=True
    End Object
    Mesh=SkeletalMeshComponentRobot
    Components.Add(SkeletalMeshComponentRobot)

    // Se hace más pequeño el cilindro de colisión
    Begin Object Name=CollisionCylinder
        CollisionRadius=+0021.000000
        CollisionHeight=+0044.000000
    End Object
    CylinderComponent=CollisionCylinder

    //El robot es un poco grande
    DrawScale=0.5

    // Propiedades de cámara
    CameraScale=40.0
    CurrentCameraScale=0.0
    CamOffset=(X=4.0,Y=0.0,Z=-13.0)

    //Locomoción
    JumpZ=+0700.000000
    MaxFallSpeed=+1200.0        //Máxima velocidad al caer sin hacerse daño
    AirControl=+0.1             //Control aéreo
    CustomGravityScaling=1.3    //Multiplicador de gravedad personal
}

Dado que ahora se extiende UDKPawn en lugar de UTPawn, ha sido necesario copiar la función CalcCamera, para que la cámara en tercera persona siga funcionando como antes (pues esta función se encuentra en UTPawn, pero como ahora se extiende de UDKPawn no se tiene acceso a ella).

En realidad donde se especifica que se quiere usar el modelo creado es en el bloque de defaultproperties. En primer lugar se crea un objeto de iluminación de entorno, que hará que el personaje se vea afectado por la iluminación indirecta.

En en el segundo objeto creado, el SkeletalMesh, donde se especifica el modelo, AnimSet y AnimTree que se quiere usar en este Pawn, indicando el paquete y el grupo donde se encuentra cada asset.

El tercer objeto CollisionCylinder, se modifica para ajustarse al tamaño del robot, y es la forma con la que se calcularán las colisiones del personaje con el entorno. El resto de propiedades son ajustes de la cámara o del control del personaje.

Ya está!! Por fin! Si reiniciamos el editor de UDK para que recompile los script podremos probar nuestro nivel y ver los resultados:

Ahí tenemos a nuestro personaje correteando por el escenario. En un futuro será sustituido por el protagonista del videojuego, pero hasta que esté modelado y animado, este servirá de sustituto.
Banner Blog

Anuncios

47 pensamientos en “PFM: Cambiando el personaje en UDK (y parte 2)

  1. Pingback: PFM: Cambiando el personaje en UDK (parte 1) | El Blog de Marcos

  2. ¡Siempre la cámara está detrás del personaje! Nunca podremos verle por delante, por lo que si es así no merece la pena entretenerse en modelar por completo el personaje. ¿verdad?

  3. ¿Y si quisiéramos tener varias animaciones diferentes para idle que se ejecutaran aleatoriamente o una detrás de otra?

    He probado a usar un animnoderandom pero no consigo que alterne entre las dos animaciones que le he puesto.

    Además he estado usando una animación para idle de 1000 frames, y funciona hasta que le añado un morph. Entonces el UDK no me importa la animación completa, se queda sobre los 660 frames. Supongo que tendrá un límite de keyframes por animación, así que sólo queda dividir el idle en varias animaciones.

    • He hecho una prueba rápida con el AnimNodeRandom y sí me ha funcionado, lo único asegúrate de modificar el campo Chance de las propiedades del nodo para asignar una probabilidad a cada animación (he probado con 2 animaciones y por defecto la segunda tenía un chance de 1 y la primera de 0, así que siempre se ejecutaba la segunda)

      Sobre morphing no te puedo ayudar porque no lo he usado aún, pero a lo mejor estas páginas son de ayuda:
      http://udn.epicgames.com/Three/FBXMorphTargetPipeline.html
      http://udn.epicgames.com/Three/MorphTargets.html
      Tampoco he leído nada sobre que haya ninguna limitación en la longitud de las animaciones así que no sé, quizá sea otro motivo.. el importador de animaciones es lo más “especialito” que he visto en UDK, es bastante poco flexible

  4. Ya he conseguido que me funcione, el problema es que el “blending time” del segundo slot viene por defecto a 0.25, y no daba tiempo a reproducir la segunda animación entera. Lo puse a 0, y todos los loop count a 0, y se reproduce cada animación una sola vez y aleatoriamente.

    Lo suyo sería poder definir siempre una de inicio, y las otras para después, y supongo que será jugando con el chance.

    En cuanto al morph, lo hice tal cual indica la web que me dices. Creando el morpher en el max y al exportar te crea un morphset. Después de tener el morphset, al importar las animaciones si estas llevan el morpher animado, se incluyen en las animaciones. Es sencillo.

    El problema es que animar con morpher en Max es un coñazo, en mi caso lo he usado para mover los párpados y los ojos, así que imagínate 1000 frames llenos de ajustes para eso. Y en la línea de tiempo del max aparecen las claves para todo el morpher, no para cada slot independiente, con lo que es complicado de animar.

    He probado también a ajustar un slot desde código, así que lo suyo será mover los párpados, ojos, respiración, etc… usando contadores aleatorios desde código. Para cuando sepa hacerlo, claro.

  5. En cuanto a importar las animaciones, tengo la de idle de 1.000 frames y la importa completa. Si le añado el morpher, me importa hasta unos 660 frames más o menos, y le añade al nombre de la animación “take_001”.

    Probé a quitar los morphs desde la mitad y al importar cogió todos los frames. Parece como si tuviese un límite de keyframes. Quizás sea una burrada lo que estoy haciendo, de incluir el movimiento de ojos como morphs en una animación de 1.000 frames. Lo suyo será hacerlo por código.

  6. Bueno, encontré una forma de poner los morphs por separado. Esto es lo que he hecho:

    – Hago una animación por separado de sólo los morphs, en este caso movimento de ojos y párpados.

    – La exporto a FBX, pero en el apartado “Deformations” desmarco “Skins” y mantengo activada “morphs”.

    – Cargo la animación en UDK, y luego en el menú contextual de esa animación elijo “Convert secuence to additve animation”. Esto crea una nueva animación con el mismo nombre y el prefijo “ADD_”.

    – En el animtree, intercalo un “AnimNodeAdditiveBlending”, entre el Animtree y el UDKAnimBlendByPhysics, y conectando el “Additive anim input” a la secuencia que creamos antes, la del prefijo “ADD_”

    Y a partir de ahí todos los movimientos incluyen la animación con el morph.

    El problema es que me sigue limitando la longitud de la animación, la hice de 600 frames y sólo aceptó 366. Para mí que tiene un límite de 255 frames con keyframes.

    Me sigue pareciendo mejor solución usar los morphs desde código usando contadores, pero al menos esto hace el avío.

    • Gracias por compartirlo! Será de gran utilidad si alguna vez necesito usar morphing. Por lo que he visto las animaciones aditivas pueden activarse fácilmente desde el código mediante una referencia al AnimNodeAdditiveBlending, así que quizá sí sea la manera más fácil de añadir esas pequeñas animaciones como parpadeos a animaciones relativamente largas.
      Cuando tengas algo enseñable pon algún video por aquí 😀

    • En cuanto tenga algo decente hago un vídeo. Tengo un problemilla, a veces la posición de idle
      se queda con el esqueleto en posición 0, sin animación. Ocurre aleatoriamente, no sé si es del additiveblending o del animnoderandom. Voy a ir eliminando cosas una por una a ver si doy con el fallo.

      Me estoy planteando aprender el lenguaje, porque por lo visto para el Unreal 4 van a abandonarlo en favor de C++. Y como los juegos mantengan el nivel de lo visto en las demos de los motores nuevos (u4, fox, frostbite 3), el u3 se va a quedar obsoleto en cuanto salgan.

    • Es cierto que UnrealScript va a ser jubilado en en unreal engine 4. Sin embargo de momento no se ha anunciado que vaya a salir un UDK para el ue4, por lo que podrían pasar aún un par de años o más hasta que podamos meterle mano.. Como quieras, si lo aprendes tampoco será tiempo perdido. Si conoces otros lenguajes es muy sencillo y si no, aprenderlo hará que pasar luego a C++ sea también fácil.

  7. Eso había pensado, que tal vez ofrezcan el 4 a las compañías grandes primero y más tarde a las indies. Será duro trabajar con el 3 viendo lo que se puede hacer con el 4, trabajar con sombras duras pixeladas en el 3 mientras en el 4 hay area shadows y demás 🙂

  8. Al intentar importar las animaciones me salta este error “could not finde needed track (b_root) for this AnimSet.Import Failed.”, posible solucion?

    PD: Antes del error me salta un aviso de compatibilidad.

  9. Hermano, Felicitaciones, alfin!!!! Haz aclarado una duda de unos dos años! Excelente trabajo. Saludos desde Venezuela. Estaré pendiente del Blog.

  10. Amigo que pena es que al importar mi personaje al UDK y cambiarlo como principal me aparece como volando xD. Me explico no me aparece sobre el suelo. Ojala puedas ayudarme. Gracias!

    ↑ Imagen↑

    • Hola Giussep. Por la imagen parece que el personaje está muy desplazado con respecto al origen y por eso sale tan arriba. Para bajarlo puedes editarlo haciendo doble clic en el modelo en el Content Browser y modificar en sus propiedades el valor Z de la propiedad Origin. También debes tener en cuenta el tamaño del Collision Cylinder, que puede no tener el tamaño adecuado respecto al personaje. Para verlo escribe en la consola Show COllision y si no tiene el tamaño adecuado deberás modificarlo en el código de PFMPawn, cambiando la propiedad CollisionHeight

    • Hola Luis, comprueba que no te de ningún warning al compilar, ya que lo más seguro es que el Skeletal Mesh no esté bien referenciado y al no encontrarlo no lo muestre

  11. Hola, lo primero gracias por los tutoriales. Son seguramente los mejores que he visto en Castellano, y no es decir poco, porque ya existe buen material al respecto.

    He seguido perfectamente el tutorial, pero al hacer la compilación, me da varios errores. Por un lado, me dice que no encuentra ”MyLightEnvironment” y por otro, tanto la malla como las animaciones, no se como denominarlas, ya que tu utilizas “Test.Robot.Robot” y eso yo no lo debo poner ¿verdad? Es decir, como denomino a la malla? Pongo Test tambien?

    Muchas gracias, y espero haberme explicado bien jeje

    • Hola Sergio, me alegro que te sean útiles!

      Lo de MyLightEnvironment debe ser algún error al escribir el código, pues es un componente que se declara en la sección de defaultproperties. Comprueba que no te haya bailado alguna letra.
      Para referenciar la malla correctamente debes usar el nombre del paquete, grupo y el nombre de la malla que usaste al importar tu modelo en UDK, en la parte 1 del tutorial se muestra cómo al importar el modelo se rellenan unos campos (package, grouping y name), pues estos campos son los que deberás usar con el formato “Package.Grouping.Name” para referenciar el modelo (y cualquier otro asset del content browser de UDK).

  12. Hola! Gracias por contestar tan pronto, así da gusto jejeje.

    Lo de referenciar la malla al final lo descubrí releyendo los tutoriales, y vi que lo hacia mal. Tal y como dices, poniendo paquete, grupo y nombre, sin problemas. Las prisas malas consejeras.

    Lo de MyLightEnvironment me sigue sin funcionar, incluso copiando tu codigo tal cual.
    “Unknown Property in defaults” como si no estuviera. Pero el caso es que si quito esa linea que da error, al probar si funciona, se mueve el personaje y todo perfecto. No se…

  13. Lo he intentado todo , pero mi personaje no se ve , puedo moverme pero el personaje no se ve , incluso he probado a poner todo con los nombres que tu pones (aunque al hacer esto no compila es extraño)
    Podría ser por eso que mencionas de la jerarquía? esa parte no sabía cómo hacerla ya que supuse que vendría en el script
    Saludos y buen trabajo

  14. Tras darle muchas vueltas ya he encontrado con la solución al problema , hice todo con los nombres idénticos a los del tutorial para no tener líos con el script pero no por eso funcionaba , aún hacía falta poder el GameType en PFMGame (sí , al final ha sido por la tontería más grande)

  15. Buenas Marcos, felicidades por los tutoriales, son muy útiles para los que estamos empezando en esto.
    Tengo un pequeño problema y es que cambio la apariencia del personaje y todo perfecto…Hasta que me cruzo con el primer enemigo y ¡tachán! Tiene la misma mesh del personaje… Supongo que es porque en la clase Pawn está por defecto la apariencia de mi mesh y animaciones, pero ¿ como puedo ponerlo específico para los bots ? Gracias de antemano y un saludo.

    • Tiene pinta de que el cilindro de colisión es muy grande, prueba a modificar su tamaño en las defaultproperties. En cuando al HUD, échale un vistazo a mis tutoriales sobre eso 😉

  16. amigo buenas tardes ..tengo una duda el personaje ya anima y todo en el udk pero …mi personaje no esta en suela esta en el aire…como hago para bajarlo al suelo en udk …espero supronta resouesta gracias

  17. Ayuda,cuando inicio el juego , me sale mi personaje flotando sin animacion, ni texturas
    (me sale en tercera persona y con los brazos abiertos sin animacion

  18. Buen Tutorial Marcos , pero quiero que mi personaje quede en primera persona como en el UTGame
    o mas bien Quiero que se vea como este juego ,es

    Que tendria que hacer en el PFM

  19. Hola Marco tengo un problema, he seguido al pie tu tutorial pero a la hora de correr el personaje me sale mirando a la derecha y cuando lo hago avanzar a cualquier direccion lo hace en la misma posición, por favor te agradecería una mano

  20. No entiendooo D: copio el codigo de PFMPawm
    pero al reiniciar udkeditor me sale si quiero recargar los codigos eso hasta aqui bien, pero luego que los esta analisando dice warning 6

    luego lo abro de nuevo y no me muestra ningun personaje e incluso no disparo 😦

  21. Hola Marco, yo tengo el udk seleccionado sin el utGame yo quiero poner mi propio personaje y no encuentro todavía como hacerlo y también quisiera saber si se puede hacer también directamente desde el Kismet no quiero que mi personaje salga con esas cosas alrededor de la pantalla, por favor te agradecería.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s