Noticias

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

rotacion al cambiar 2 objetos entre si

Iniciado por Abramelin, Agosto 28, 2015, 06:40:05 PM

Tema anterior - Siguiente tema
Septiembre 01, 2015, 11:08:08 AM #15 Ultima modificación: Septiembre 01, 2015, 11:51:39 AM por Oak Human Flesh
Ok examine el proyecto que subiste, y bien no es tan sencillo mezclar el FPS y el TPS de los assets de Unity, sin embargo... #pragma strict
import UnityStandardAssets.Characters.FirstPerson;
import UnityStandardAssets.Characters.ThirdPerson;

var player : GameObject;
private var playerFpsController : FirstPersonController;
private var playerRbdy : Rigidbody;
private var playerCapsuleCollider : CapsuleCollider;
private var playerCharacterController : CharacterController;
private var playerThirdPersonUserControl : ThirdPersonUserControl;
private var playerThirdPersonCharacter : ThirdPersonCharacter;
var cam1pers : GameObject;
var cam3pers : GameObject;
private var msg : String = "";
function Awake () {
playerFpsController = player.GetComponent(FirstPersonController);
playerRbdy = player.GetComponent(Rigidbody);
playerCapsuleCollider = player.GetComponent(CapsuleCollider);
playerCharacterController = player.GetComponent(CharacterController);
playerThirdPersonUserControl = player.GetComponent(ThirdPersonUserControl);
playerThirdPersonCharacter = player.GetComponent(ThirdPersonCharacter);
cam1pers = GameObject.Find("camFPS");
cam1pers.SetActive(!cam1pers.activeSelf);// esto es por que el game inicia en TPS
cam3pers = GameObject.Find("camTPS");
msg = "Camara TPS activada";
}

function Update () {
if(Input.GetButtonDown("Fire2")){
   ChangeCam ();
}
}
function ChangeCam ()
{
playerRbdy.isKinematic = !playerRbdy.isKinematic;
playerCharacterController.enabled = !playerCharacterController.enabled;
playerFpsController.enabled = !playerFpsController.enabled;
playerCapsuleCollider.enabled = !playerCapsuleCollider.enabled;
playerThirdPersonUserControl.enabled = !playerThirdPersonUserControl.enabled;
playerThirdPersonCharacter.enabled = !playerThirdPersonCharacter.enabled;
cam1pers.SetActive(!cam1pers.activeSelf);
cam3pers.SetActive(!cam3pers.activeSelf);
if(cam1pers.activeSelf)
{
   player.SendMessage("InitFPSController");
   msg = "Camara FPS activada";
}
if(cam3pers.activeSelf){
   msg = "Camara TPS activada";
}
}
function OnGUI ()
{
GUI.skin.label.normal.textColor = Color.yellow;
GUILayout.Label(msg + "\n" + "usa el boton Fire2 para cambiar camara TPS/FPS (tecla ALT izquierda, o boton derecho del Mouse)");
}aquí la modificación del script FirstPersonController.cs:
 // inicia mod V1
 // Use this for initialization
        private void Start()
        {
      InitFPSController ();
        }
   public void InitFPSController ()
   {
      m_CharacterController = GetComponent<CharacterController>();
      m_Camera = Camera.main;
      m_AudioSource = GetComponent<AudioSource>();
      m_OriginalCameraPosition = m_Camera.transform.localPosition;
      m_FovKick.Setup(m_Camera);
      m_HeadBob.Setup(m_Camera, m_StepInterval);
      m_StepCycle = 0f;
      m_NextStep = m_StepCycle/2f;
      m_Jumping = false;
      m_MouseLook.Init(transform , m_Camera.transform);
   }
// fin de mod V1
y por cierto... #pragma strict
// A simple smooth follow camera,
// that follows the targets forward direction

var target : Transform;
var smooth = 0.3;
var distance = 5.0;
var camYpos : float = 2;
private var yVelocity = 0.0;

