Objet qui ne se téléporte pas Unity c#
_rUBEN__
Messages postés
7
Date d'inscription
Statut
Membre
Dernière intervention
-
Bonjour,
Dans un projet Unity, j'ai un problème avec le joueur.
La mécanique principale et le fait de pouvoir changer de corps avec un pnj et prendre son esprit, bref.
Dans mon code, je voudrais que quand le joueur choisit de changer de corps, il se téléporte à celui ci : là est le problème
Chaque pnj et le joueur sont sous animation, et la téléportation ne fonctionne manifestement pas. Voici le code qui permet de gérer la téléportation et le choix de corps :
using UnityEngine; using UnityEngine.UI; using System.Collections.Generic; public class SoulTransferer : MonoBehaviour { private GameObject currentSoul = null; public GameObject arms; public LayerMask soulLayer; private float radius = 20f; private bool transfererOpened = false; public GameObject transfererCanvas; private float searchSoulsInterval = 0.5f; private float lastSoulSearch = 0f; public GameObject profilePictureParent; private List<GameObject> souls = new List<GameObject>(); private float transferInterval = 1f; private float lastTransfer; // Start is called once before the first execution of Update after the MonoBehaviour is created void Start() { ActivateArms(false); // désactive les bras car pas de corps au début if (transfererCanvas!=null)transfererCanvas.SetActive(false); // désactive le canvas de chois de corps lastTransfer = transferInterval; } // Update is called once per frame void Update() { if (arms==null || transfererCanvas==null || profilePictureParent==null) return; lastTransfer+=Time.deltaTime; if (Input.GetKeyDown(KeyCode.T)) transfererOpened = !transfererOpened; //ouvre ou ferme le canvas de choix de corps ManagerTransferer(); //gère le canvas } //dé/sactive les bras private void ActivateArms(bool activate) { arms.SetActive(activate); } //same pour le canvas private void ActivateTransferCanvas(bool activate) { transfererCanvas.SetActive(activate); transfererOpened = activate; } //cherche tous les corps possédant le layer "takableSoul" dans un rayon de 20 autour du joueur => souls private void FindAllTakableSouls() { souls.Clear(); Collider[] colliders = Physics.OverlapSphere(transform.position, radius, soulLayer); foreach (Collider collider in colliders) { if (collider.gameObject.GetComponent<NPC>().isAlive) souls.Add(collider.gameObject); } } //permet de mettre un délai entre chaque recherche de souls private void SearchSouls() { lastSoulSearch+=Time.deltaTime; if (lastSoulSearch>searchSoulsInterval) { lastSoulSearch = 0f; FindAllTakableSouls(); RefreshProfilePhotos(); } } //met à jour les photos de profil des souls présents private void RefreshProfilePhotos() { int i = 0; foreach (Transform emplacement in profilePictureParent.transform) { Button button = emplacement.GetComponent<Button>(); button.onClick.RemoveAllListeners(); // Vérification si l'index dépasse le nombre de souls disponibles if (i >= souls.Count) { emplacement.GetComponent<Image>().sprite = null; // Réinitialise l'image si aucune âme n'est disponible continue; } // Vérification que l'élément dans la liste 'souls' n'est pas null GameObject soul = souls[i]; if (soul != null) { Sprite pp = soul.GetComponent<NPC>().profilePhoto; Image image = emplacement.GetComponent<Image>(); image.sprite = pp; button.onClick.AddListener(() => ChooseSoul(soul)); // On passe directement 'soul' à la méthode } i++; // Incrémenter l'index pour passer au prochain emplacement } } //met le joueur dans le corps choisi, réactive les bras, désactive le canvas... private void ChooseSoul(GameObject newSoul) { if (newSoul!=null && lastTransfer>=transferInterval) { transform.position = newSoul.transform.position; //on va à la position du corps pris newSoul.SetActive(false); //on le désactive (car pris par le joueur) lastTransfer=0f; ActivateArms(true); ActivateTransferCanvas(false); if (currentSoul==null) //si avant ce corps le joueur n'en avait pas, alors la nouvelle ame devient sienne { currentSoul = newSoul; return; } //sinon, currentSoul.SetActive(true); currentSoul.GetComponent<NPC>().isAlive=false;//l'ancien corps meurt currentSoul.transform.position = transform.position;//il meurt au pied du joueur Animator anim = currentSoul.GetComponent<Animator>(); anim.SetTrigger("TakeSoul"); currentSoul = newSoul;// et la nouvelle âme devient celle du joueur } } //Manage tt private void ManagerTransferer() { if (transfererOpened) { if (!transfererCanvas.activeInHierarchy) ActivateTransferCanvas(true); SearchSouls(); Cursor.visible = true; Cursor.lockState = CursorLockMode.None; } else { Cursor.visible = false; Cursor.lockState = CursorLockMode.Locked; if (transfererCanvas.activeInHierarchy) ActivateTransferCanvas(false); } } }
Je ne sais pas si le problème vient du fait que les pnj et le joueurs soient animé, ou si il vient d'autre part.
Si quun sait comment résoudre ça ou peut m'éclairer, je suis preneur.
Merci
A voir également:
- Objet qui ne se téléporte pas Unity c#
- Vente objet occasion entre particulier - Guide
- Objet interdit en cabine ryanair - Guide
- Identifier un objet à partir d'une photo - Guide
- Mesurer un objet - Guide
- Ce document fait l'objet d'un trop grand nombre de modifications ✓ - Forum Word