J'ai actuellement des objets générés à partir d'un préfabriqué et je tente de détruire un seul des éléments générés de ce préfabriqué. Je cherchais en ligne et j'ai trouvé des tonnes d'exemples différents, mais je n'ai pas réussi à les faire fonctionner. J'ai essayé de configurer une instance de l'Instantiate et de détruire cette instance, mais je ne parviens pas à la faire fonctionner. Le script spawn / collision est attaché à la caméra principale si cela compte. Collision avec d'autres éléments de mon travail de jeu et le préfabriqué a un collisionneur de boîte défini sur isTrigger. Encore une fois, je sais qu'il y a beaucoup d'exemples expliquant cela, etc., mais je ne peux pas le faire fonctionner et peut-être que je ne comprends pas ce que je devrais faire réellement.
Code du générateur:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class destroyVial : MonoBehaviour
{
void OnTriggerEnter(Collider col)
{
if (col.gameObject.tag == "vials")
{
Destroy(col.gameObject);
Debug.Log("yell");
}
}
}
3 Réponses :
OnTriggerEnter doit être sur un script attaché à l'objet avec lequel il entre en collision, ou au flacon lui-même. Il ne peut pas être sur la caméra principale car OnTriggerEnter ne sera jamais appelé.
Comment pourrais-je faire cela étant donné que le préfabriqué n'est techniquement pas dans la scène? Je pourrais encore y ajouter une simple collision, mais comment pourrais-je appeler l'instance de l'autre script pour vérifier si elle est entrée en collision avec elle. (L'instance étant des flacons)
Je vois que vous créez des choses dans une boucle for et que vous écrasez la variable vialss à chaque fois:
List<GameObject> spawnedVials = new List<GameObject>();
void SpawnVials()
{
for (int i = 0; i < numOfVials; i++)
{
var vial = Instantiate<GameObject>(vialOfBlood,
SpawnPosition(),
Quaternion.identity)
spawnedVials.Add(vial);
}
}
Et puis, en cas de collision, vous Détruisez vialss , qui dans ce cas sera le dernier objet engendré. Et si vous entrez en collision avec quoi que ce soit après 1 collision, vialss sera déjà supprimé et lèvera probablement une exception. Peut-être que c'est bien dans votre jeu, mais la logique semble un peu imparfaite.
De plus, je suppose que vous voulez détruire l'objet avec lequel vous êtes en collision? Est-ce que quelque chose comme ça ne fonctionne pas?
void OnTriggerEnter(Collider col)
{
if (col.gameObject.tag == "vials")
{
Destroy(col.gameObject); // <== Remove colliding object
Debug.Log("yell");
}
}
Si, pour une raison quelconque, vous avez besoin d'une liste de tous vos flacons générés, vous aimeriez peut-être la convertir en liste à la place:
for (int i = 0; i < numOfVials; i++)
{
vialss = Instantiate(vialOfBlood,
SpawnPosition(),
Quaternion.identity) as GameObject;
}
assurez-vous que la détection de collision fonctionne. Vous dites que le script est attaché à votre caméra. veuillez vous assurer que vous avez un collisionneur sur la caméra. Mais vous dites que d'autres collisionneurs fonctionnent, donc je suppose que vous avez cela sous contrôle.
Je suppose que votre problème réside dans la logique erronée que j'ai initialement décrite.
J'ai essayé cet objet Destroy avant d'essayer cette solution en utilisant le flacon. Et oui, mon script est sur la caméra. Cependant, le script de collision fait partie du script de spawn, par conséquent, la collision ne concerne pas l'élément avec lequel je suis en collision. Je n'ai pas le script sur le préfabriqué car d'une part, il n'est pas dans la hiérarchie même si cela ne devrait faire aucune différence. Mais plus important encore, deuxièmement, je ne sais pas comment vérifier si les flacons sont entrés en collision avec un script séparé. Les flacons sont définis dans le spawn et j'aurais besoin de l'utiliser d'une manière ou d'une autre lors de la collision.
Et merci d'avoir noté l'utilisation d'une liste, et je l'utiliserai une fois que je serai en mesure de faire fonctionner la collision
Qu'est-ce qui vous empêche de le faire normalement? Ajouter le OnTriggerEnter sur l'objet qui fait réellement partie de la collision?
Si je prends l'exemple de void on collider que vous avez fourni et qui est généralement ce que j'ai utilisé à l'origine, placez-le dans un script par lui-même et attachez ce script au préfabriqué qu'il ne fait pas en cas de collision
Je suppose qu'aucun des objets n'a de corps rigide, ce qui ne permet pas la détection de collision. Si vous ne voulez pas de physique sur l'objet, modifiez simplement les paramètres du corps rigide pour qu'ils ne soient pas simulés physiquement.
Cela devient une longue conversation pour la section des commentaires. Mais j'ai un collisionneur de boîte réglé sur le déclenchement sur le flacon avec le collisionneur de mailles désactivé, activé ou désactivé ne fait aucune différence dans le fonctionnement. J'ai cette même chose installée sur un GameObject stable et immobile dans le monde et cette collision fonctionne très bien. Même code utilisé pour tout détruire. Revérifié pour voir si la balise était correcte et tout. Je ne vois pas ce qui pourrait ne pas aller nulle part. Même préfabriqué supprimé et refait juste pour être sûr.
Vous êtes-vous assuré que l'un des objets a un Rigidbody? Ils ne se déclencheront que si l'un des objets possède un Rigidbody.
Le joueur a actuellement un Rigidbody dessus, le flacon a un collisionneur de boîte avec un ensemble isTrigger qui est essentiellement la configuration
Le code OnTriggerEnter doit donc être sur le lecteur, pas sur la caméra.
C'est sur le flacon, j'ai pris la pointe pour scinder les scripts donc je l'ai fait. Le script pour le frai de l'objet est sur la caméra. Le flacon (le préfabriqué qui n'est nulle part dans la hiérarchie car il n'y a aucune utilité) a son propre script qui lui est attaché (le code de destruction contenant le OnTriggerEnter). Si vous le souhaitez, je pourrais modifier la question en indiquant comment et où tout est configuré.
J'ai fait fonctionner ça. J'ai dû créer un Rigidbody supplémentaire sur l'objet à détruire, donc il y avait un collisionneur de boîte avec isTrigger et un RigidBody. La création de la liste a également bien fonctionné, bien que parfois l'enregistrement de la collision soit un peu lent, mais c'est peut-être parce que j'en ai tellement de frai à la fois.
Je vous recommande de conserver les scripts pour un seul travail, vous devriez diviser ce script en un script Spawn et un script Collider. Et créez un GameObject vide dans le seul but de générer des préfabriqués. Il y a aussi des erreurs dans votre code:
void SpawnVials()
{
for (int i = 0; i < numOfVials; i++)
{
vialsInstantiated.Add(Instantiate(vialOfBlood, SpawnPosition(), Quaternion.identity) as GameObject);
}
}
De plus, la variable vialss ne fait pas ce que vous attendez, vialss fait uniquement référence au dernier flacon instancié, il vaut donc mieux enregistrer tous les flacons dans un Liste:
List<GameObject> vialsInstantiated = new List<GameObject>();
Et puis:
void OnTriggerEnter(Collider col)
{
if (col.gameObject.tag == "vials")
{
Destroy(col.gameObject); // Destroy the gameObject you're colliding with
Debug.Log("yell");
}
}