PFM: Cambiando la cámara en UDK a tercera persona

En el diseño del juego especificamos que la cámara será en tercera persona (se ve el personaje completo) pero por defecto, la cámara de UDK es subjetiva (vemos sólo los brazos del personaje y el arma que sujeta). En esta entrada veremos una manera de modificar la posición de la cámara para que sea en tercera persona.

Recomendable leer primero la introducción a UDK.

Nos basaremos en el ejemplo de cámara en tercera persona que hay en http://udn.epicgames.com/Three/CameraTechnicalGuide.html
pero simplificado, pues el ejemplo incluye código que no es necesario para obtener una cámara básica en tercera persona.

Antes de pasar al código necesario para conseguir la cámara conviene conocer 2 de las clases más importantes que habrá en el código de nuestro juego: Pawn y PlayerController.

  • PlayerController es la clase responsable de transladar las acciones del jugador en acciones dentro del juego, ya sea mover su personaje, la cámara, o activar cualquier botón.
  • Pawn es la clase que representa una entidad en el juego. Como su nombre indica (peón, títere) durante la partida será el avatar del jugador, el personaje que maneje. Las acciones del jugador serán traducidas por el PlayerController, que se encargará de mover el Pawn. El Pawn también se encarga de controlar la posición y rotación de la cámara.

Estas clases son vitales para cualquier juego que se desarrolle con UDK y un buen comienzo es crear nuestras propias versiones. Luego bastará con indicarle al GameType que utilice nuestras clases en vez de las que usa por defecto.

Igual que hicimos para crear un GameType propio, crearemos nuevas clases en la carpeta de código (en mi caso en Development\Src\PFM\Classes). Los nombres escogidos no importan, y al igual que con el GameType, nuestras clases extenderan de clases de UDK ya existentes para poder aprovechar su funcionalidad y extenderla o modificarla. Necesitamos estas 2 clases:

PFMPlayerController.uc

class PFMPlayerController extends UTPlayerController;

defaultproperties
{
}

La clase está vacía, pero la creamos igualmente.

PFMPawn.uc

class PFMPawn extends UTPawn;

// 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);
        }
    }
}

defaultproperties
{
    //Determina el 'zoom' de la cámara
    CameraScale=40.0

    // Se sobreescribe el valor del CamOffset por defecto CamOffset=(X=4.0,Y=16.0,Z=-13.0)
    CamOffset=(X=4.0,Y=0.0,Z=-13.0)
}

Básicamente en esta clase activamos la vista en tercera persona, hacemos visible el personaje del jugador y eliminamos el arma que se ve en primera persona. Además modificamos los parámetros CameraScale y CameraOffset para cambiar el Zoom y el desplazamiento de la cámara respectivamente.

Ahora bastaría con modificar la clase PFMGame que creamos aquí para indicarle que use nuestro Pawn y PlayerController:

class PFMGame extends UTDeathMatch;

defaultproperties
{
    //Se especifica el Pawn por defecto
    DefaultPawnClass=class'PFM.PFMPawn'
    //Se especifica el controlador
    PlayerControllerClass=class'PFM.PFMPlayerController'
}

Reiniciando el editor de UDK para que compile los scripts y seleccionando nuestro GameType en las WorldProperties ya podríamos ejecutar el mapa de prueba y ver el resultado:


Banner Blog

