0
votes

Comment savoir si le personnage du joueur est entré dans la gâchette ou d'autres objets avec un collisionneur?

Je construis un jeu 3D, et j'ai de l'eau dans la scène. Je m'en ai attaché à un collisionneur de déclenchement. Lorsque le collisionneur du personnage du joueur pénètre dans le collisionneur de déclencheur de l'eau, un son des éclaboussures jouera. Il en va de même lorsque le personnage quitte l'eau.

Maintenant, j'ai ajouté un autre enfant de collisionneur du joueur GameObject. Comme je m'attendais, maintenant lorsque le joueur entre dans l'eau, deux collidènes différents ont touché la gâchette afin de produire deux sons. Ce que je voudrais faire, c'est vérifier si le collisionneur qui a activé la gâchette est en réalité le joueur ou non, il ne peut donc que jouer le son une seule fois, comme il l'a fait avant et comme il devrait le faire. P>

C'est ce que j'ai essayé de faire. P>

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

public class Splashwater : MonoBehaviour
{
    public AudioSource audioSource;
    public AudioClip splashInWater;
    private bool isInTheWater = false;

    public GameObject player;

    private void OnTriggerEnter(Collision collision)
    {
        if (collision.gameObject == player)
        {
            audioSource.PlayOneShot(splashInWater);
        }
    }

    private void OnTriggerExit(Collision collision)
    {
        if (collision.gameObject == player)
        {
            audioSource.Stop();
            audioSource.PlayOneShot(splashInWater);
        }
    }
}


0 commentaires

3 Réponses :


-1
votes

Une façon dont vous pouvez y parvenir est avec des balises. Attribuez une étiquette au lecteur GameObject comme si:

 Entrez la description de l'image ici

Vous pouvez ajouter vos propres tags en supprimant la liste et en sélectionnant" Ajouter une étiquette ", Cliquez ensuite sur le bouton Small Plus pour ajouter votre propre tag:

Entrez la description de l'image ici

Vous pouvez ensuite vérifier si l'objet collectif a la "Player" étiquette comme ceci: xxx


2 commentaires

Ce raccourci l'identifiant et rend l'identifiant une chaîne magique. C'est pire que la solution actuelle de l'OP sur les deux cas.


Merci pour ton aide! :)



2
votes

Je ne sais pas si je comprends votre problème, mais on dirait que vous pouvez utiliser xxx pré>

au lieu de p> xxx pré>

vous Peut spécifier quelle collisionneur sera "responsable" pour déclencher l'audio. P>

Ontriggerenter peut être comme ceci: P>

 private void OnTriggerEnter(Collider collider)
    {
        if (collider == playerCollider)
        {
            audioSource.PlayOneShot(splashInWater);
        }
    }


1 commentaires

Merci beaucoup pour votre aide! Cela a parfaitement travaillé pour moi! :)



1
votes

Votre solution actuelle est déjà assez solide.

Il y a une petite erreur en ce que les procédés de déclenchement ont une signature différente pour ceux des collisions. Ils prennent collisionneur autre au lieu de collision collision . Je suppose que vous avez démarré du prototypage avec une collision et j'ai oublié de modifier les signatures de méthode une fois que vous avez changé le drapeau de déclenchement. Cela me semble souvent aussi, même après quelques années d'expérience de game-dev.

autre que ce correctif, je ne pense pas pouvoir offrir une amélioration significative de votre mise en œuvre spécifiquement. C'est déjà à peu près la façon dont cela devrait être fait.

si tétive, je vais vous offrir un peu de perspicacité à ne pas avoir à coder les choses à partir de zéro à chaque fois. Faisons votre système un peu plus réutilisable, allons-nous? Voici comment je ferais le code: xxx

là, vous pouvez désormais brancher ce script où et chaque fois que vous avez besoin d'une gâchette pour jouer audio, soyez-le sur n'importe quel Événement déclencheur (en définissant aucun collecte de cible) ou sur les événements Entrée et quitte par des collidènes "cible" spécifiques.

Ceci peut être encore modularisé pour fonctionner comme une gâchette pour toute action ou ensemble d'actions, pas seulement audio , en utilisant UnityEvent . Mais je laisserai cela comme un exercice pour vous.


1 commentaires

Avait déjà résolu le problème, mais votre réponse était très complète et si précise, je devais changer ma "réponse acceptée". Merci beaucoup, je vais maintenant essayer de comprendre ce code et l'appliquer à mon jeu :)