2017-01-19 2 views
0

Je suis en train de créer un jeu de la 3ème personne pour un projet d'école mais j'ai quelques problèmes avec les collisions: j'ai un joueur avec une caméra comme un enfant qui a un collisionneur de sphères. Lorsque l'appareil photo entre en collision avec des objets de paysage tels que des maisons, il doit effectuer un zoom arrière. Une fois qu'il quitte la situation de collision, il devrait revenir à son ancienne position (son y local devrait être de 4,5). Maintenant, j'ai le problème suivant quand je suis immobile: la caméra quitte et entre constamment dans le collisionneur de l'objet, ce qui lui permet de continuer à zoomer avant et arrière. Cela se traduit par un mouvement de caméra vraiment glitchy. Y a-t-il un moyen de résoudre ce problème?Unity: Camera Collider

J'ai utilisé le code suivant:

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 



public class CamMovement : MonoBehaviour 
{ 
    public GameObject Parent; 

    //Checks if the camera collides with something 
    void OnTriggerStay(Collider other) 
    { 
     //When colliding, the camera moves up and back from the player object   
     transform.position += new Vector3(0, 0.2f, -0.2f);  
    } 


    void Update() 
    { 
     //makes sure the camera always looks at the player object 
     transform.LookAt(Parent.transform); 

     //Moves the camera back to the normal (local) position 
     if (transform.localPosition.y > 4.5f) 
     { 
      transform.position += new Vector3(0, Time.deltaTime * -4f, Time.deltaTime * 4f); 
     } 
    } 
} 

Vidéos de quoi il ressemble lorsque l'appareil entre en collision avec quelque chose: http://imgur.com/a/7ot9R

+0

Vous pouvez mettre une étiquette sur l'objet joueur, puis l'obtenir est collisionneur de la caméra et faire 'si (autre == playerCollider!) {zoomout();}' Si cela résout votre problème s'il vous plaît faites le moi savoir et je vais l'écrire comme une bonne réponse. –

+0

Si une réponse a résolu votre problème, s'il vous plaît envisager de l'accepter comme le bon. _ (Accepter une réponse aide les futurs visiteurs à venir sur cette page) _ – Kardux

Répondre

1

Vous devez vérifier que collisionneur est entré en collision avec le collisionneur de la caméra, vous pouvez obtenir cela en utilisant une structure quelque chose comme ceci dans votre OnColliderEnter(Collider other):

Collider playerCollider = GameObject.Fine("Player").GetComponent<Collider>(); 
if (!other == playerCollider) 
{ 
//Do your zooming out. 
} 
0

Je ne sais pas si je comprends bien ce que vous voulez atteindre correctement mais je vais donnez-moi un coup:

Je pense que vous devriez plutôt regarder dans OnTriggerEnter et OnTriggerExit événement afin que vous puissiez dire à la caméra de s'éloigner lorsque le déclencheur est entré et reculer quand il est sorti.

public class CamMovement : MonoBehaviour 
{ 
    //using "parent" as variable name is not recommended since Transform class already contains a parent variable 
    [SerializeField] 
    private GameObject parentToLookAt; 
    [SerializeField] 
    private Vector3 localPositionOffset; 
    [Range(0.0f, 10.0f)] 
    [SerializeField] 
    private float transitionSpeed; 

    private Vector3 localPositionOnStart; 
    private bool applyOffset; 

    void Start() 
    { 
     localPositionOnStart = transform.localPosition; 
     applyOffset = false; 
    } 

    void Update() 
    { 
     //Makes sure the camera always looks at the player object 
     //You can also use: transform.LookAt(transform.parent); 
     transform.LookAt(parentToLookAt.transform); 

     //Moves the camera to the right local position (note that using Mathf.Lerp is not optimal performance-wise but if you want more info on this 
     //I recommend looking for further informations at https://chicounity3d.wordpress.com/2014/05/23/how-to-lerp-like-a-pro/) 
     if (applyOffset) 
     { 
      transform.localPosition = Mathf.Lerp(transform.localPosition, localPositionOnStart + localPositionOffset, transitionSpeed * Time.deltaTime); 
     } 
     else 
     { 
      transform.localPosition = Mathf.Lerp(transform.localPosition, localPositionOnStart, transitionSpeed * Time.deltaTime); 
     } 
    } 

    //Checks if the camera collides with something 
    void OnTriggerEnter(Collider other) 
    { 
     applyOffset = true; 
    } 

    //Checks if the camera stops colliding with something 
    void OnTriggerExit(Collider other) 
    { 
     applyOffset = false; 
    } 

    //You can also use this: 
    //void OnTriggerStay(Collider other) 
    //{ 
    // applyOffset = true; 
    //} 
    // and set applyOffset to false at the end of the Update() method (OnTrigger events are called before Update each frame) 
} 

Deux choses:

  • lors de la programmation en C#, il est une règle commune de ne pas utiliser une lettre majuscule pour commencer un nom de variable (ce qui est réservée aux noms de classe): vous pouvez vérifier here pour lignes directrices globales
  • vous pouvez également utiliser l'attribut [SerializeField] pour sérialiser une variable privée (et ainsi la faire apparaître dans l'inspecteur). J'ai également ajouté l'attribut [Range()] qui est utile lorsque l'on travaille avec des designers (ils n'aiment pas les chiffres bruts;))
+0

Je peux me tromper, mais je pense que vous avez mal compris la question. –

+0

@JamesHughes Ouais je n'étais pas sûr: je ne sais pas si le problème était que le collisionneur était en collision avec quoi que ce soit (ce qui nécessite un test rapide comme dans votre réponse (et est valide même dans le mien: test devrait toujours être fait pour éviter toute collision indésirable)). Ou peut-être était-ce juste que le Camera Collider n'entrait plus en collision quand la caméra s'éloignait du lecteur pour qu'il se remette à bouger, puis n'arrêtait pas de bouger d'avant en arrière (impossible de savoir comment la hiérarchie était organisée de la question ...). – Kardux