Menu

Collisions de la caméra

Messages postés
791
Date d'inscription
dimanche 1 novembre 2015
Statut
Membre
Dernière intervention
3 avril 2019
- - Dernière réponse : LolixDudu
Messages postés
43
Date d'inscription
mercredi 20 juin 2018
Statut
Membre
Dernière intervention
13 avril 2019
- 13 avril 2019 à 21:37
Bonsoir,

Je me permets de solliciter votre aide puisque je n'arrive pas à comprendre pourquoi je n'obtiens pas le résultat voulu.

Je programme en C# sous le moteur de jeu Unity.

J'ai une caméra qui se déplace de façon autonome (elle n'est pas liée à un GameObject parent).
Cette caméra se déplace en fonction de son orientation en 3D, ZQSD pour le déplacement sur les axes x et z, EF pour les déplacements sur l'axe y.
Je n'obtient aucune collision avec d'autres objets, pourtant les nombreux objets ont bien un MeshCollider et un RigidBody.
Je voudrais tout simplement que la caméra soit bloquée par les éléments avec lesquels elle rentre en collision.

Voici le script pour le déplacement de la caméra :

using UnityEngine;

public class CameraController : MonoBehaviour
{
    public float vitesse = 20f;
    // Position de la caméra
    Vector3 pos;
    // Direction de vue de la caméra
    Vector3 vue;
    // Chemin à parcourir
    Vector3 chemin;

    private void Start()
    {
        pos = transform.position;
    }

    void Update()
    {

        vue = transform.forward;
        chemin = vue * vitesse * Time.deltaTime;

        if (Input.GetKey(KeyCode.Z))
            pos += new Vector3(chemin.x, 0, chemin.z);

        if (Input.GetKey(KeyCode.S))
            pos += new Vector3(-chemin.x, 0, -chemin.z);

        if (Input.GetKey(KeyCode.Q))
        {
            // Vecteur perpendiculaire à la direction de la vue de la caméra
            Vector2 temp = Vector2.Perpendicular(new Vector2(vue.x, vue.z));
            // Changement du repère de déplacement de la caméra
            vue = new Vector3(temp.x, 0, temp.y);
            chemin = vue * vitesse * Time.deltaTime;
            pos += new Vector3(chemin.x, 0, chemin.z);
        }

        if (Input.GetKey(KeyCode.D))
        {
            Vector2 temp = Vector2.Perpendicular(new Vector2(vue.x, vue.z));
            vue = new Vector3(temp.x, 0, temp.y);
            chemin = vue * vitesse * Time.deltaTime;
            pos += new Vector3(-chemin.x, 0, -chemin.z);
        }

        if (Input.GetKey(KeyCode.E))
            pos.y += vitesse * Time.deltaTime;

        if (Input.GetKey(KeyCode.F))
            pos.y -= vitesse * Time.deltaTime;

        transform.position = pos;
    }
}


J'ai bien conscience que c'est ce script qui interfère avec le bon fonctionnement des collisions.
Pour essayer de debugger j'ai mis ces lignes :
void OnCollisionEnter(Collision collision)
{
       Debug.Log("test");
}


Aucun message ne s'affiche dans la console et ma caméra traverse les murs :/

Merci à celui qui prendra le temps de m'expliquer mon erreur :)

Bonne soirée !
Afficher la suite 

Votre réponse

1 réponse

Messages postés
43
Date d'inscription
mercredi 20 juin 2018
Statut
Membre
Dernière intervention
13 avril 2019
0
Merci
Il faut que tu utilises la fonction transform.Translate.
En utilisant transform.position, ta camera se téléporte en fait, tu ne le vois pas car c'est minime

Voila un peu de doc :
https://docs.unity3d.com/ScriptReference/Transform.Translate.html

PS: oublie pas * Time.deltaTime pour que ce soit smooth
Commenter la réponse de LolixDudu