function LateUpdate () {
   // Damp angle from current y-angle towards target y-angle
   var yAngle : float = Mathf.SmoothDampAngle(transform.eulerAngles.y,
                               target.eulerAngles.y, yVelocity, smooth);
   // Position at the target
   var position : Vector3 = target.position;
   // Then offset by distance behind the new angle
   position += Quaternion.Euler(0, yAngle, 0) * Vector3 (0, 0, -distance);
   // Apply the position
   transform.position = position + transform.up * camYpos;

   // Look at the target
   transform.LookAt(target);
} ref: http://docs.unity3d.com/ScriptReference/Mathf.SmoothDampAngle.htmlTPS_y_FPS.unitypackage  

Bye Bye



Septiembre 01, 2015, 05:37:09 PM #16 Ultima modificación: Septiembre 01, 2015, 06:35:45 PM por Abramelin
si señor, eres un hacha, problema solucionado a la perfeccion, ademas me has ayudado mucho a entender ciertas funciones. Muchisimas gracias. Me ha quedado la duda de si el objeto camtarget3 que has puesto se esta utilizando, cuando miras en primera persona hacia arriba o abajo y haces el cambio, pasa bien a tercera, y al darle otra vez al cambio a 1 devuelve la ultima posicion que tenia la cam1 antes del cambio a tercera, es decir que si lo deje mirando hacia arriba en 1 me devuelve esa direccion al volver otra vez a 1. He desactivado entonces el camtarget3 y no ha habido ningun cambio, por eso me ha parecido que no tenia ninguna funcion, creia que el camtarget3 hacia la funcion del cubo para hacerle el lookat... perdon por mi torpeza.Por lo demas no creo que me de problemas, tendria que combinar todo el first y el third en un solo objeto player, pero es preferible asi.

