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