J'ai eu ce problème avec mon jeu actuel.
Eh bien, le problème est que lorsque mon joueur (Rocket) entre en collision avec Asteroid (Enemy), le joueur est censé mourir et redémarrer le niveau mais cela ne fonctionne pas même pensé que j'avais mis mon joueur avec un collisionneur de boîte sans déclencheur et mon astéroïde avec déclencheur et un collisionneur circulaire. J'ai également essayé de mettre l'astéroïde avec déclencheur et le joueur sans déclencheur et les deux avec des déclencheurs, mais ma fusée passe juste par l'astéroïde à chaque fois. Il n'y a aucune erreur dans la fenêtre de la console. Et ci-dessous se trouve le code que j'utilise pour cela. avoir un composant "Rigibody" sur le et lorsque le joueur entre en collision avec l'astéroïde, il disparaît et ne redémarre pas et j'ai commencé à écrire un point de réapparition mais l'erreur qui apparaît est "erreur CS1955: Membre non invocable 'Transform.position 'ne peut pas être utilisé comme une méthode. " Voici le code mis à jour.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Movement : MonoBehaviour
{
public float speed = 6.0f;
public GameObject character;
private Animator anim;
private Vector3 Respawnpoint;
private void OnCollisionEnter2D(Collision2D collision)
{
switch (collision.gameObject.tag)
{
case "Enemy":
Destroy(gameObject);
break;
default:
//nothing
break;
}
}
void Start()
{
anim = GetComponent<Animator>();
Respawnpoint = transform.position();
}
void Update()
{
if (Input.anyKey)
{
transform.Translate(Vector3.forward * Time.deltaTime * speed);
}
if (Input.GetKeyDown(KeyCode.D))
{
transform.position += Vector3.right * speed * Time.deltaTime;
anim.SetBool("Isright", true);
}
if (Input.GetKeyDown(KeyCode.A))
{
transform.position += Vector3.left * speed * Time.deltaTime;
anim.SetBool("Isleft", true);
}
if (Input.GetKey(KeyCode.RightArrow))
{
transform.position += Vector3.right * speed * Time.deltaTime;
anim.SetBool("Isright", true);
}
if (Input.GetKey(KeyCode.LeftArrow))
{
transform.position += Vector3.left * speed * Time.deltaTime;
anim.SetBool("Isleft", true);
}
else
{
}
}
}
3 Réponses :
Vous mettez le vide OnTriggerEnter2D (Collider2D other) dans la mise à jour. L'avez-vous écrit correctement?
Je pense que le problème dans votre code est que votre condition gameObject.tag est un peu fausse. Je suggère de le changer en collision.gameObject.tag . Aussi, je pense qu'il est préférable de placer votre void OnTriggerEnter2D (Collider2D other) en dehors de la void Update () . Veuillez répondre si cette solution fonctionne.
Mise à jour: vous pouvez écrire quelque chose comme ceci:
using UnityEngine.SceneManagement;
...
private void OnCollisionEnter2D(Collision2D collision)
{
int sceneIndex = SceneManager.GetActiveScene().buildIndex;
switch (collision.gameObject.tag)
{
case "Enemy":
Destroy(gameObject);
SceneManager.LoadScene(sceneIndex);
break;
default:
//nothing
break;
}
}
Je vous suggère d'utiliser OnCollisionEnter2D au lieu de OnTriggerEnter2D car les déclencheurs sont généralement censés être objets invisibles que vous pouvez parcourir.
Les déclencheurs seraient corrects si vous ne voulez pas que l'astéroïde dévie de sa trajectoire.
Cela dépend s'il l'a détruit, vous voudrez peut-être qu'il continue sur sa voie en tant que gagnant
J'ai mis à jour le code et cela fonctionne mais le seul problème est que le lecteur ne réapparaît pas.
Vous devrez ajouter du code supplémentaire si vous voulez que le joueur réapparaisse. Je vous suggère de charger simplement le niveau qui a été joué à nouveau.
Comme les autres l'ont souligné, le code est mal structuré.
Dans votre mise à jour, vous avez votre méthode de déclenchement. En conséquence, il ne sera jamais appelé
Vous devez simplement supprimer les 2 lignes de void update () et ses parenthèses ouvrantes suivantes. Et la dernière parenthèse fermante pour la méthode afin que la méthode de déclenchement soit seule dans la classe.
En supposant que vous ayez un Rigidbody2D et que vous ayez défini un déclencheur, cela devrait fonctionner.
Je suggérerais également qu'il y ait place à l'amélioration dans le code, mais plutôt que de choisir un peu, abordons le problème principal
Ok merci pour ce commentaire. Je suis ici pour apprendre, donc s'il y a d'autres critiques, dites-moi si je veux m'améliorer :)
Bien. Si vous détruisez l'objet de jeu, il n'y a pas grand chose à vous soucier de le déplacer. Le code pour le déplacer devrait probablement être en mise à jour ou en mise à jour fixe. Ou voulez-vous vraiment que le code se produise uniquement pendant qu'il est en contact?
Lorsque le joueur interagit avec l'astéroïde, je veux juste qu'il redémarre. L'astéroïde se déplacera à l'avenir, mais pour le moment, je veux juste que le joueur redémarre lorsque l'astéroïde est touché.
Avez-vous un
RigidBodysur au moins un de vos objets en collision?OnTriggerEnteret les tris ne fonctionnent que si au moins un est présent.Également. Je viens de lire votre code et je ne peux pas croire qu'il n'y a pas de message d'erreur. Vous avez imbriqué deux fonctions l'une dans l'autre. Cela ne fonctionnera certainement pas!