Septiembre 01, 2015, 08:37:29 PM #17 Ultima modificación: Septiembre 01, 2015, 08:49:28 PM por Oak Human Flesh
[quote author=Abramelin" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="19433" data-ipsquote-contentcommentid="106645">si señor, eres un hacha, problema solucionado a la perfeccion, ademas me has ayudado mucho a entender ciertas funciones. Muchisimas gracias. Me ha quedado la duda de si el objeto camtarget3 que has puesto se esta utilizando, cuando miras en primera persona hacia arriba o abajo y haces el cambio, pasa bien a tercera, y al darle otra vez al cambio a 1 devuelve la ultima posicion que tenia la cam1 antes del cambio a tercera, es decir que si lo deje mirando hacia arriba en 1 me devuelve esa direccion al volver otra vez a 1. He desactivado entonces el camtarget3 y no ha habido ningun cambio, por eso me ha parecido que no tenia ninguna funcion, creia que el camtarget3 hacia la funcion del cubo para hacerle el lookat... perdon por mi torpeza.Por lo demas no creo que me de problemas, tendria que combinar todo el first y el third en un solo objeto player, pero es preferible asi.[/quote] El GameObject camtarget3 como su nombre lo indica es el target para la cámara en TPS, es usado por el script del objeto padre de la cámara TPS, luego si lo desactivas no hay diferencia por la sencilla razón de que sigue siendo hijo del player y a donde vaya su padre ira el, esto aun cuando este desactivado (pero no eliminado).es por lo que se puede apreciar al desactivar el Objeto hijo camtarget3, unity evita el romper el código heredado del player.por lo cual no se aprecia cambio alguno.ref: http://docs.unity3d.com/es/current/Manual/DeactivatingGameObjects.html   http://docs.unity3d.com/es/current/Manual/UpgradeGuide3540.htmlhttp://docs.unity3d.com/ScriptReference/GameObject.SetActive.htmlese comportamiento no ha sido siempre así, y quien sabe hasta cuando sera así .

Bye Bye



Septiembre 01, 2015, 10:00:30 PM #18 Ultima modificación: Septiembre 01, 2015, 10:05:51 PM por Oak Human Flesh
La solución para el problema de que la cámara FPS queda apuntando al ultimo lugar donde fue puesta es muy simple... resulta que al estar en TPS el objeto de cámara FPS específicamente su eje x en rotaciones no se actualiza y queda donde se le ordeno la ultima vez con el mouse o donde partio al inicio del game, con lo visto anteriormente sobre las rotaciones debieras poder solucionarlo fácilmente.  

Bye Bye



estoy intentando combinar first y third en el mismo objeto, pero tengo que renombrar algunos componentes del script y no se si la estoy liando... no estoy utilizando los scripts de standar assets para el controller en mi proyecto, por eso creo que deberia renombrarlos, pero te lo consulto por si acaso.en la imagen he marcado con puntos rojos los que creo que debería añadir al script (le he puesto una x roja a la linea que debería eliminar en sustitución de la que esta subrayada)
los que estan marcados en verde son exclusivos del antiguo objeto first, tambien deberia de añadirlos al script verdad? todos menos los que no estan marcados, ya que los comparten... es decir debería añadir al script solo los exclusivos tanto de first como de third no?luego esta el tema de los children de cada objeto que no los he tenido en cuenta hasta ahora... por ejemplo, cada player lleva una linterna distinta, el third la lleva unida a un hueso, y el first a la cam... me va a ser dificil meter ambos players y sus scripts en el mismo objeto, pero por intentarlo que no sea. gracias por la ayuda

Septiembre 02, 2015, 03:52:08 AM #20 Ultima modificación: Septiembre 02, 2015, 04:12:26 AM por Oak Human Flesh
Según el sistema de control que estes utilizando debes analizar que corresponde a cual cosa FPS o TPS, en mi caso como utilice los del standard assets actuales es mucho mas sencillo.en mi caso para cada componente que deseaba administrar he creado una variable para asignarle ese componente apropiadamente en la función Awake, luego en la función ChangeCam se procede a establecer su estado a lo contrario del estado actual, con lo cual se consigue que el mismo botón Fire2 sirva tanto como para activar asi como desactivar sin otras complicaciones, la base es esta:
//las var objeto y otroObjetoControlado pueden ser asignadas usando el inspector de Unity.
var objeto : GameObject;// objeto portador de los componentes que se desea controlar.
private  myComponente_A_Controlar : AlgunComponente;
var otroObjetoControlado : GameObject;
function Awake ()
{
    // se obtiene el componente a controlar y se almacena en la var componente_A_Controlar
    myComponente_A_Controlar = objeto.GetComponent(AlgunComponente);
}
function Update () {
    // cuando el boton Fire2 es presionado llama a la funcion ChangeCam.
if(Input.GetButtonDown("Fire2")){
   ChangeCam ();
}
}
function ChangeCam ()
{
    // se utiliza el estado actual del objeto para asignar a si mismo un valor contrario.
    // var tipo boolean.
    componente_A_Controlar.enabled = !componente_A_Controlar.enabled;
    // para gameObjects la cosa cambia un poco, pero la logica es la misma...
    // el estado del objeto (enabled or disabled) es asignado por lo contrario a su estado.
    otroObjetoControlado.SetActive(!otroObjetoControlado.activeSelf);
}
luego, el estado de cada componente (controlar su estado o no), depende de si este pudiera arrojar algún problema si no es desactivado, ya sea por un problema que pudiera causar un fallo total o si causaría un problema de rendimiento al tenerlo funcionando.eso creo que debe ser analizado por quien posee la idea y los scripts ;0 lo de las linternas es lo mas sencillo, no veo dificultad en dasctivarlas o incluso en cambiar su parent y sus rotaciones locales, evaluar que hacer es sencillo si un método causa alguna perdida de rendimiento.y por cierto si tu player va a partir en TPS en el inspector de unity deja todos los objetos listos (activados) para el TPS y  los del FPS desactivados, luego el script de cambio hará su magia cuando ejecutes el juego.

Bye Bye



Etiquetas: