PFM: Meeting Mr. Pepe Dummy

Ya aprendimos a cambiar el personaje jugable en UDK anteriormente, pero el modelo elegido no es el más adecuado para sustituir a Gabriel hasta que este sea modelado, pues no se parece demasiado en las proporciones corporales ni en tamaño. Por ello he decidio sustituirlo temporalmente por otro modelo que sea más similar en proporciones al final y más sencillo de animar, de modo que cuando tenga el modelo de Gabriel terminado y animado correctamente, bastará por cambiar uno por otro y con muy pocas modificaciones estará funcionando. Es hora de presentar al señor Pepe Dummy:

pepe03

Él también estaría encantado de conocerte, pero por desgracia no puede sentir. El modelo básico son unas cuantas cajas suavizadas con TurboSmooth y poco más:

pepe01

El modelo se ha exportado a UDK como ya vimos y se han creado unos sencillos materiales:pepe02 El material creado tiene una alta componente especular y se ha usado el canal Emisivo para que el visor de Pepe se ilumine en la oscuridad: pepe04

Como ya aprendimos a hacer, se ha hecho que el personaje pueda apuntar, se le ha configurado un socket para las armas y se ha creado el AnimTree. Es similar al que tenía el modelo original solo que gracias al nodo WeaponType puede intercalar entre diferentes posturas según el arma que tenga:

pepe05

Esto permitirá que si no estamos portando ningún arma, el señor Dummy no siga apuntando con los brazos. El nodo WeaponType es en realidad un nodo del tipo AnimNodeBlendByProperty, que permite escoger entre diferentes entradas según el valor de una variable del Pawn que tiene este AnimTree. Esto es muy útil pues desde el código podemos determinar qué postura debe adoptar el personaje con sólo modificar una variable. Dicho nodo debe configurarse, especificando en nombre de la variable cuyo valor determinará qué entrada de animación se ejecuta, en nuestro caso escogerá entre apuntar o no.

Para esto último ha sido necesario hacer algunas modificaciones en código que detallo a continuación:

PFMPawn

Se ha definido una enumeración todas las posturas diferentes que adoptará según el arma que lleve, así como la variable WeaponType, que será la que el nodo de animación deberá consultar y que almacenará la postura actual del señor Dummy:


// Posturas para disparo y aiming:
enum PawnWeaponType
{
    PWT_Default,
    PWT_AimRight
};

var PawnWeaponType WeaponType;      // Postura actual

Se han añadido 2 funciones para cambiar la postura del Pawn desde otras clases.


// Cambia el tipo de Weapon, cambiando así la postura
function SetWeaponType(PawnWeaponType NewWeaponType)
{
    WeaponType = NewWeaponType;
}

// Cambia al arma por defecto
function SetDefaultWeaponType()
{
    SetWeaponType(PWT_Default);
}

Se ha modificado la función AddDefaultInventory para que no active por defecto las armas al dárselas al Pawn.


// Sobreescribe la funcion de Pawn
function AddDefaultInventory()
{
    // Se le da al Pawn el arma al comenzar
    InvManager.CreateInventory(class'PFM.PFMWeapon1',true); // No activar por defecto
    InvManager.CreateInventory(class'PFM.PFMWeapon2',true);
}

PFMWeapon

Aquí vimos cómo hacer que el personaje disparara, para lo cual se crearon ciertas clases que ahora se modificarán. En PFMWeapon se ha añadido una variable que guarde el tipo de postura que adoptará el Pawn con cada arma. De esta manera será el arma la que informe al Pawn qué postura debe adoptar.


var PawnWeaponType WeaponType;  // Tipo de arma para cambiar la postura de apuntado

Esta variable se configura en la sección defaultproperties de cada una de las armas, de momento PFMWeapon1 y PFMWeapon2


// Tipo de postura
WeaponType=PWT_AimRight

Así, se ha modificado la función TimeWeaponEquipping, llamada cuando se equipa un arma, para que informe al Pawn de la nueva postura usando la función SetWeaponType de PFMPawn, comentada arriba.


// Se llama al equipar el arma
simulated function TimeWeaponEquipping()
{
    // Se acopla el arma al pawn
    AttachWeaponTo( Instigator.Mesh,'Mano' );

    // Se cambia la postura
    PFMPawn(Instigator).SetWeaponType(WeaponType);

    super.TimeWeaponEquipping();
}

PFMInventoryManager

Finalmente se ha modificado la función SwitchWeapon del InventoryManager para que cuando se pulse el 0 en el teclado (que por defecto corresponde al grupo de inventario 10), se cambie al estado sin armas, eliminando el arma actual y haciendo que el Pawn adopte la postura por defecto.


// Cambia de arma. Llamado desde PFMPawn
simulated function SwitchWeapon(byte NewGroup)
{
    local PFMWeapon NewWeapon;

    if(NewGroup == 10)   // Sin armas (el 10 es el grupo de la tecla 0)
    {
        SetCurrentWeapon(None);         // Sin arma
        PFMPawn(Instigator).SetDefaultWeaponType(); // Postura por defecto sin arma
        return;
    }

    NewWeapon = GetWeaponByGroup(NewGroup);

    if(NewWeapon != none)
    {
        SetCurrentWeapon(NewWeapon);
    }
}