72 comentarios en “PFM: Cambiando la cámara en UDK a tercera persona

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

  2. hola aqui de nuevo y si quisiera poner una camara al estilo gear of war solo tendria que editar los valores de la ultima linea ?? y sobre la mira por que no la sigue D:

  3. Hola Marcos. Antes de nada darte las gracias por los tutoriales tan buenos.
    He hecho el de la camara en tercera persona con mi modelo(pawn) y muy bien.. el problema he probado en mi escenario, el modelo y la camara y va muy rapido,los movimientos de la camara.. como puedo corregir la velocidad de la camara .. cuando doy tecla(W) avanzar va super rapido la camara pasa los edificios como un cohete el modelo ..
    He bajado en UTpawn …groundspeed = 440..a 200 y no me hace nada.. sigue super rapido
    como puedo corregir la velocidad.. estoy empezando con el udk.. soy principiante.
    Gracias.

    • Ummm no entiendo muy bien entonces el problema, se mueve muy rápido el personaje o la cámara?? Puedes hacer un video para mostrarme lo que pasa?

    • Hola marcos. gracias por responderme .
      Me esplicare mejor, no se como puedo subir un video para que lo vieses.. Hago como lo del tutorial tuyo:
      creo :
      PFMPlayerController.uc

      class PFMPlayerController extends UTPlayerController;
      defaultproperties
      {
      }
      ***********************************************************************
      creo:
      PFMPawn.uc

      class PFMPawn extends UTPawn;

      // 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 )
      etc..etc… vamos igual que el tuyo…

      de cambiar la tercera persona hasta ahi todo bien. el problema en mi escenario es cuando doy a la teclas de (W) avanzar,(D) ir a la derecha..etc.. lo hace todo muy rapido el modelo ,,entonces parece que va en un cohete y tendria que ir el modelo mucho mas despacio.
      me imagino que sera la camara no del modelo por que he probado con otro tipo de camara en 3 persona ,que he visto por internet utilizando kismet y ese si me lo hace bien a la velocidad correcta y puedo controlar la velocidad de mi pawn con el groundspee,pero la verdad me gusta mas la tuya,camara en tercera persona pero esta el problema ese que parece que mi modelo va en un cohete..pasa por las calles de un lado a otro en 2 segundos ..va muy rapido..
      gracias

    • Si, te contesté en otro comentario pero creo que no pusiste bien el email y no te habrá llegado. Te copio lo que te comenté:

      Es muy sencillo modificar la velocidad máxima del personaje, sólo tienes que modificar la variable GroundSpeed en la sección defaultproperties de tu clase Pawn (la que es mi PFMPawn). Así, tendrías que añadir en dicha sección una línea como esta:

      GroundSpeed=300

      Dándole el valor que se adecue a lo que quieras. Esta variable es la que determina la velocidad máxima que puede alcanzar el Pawn en carrera.

      Si has usado mi código pasaría a ser algo así:

      class PFMGame extends UTDeathMatch;

      defaultproperties
      {
      //Se especifica el Pawn por defecto
      DefaultPawnClass=class'PFM.PFMPawn'
      //Se especifica el controlador
      PlayerControllerClass=class'PFM.PFMPlayerController'
      //Modifica la velocidad del pawn
      GroundSpeed=300
      }

    • el problema que yo script no se nada estoy empezando ..yo controlo de modelar 3d pero de script estoy mas verde que una lechuga.. vi tu blog, que es una pasada lo bien que esta.. ¿sabes algun libro castellano por favor..o tutoriales de script para novatos pero novatos eh..?

    • Pues la verdad es que tutoriales de UnrealScript en español… no he visto ninguno xD

      Sobre UDK en general sí creo que hay más, para aprender a usar el editor, kismet, etc, pero de UnrealScript propiamente… si hay yo no los he visto. En parte por eso estoy haciendo este blog, porque todo lo que he encontrado sobre UScript ha sido en inglés siempre. Si es cierto que no he empezado a explicar el lenguaje de programación desde 0 para alguien que no sepa nada nada porque me llevaría mucho más tiempo del que ya me lleva. La idea es que alguien que ya conozca algún otro lenguaje (es decir, sepa lo que son las variables, bucles, control de flujo, etc) aprenda un poco por medio de ejemplos el UnrealScript.

      Lamentablemente aprender UnrealScript desde 0 sin conocer ningún otro lenguaje y en español es.. complicado. Ve poco a poco y pregúntame cualquier cosa que no entiendas, sea del código o de lo que explico. Suerte!

    • Si quieres hacerlo en primera persona no necesitas una cámara en tercera persona 😀 Así que no te sirve de mucho este tutorial, aunque es importante entender la diferencia de Controller y Pawn, pero el código no lo necesitas.

  4. gracias a ti de verdad..
    Tengo problemas con el codigo que me has mandado ..me sale error al compilarlo.
    Te pongo lo que yo he hecho. creo carpeta: PFM y dentro otra : classes y dentro de classes CREO :PFMgame.uc
    class PFMGame extends UTDeathMatch;

    defaultproperties
    {
    //Se especifica el Pawn por defecto
    DefaultPawnClass=class’PFM.PFMPawn’
    //Se especifica el controlador
    PlayerControllerClass=class’PFM.PFMPlayerController’
    }
    CREO: PFMPawn.uc
    class PFMgame extends UTDeathMatch;
    // 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);
    }
    }
    }
    defaultproperties
    {

    //Se especifica el Pawn por defecto
    DefaultPawnClass=class’PFM.PFMPawn’
    //Se especifica el controlador
    PlayerControllerClass=class’PFM.PFMPlayerController’
    //Modifica la velocidad del pawn
    GroundSpeed=300
    }
    CREO: PFMPalyerController.uc

    class PFMPlayerController extends UTPlayerController;
    defaultproperties
    {
    }

    he hecho esto tres archivos y me da error

    • Por el código que me has puesto pones
      class PFMgame extends UTDeathMatch;
      en PFMPawn. Si está así en tu código te dará error, se te habrá colado al copiar el código 😀
      Si te sigue dando error al compilar cópiame el error que te salga

  5. es que tu me lo has puesto antes.. mira copio y pego lo tuyo: en la repuesta de arriba..
    Es muy sencillo modificar la velocidad máxima del personaje, sólo tienes que modificar la variable GroundSpeed en la sección defaultproperties de tu clase Pawn (la que es mi PFMPawn). Así, tendrías que añadir en dicha sección una línea como esta:

    GroundSpeed=300

    Dándole el valor que se adecue a lo que quieras. Esta variable es la que determina la velocidad máxima que puede alcanzar el Pawn en carrera.

    Si has usado mi código pasaría a ser algo así:

    class PFMGame extends UTDeathMatch;

    defaultproperties
    {
    //Se especifica el Pawn por defecto
    DefaultPawnClass=class’PFM.PFMPawn’
    //Se especifica el controlador
    PlayerControllerClass=class’PFM.PFMPlayerController’
    //Modifica la velocidad del pawn
    GroundSpeed=300
    }

    entonces que pongo??

    • Ostras perdona, fallo mío xD He modificado la clase que no era, no se en qué estaría pensando…
      Como te dije el GroundSpeed=300 debes ponerlo en el PFMPawn que hay en esta página, en la sección defaultproperties. Osea:


      class PFMPawn extends UTPawn;

      // 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);
      }
      }
      }

      defaultproperties
      {
      //Determina el 'zoom' de la cámara
      CameraScale=40.0

      // Se sobreescribe el valor del CamOffset por defecto CamOffset=(X=4.0,Y=16.0,Z=-13.0)
      CamOffset=(X=4.0,Y=0.0,Z=-13.0)

      //Modifica la velocidad del pawn
      GroundSpeed=300
      }

  6. ERROR : el mensaje al compilarlo..
    Este mensaje me sale rojo:

    c:\udk\udk\udk-2012-10\binaries\..\development\src\PFM\classes\PFMPawn.uc : Error , Script vs. class name mismatch
    c:\udk\udk\udk-2012-10\binaries\..\development\src\PFM\classes\PFMPawn.uc : Error , Script vs. class name mismatch

    Este mensaje me sale amarillo:

    c:\udk\udk\udk-2012-10\development\src\PFM\classes\PFMPawn.uc : warning, classproperty engine.gameInfo: defaultpawnclass: unresolved reference to ‘ class ‘PFM.PFMPawn»
    c:\udk\udk\udk-2012-10\development\src\PFM\classes\PFMPawn.uc : warning, invalid property value in defauls: defaultpawnclass=class’PFM.PFMPawn’
    c:\udk\udk\udk-2012-10\development\src\PFM\classes\PFMPawn.uc : warning, unknown property value in defaults: groundSpeed=300

    Gracias por ayudarme.

  7. Funciona de maravilla gracias a ti.. ahora tengo otro problemilla jejeje..
    Me sale la mira para apuntar el disparo y la municion .. y quiero quitarlo..
    entro en*** PFMGame: y cambio: class PFMGame extends UTDeathMatch; por
    class PFMGame extends Udkgame;

    y me la tendria que quitar .. pues compilo y todo bien ,pero a la hora de arracar para ver si lo ha quitado hace como una explosion y desaparece mi pawn .
    corrige lo de la mira y el marcador que ya no sale pero desaparece mi pawn..??

    • De hecho para que sea más simple, cuando hagas el tutorial, en lugar del código de PFMHUD que viene usa este:

      class PFMHUD extends UDKHUD;

      event DrawHUD()
      {
      super.DrawHUD();

      if(PlayerOwner != none && PlayerOwner.Pawn != none)
      {
      // Se pinta el texto con la salud
      Canvas.DrawColor = WhiteColor;
      Canvas.Font = class'Engine'.Static.GetLargeFont();
      Canvas.SetPos(canvas.ClipX * 0.01, Canvas.ClipY * 0.85);
      Canvas.DrawText("HEALTH:"@PlayerOwner.Pawn.Health);
      }
      }

      defaultproperties
      {
      }

    • Igual que GroundSpeed controlaba la velocidad del Pawn, existe una variable llamada JumpZ que puedes modificar de la misma manera para ajustar la altura del salto del Pawn.

    • perdona pero se me olvido decirte antes que he probado con jumpz y al compilarlo me sale error .. le puse un valor como al groundspeed..dentro de la carpeta PFMPawn
      //Modifica la velocidad del pawn
      GroundSpeed=250
      // Modifica el salto del pawn
      jumpz=150
      me sale este mensaje en amarillo:
      c:\udk\udk-2012-10\development\src\PFMPawn.uv : warning , reduntant data: jumpz=150
      este en blnaco
      scripts seccessfully compiled-saving package ‘ c:\udk\udk-2012-10\Binaries\win64\..\..\udkGame\script\PFM.u’

  8. Hola Buenas,

    Mi nombre es Julián y quisiera saber por qué mi juego «Who wants to be a millionaire special editions» sale un error diciendo que no puede encontrar las carpetas Development/Src/core/classes/*.uc
    Development/Src/Engine/classes/*.uc
    Development/Src/GFxUI/classes*.uc
    Development/Src/Gameframework/classes*.uc
    Development/Src/UnrealEd/classes*.uc
    Development/Src/GFxUIEditor/classes*.uc
    Development/Src/IpDrv/classes*.uc
    Development/Src/WWTBANGame/classes*.uc

  9. Disculpa marcos, he estado siguiendo tu tutorial y quiero hacer un juego de miedo entre varias personas y queriamos la camara en tercera persona pero no se que ocurre que sigo tal cual tus pasos pero cambiando de nombre en ved de PFM pongo otro y no me da errores de compilacion ni warnings, solamente ejecuto el juego y se mira en primera persona no se porqué.

    • Gracias por responder tan rápido en principio si, los primeros pasos me funcionaron perfectamente, de hecho me sirvió perfectamente salvo que la carpeta developer y se haya dentro de otra carpeta más, podría ser por alguna minúscula o mayúscula que se me haya cambiado? Si no no entiendo que le podría pasar.

      P.D: muchas gracias por hacer el blog!! Y he visto en tus siguientes post que hiciste un master, que máster llevaste a cabo?

    • Haz esta comprobación. Escribe en la clase cualquier error para comprobar que esté intentando compilar el código correctamente. Si compila sin problemas es que no está cogiendo tu código bien.

      El máster aún lo estoy haciendo, de hecho esto es el proyecto final xD. El blog me está sirviendo para llevar un poco un diario de lo que estoy haciendo y de paso, hago algún tutorial de Uscript en español que hay pocos o ninguno. Es este master: http://dac.escet.urjc.es/rvmaster/

    • De acuerdo eso haré más tarde, si hay algún fallo aún volveré a preguntar a ver jaja, y muchas gracias por lo del master a ver, sabes si puedes obtar a hacerlo a partir de ingeniería de telecomunicaciones?

  10. Si usaba una variable no declarada en el Pawn por ejemplo me detectaba error y no compilaba pero sigue sin funcionarme la camara en tercera persona no se porqué, aqui dejo cada script, el nombre en vez de PFM es ECHO a ver si me puedes echar una mano:

    class ECHOGame extends UTDeathMatch;

    defaultproperties{

    //Se Especifica el Pawn
    DefaultPawnClass=class’ECHO.ECHOPawn’
    //Se especifica el controlador
    PlayerControllerClass=class’ECHO.ECHOPlayerController’
    }

    class ECHOPawn extends UTPawn;

    // 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);
    }
    }
    }

    defaultproperties
    {
    //Determina el ‘zoom’ de la cámara
    CameraScale=40.0

    // Se sobreescribe el valor del CamOffset por defecto CamOffset=(X=4.0,Y=16.0,Z=-13.0)
    CamOffset=(X=4.0,Y=0.0,Z=-13.0)
    }

    class ECHOPlayerController extends UTPlayerController;

    defaultproperties{}

    • Si, en mi caso a ECHOGame, y sigue sin funcionar, usé más códigos de cámara del foro de epic y no me funciona no se si habré hecho algo mal o la versión que me descargué no funciona con código ya que hay otra manera de conseguir la cámara en third person, tu que versión de UDK usas?

    • Vaya pues sí que es raro.. Si en el editor muestra tu GameType es que lo reconoce, no entiendo por qué luego no ejecuta tu código. A no ser que sea un tema de versiones de UDK como dices, yo estoy usando la de noviembre de 2012.

    • que extraño… porque yo tenia la noviembre 2012 voy a reinstalar la version de febrero a ver si funciona si no vuelvo a reinstalar la versión de noviembre, y tu que editor de texto usas?
      yo uso el WOTgreal y antes me pedia configurarlo para un juego en especifico, puede ser por eso? espero que no

  11. No lo entiendo, usé la versión de febrero de 2013 usé los mismos pasos y ahora funciona jajaja muchas gracias por tu atención marcos!!

    • Asegurate de haber cambiado el GameType en las World Properties, tanto en donde pone Default Game Type como en Game Type for PIE 🙂

  12. hola, tengo una duda, al tener mas de una camara, por ejemplo en una secuencia de video para mostrar alguna puerta abriendose u otra cosa, al regresar a la camara del pj deja de ser de tercera persona, como puedo resolver esto.
    te dejo una imagen del kismet

  13. Hola, tengo que decirte, que el punto donde dispara y la marca del HUD del Mouse (Puntero) no coinciden, me explico; La señal que tienes para poder apuntar no coincide con el sitio del impacto de bala. No se como solucionar este problema.

  14. Buenas. Tengo un pequeño problemilla y esperaba que me lo solucionaras.

    En mi versión de UDK no parece que estén las clases «UT». En vez, debo usar las UDK, o sea, las que vienen de UDKBase, como UDKPlayerControler, UDKPawn, etc. La cosa es que en UDKPawn parece que no existe la función SetBehindView.
    ¿Cómo debo abordar el problema? Por ahora para que me funcione el script simplemente lo he comentado, pero preferiría saber si existe una alternativa.

    • Respondiendo a mi propio post, reinstalando con el juego de muestra funciona correctamente, pero ahora me dice lo siguiente:

      [0004.53] Log: C:\UDK\UDK-2013-07\Development\Src\KHR\Classes\KHRPawn.uc(47) : Warning, Unknown property in defaults: CameraScale=40.0 (looked in KHRPawn)
      [0004.53] Log: C:\UDK\UDK-2013-07\Development\Src\KHR\Classes\KHRPawn.uc(50) : Warning, Unknown property in defaults: CamOffset=(X=4.0,Y=0.0,Z=-13.0) (looked in KHRPawn)

      ¿Estoy poniendo los valores en el lugar erróneo? No entiendo el por qué de este error.

    • Sí, exactamente. Me salté una parte de tus tutoriales y asumí que eran variables de la superclase Pawn. Releyendo un poco me di cuenta de que no era así.

      Ahora me funciona bien, además, como tú dices, mi problema con lo de las clases UT era porque había instalado la versión empty, aunque suponía que aunque estuviera «empty» tendría todas las clases necesarias, pero bueno, ahora sé que no.
      ¡Gracias por responder!

Replica a Diego Armando Monroy Barrera Cancelar la respuesta