Page 1 sur 1

[Résolu] Comment faire pour qu'un objet puisse tenir en lévitation devant la caméra

Publié : 18 Jan 2018 13:12
par Argoss
Bonjour !
Je suis en train de développer un petit jeu en FPS et je bloque sur une petit fonctionnalité. J'aimerai implémenter un script qui permette de "porter" un objet dans le sens où lorsque je reste appuyé sur une touche, il se met à flotter en lévitation devant ma camera, quelle que soit l'orientation de la camera.
j'ai déjà un script qui fonctionne mais à moitié : mon objet est bien à hauteur de caméra, il reste bien en lévitation mais ne suit pas l'orientation de la caméra, je n'arrive pas à utiliser le repère orthonormé propre à celle-ci.

voici mon code :

Code : Tout sélectionner

void Update()
 {
     if (Input.GetKey(KeyCode.F) && m_triggered)
     {
         this.transform.position = new Vector3(m_PlayerTransform.position.x, m_PlayerTransform.position.y, m_PlayerTransform.position.z + 2f);
     }
 }
le Script est appliqué sur l'objet à soulever.

Re: Comment faire pour qu'un objet puisse tenir en lévitation devant la caméra

Publié : 18 Jan 2018 14:02
par boubouk50
Tout simplement, tu pourrais le parenter à la caméra avec une position prédéfinie. Puis le remettre à sa place après.

Re: Comment faire pour qu'un objet puisse tenir en lévitation devant la caméra

Publié : 22 Jan 2018 11:26
par Argoss
En effet merci ! ça commence à mieux fonctionner.

Ma caméra n'est pas fixe (c'est un FPSController) du coup y a encore quelques comportements gênants quand je bouge. je vais essayer de jouer avec la propriétés du rigidBody de l'objet que je déplace pour éviter les désagréments.

Re: Comment faire pour qu'un objet puisse tenir en lévitation devant la caméra

Publié : 22 Jan 2018 17:15
par Argoss
Me revoilà ! j'ai trouvé une solution qui me convient parfaitement en m'inspirant de l'utilisation du ViewportPointToRay de ma camera :

Code : Tout sélectionner

 void Update()
    {
        RaycastHit hit;
        Ray ray = camera.ViewportPointToRay(new Vector3(0.5F, 0.5F, 0));

        if (Physics.Raycast(ray, out hit))
        {
            Transform objecthit = hit.transform;
            if (m_PropLocked)
            {
                GestionProps(m_LastHitObject);
            }
            else
            {
                if (objecthit.tag == "Player")
                {

                }
                else
                {
                    m_TargetName.text = objecthit.name;
                    if (objecthit.tag == "Prop")
                    {
                        m_LastHitObject = objecthit;
                        GestionProps(objecthit);
                    }
                }
            }
        }
        else
        {
            m_TargetName.text = "Nothing";
        }
        
        private void GestionProps(Transform objecthit)
    {

        if (Input.GetKey(KeyCode.F))
        {
            m_PropLocked = true;
            objecthit.position = camera.ViewportToWorldPoint(new Vector3(0.5F, 0.4F, 3f));
            objecthit.eulerAngles = transform.eulerAngles;

        }
        else
        {
            m_PropLocked = false;
        }
    }
    }
J'ai modifié la gestion du script du coup, il n'est plus attaché à l'objet à porter mais au FpsController.