Eso es todo. Mr Pepe Dummy está listo para la acción:


Banner Blog

Anuncios

15 pensamientos en “PFM: Meeting Mr. Pepe Dummy

  1. Me gusta que la cámara no esté justo detrás del personaje principal. En un juego final, ¿crees que el jugador podría configurar la posición relativa de la cámara con respecto al personaje?. ¿Es técnica viable?

    • Poder podría hacerse, podría dársele al jugador a escoger entre distintas posiciones o dejar que mueva libremente la cámara.

    • Si modificas tu archivo de GameType (PFMGame) y haces que extienda de UDKGame se perderá la interfaz:

      class PFMGame extends UDKGame;

  2. Pingback: PFM: Diseño y creación de personaje protagonista (parte 3 – Animaciones y armas) | El Blog de Marcos

  3. hola marcos muy buenos tus tutoriales y muy utiles gracias a ti he podido avanzar mucho con mi projecto, he visto todo lo que has hecho y te deseo mucha suerte con el projecto para el masterXD supongo que no tendras mucho tiempo ya que tendras que acabar lo tuyo pero me han salido ciertas dudas sobre la posicion del personaje si yo quisiera que el personaje por ejemplo tuviera diferentes posiciones dependiendo del arma (pistola,rifle) tendria que seleccionar el weapontype y add intup y un nuebo AnimNodeBlendPerBone que tendria la siguiente postura de apuntado si no he entendido mal y de hay pasarla al codigo del pawn como has hecho en
    PWT_Default,
    PWT_AimRight
    pero no me queda claro como si añado un nuebo modo este lo reconoce siento que sea tan largoxd me han surgido muchas mas dudas a lo larog de los tutoriales que de momento dejare para mas adelante gracias por tu esfuerzo

    • Hola Manu. Te explico un poco, el nodo WeaponType está directamente relacionado con la variable WeaponType de PFMPawn, donde como bien dices añadirías una nueva postura en el enum PawnWeaponType. Sería responsabilidad del código el escoger la postura actual del Pawn, dependiendo del arma que se lleve o lo que quieras. Luego en el AnimTree, al añadir un nuevo input en el nodo WeaponType, permites que cuando dicha variable tome un valor u otro, el camino de la animación sea diferente.

      Ya depende de la postura concreta si tendrías que usar un AnimNodeBlendPerBone para filtrar datos de animación y permitir el apuntado o no. Es decir, si en esta nueva postura el personaje apunta con el arma, filtrarías con el AnimNodeBlendPerBone a partir del hueso que te interese, para que por ejemplo, pueda correr mientras apunta con el arma. Espero habertelo aclarado un poco mejor 😉

    • gracias por tu rapida respuesta, ahora se que estaba bien encaminado XD ahora lo pondre a prueba y cuando decida grabarlo mostrare lo que me has ayudado hacer XD espero poder ver mas avances de tu projecto y mas tutoriales que son geniales 🙂

  4. hola marcos, acabo de terminar de reescribir el codigo, y me sigue sin cambiar las posturas, al compitar todo bien pero juego y nada, pruebo cambiando las posturas en el aimtree juego y por ejemplo le dejo en la posturas de idle cambio de armas y aparecen pero apuntando hacia abajo y la animacion idle, luego cambio la postura a apuntar y las armas aparecen bien pero se queda con la postura de apuntar… aqui un video para ver e problema mas claro

    eso de los nombres de las posturas que dices se tienen que hacer dentro del programa o te refieres a las posiciones que van en cada arma?

    PWT_Default,
    PWT_AimRight

    • Ya veo… Comprueba si has configurado correctamente el nodo con el nombre de la variable que cambia en el código. Si la variable cambia correctamente debería cambiar la postura.. Puedes hacer un log de la variable a ver si se modifica al cambiar de postura en el juego

  5. hola marcos gracias por la respuesta, me e estado fijando y a varios otros chicos le a estado pasando lo mismo, realmente pienso yo que al menos esta bien configurado la variable o mas bien el nodo WeaponType que es un AnimNodeBlendByProperty realmente como nombras en esta entrada, solo le se cambia el nombre, ahora bien quisas hay que hacerle algo mas al nodo? quisas escribirle algo mas?, quisas la variable que va en las dos armas

    WeaponType=PWT_AimRight

    estara en una mala posicion? probe reemplazando la linea misma de defaultproperties

    ej:

    defaultproperties (reemplazar estta inea por WeaponType=PWT_AimRight )
    {
    blabla bla (+ propiedades)

    ———————-

    y tambien pobre poniendola junto a los otros codigos pero nada 😦

    disculpame la ignorancia pero como podria hacer un log para ver si cambia….realmente pienso que puede ser una pequeñes el problema pero no e logrado allar la falla y con las siguientes entradas voy como avion xd pero el tema de las posiciones no lo e logrado

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