Détection collisions Unity ne marche pas

_rUBEN__ Messages postés 6 Date d'inscription samedi 2 mars 2024 Statut Membre Dernière intervention 6 novembre 2024 - 6 nov. 2024 à 14:52


Bonjour, je suis en train de créer un fps sur Unity.

J'ai un personnage, avec des mains placés en enfant de la caméra du joueur, et une simple capsule pour le corps (qu'on ne voit donc pas à la caméra). J'ai essayé d'ajouté un collider aux mains, un autre sur le joueur, un autre sur son corps... N'import où cela ne fonctionne pas, il n'y a que le collider de la capsule qui est pris en compte j'ai l'impression.

Par conséquent, quand je suis proche d'un mur, les bras rentre dedans, item pour quand je porte une arme, elle rentre dans les murs.

Sur la photo on voit les composants du player.

Si besoin voilà le script de déplacement du joueur (PlayerMovements sur l'image) : 

using UnityEngine;

public class PlayerMovements : MonoBehaviour
{
    [Header("To assign")]
    public GameObject arms;
    public Inventory inventory;
    public Transform camera;

    [Header("Debug")]
    [SerializeField] private Camera playerCamera;
    [SerializeField] private CharacterController characterController;
    public Animator armsAnim;

    [SerializeField] private float walkingSpeed = 4.0f;
    [SerializeField] private float runningSpeed = 5.6f;
    [SerializeField] private float jumpSpeed = 5.0f;
    [SerializeField] private float gravity = 20f;
    [SerializeField] private float weight = 60f;

    [SerializeField] private bool canMove = true;
    [SerializeField] private bool inVehicle = false;
    [SerializeField] private bool isWalking = false;
    [SerializeField] private bool isJumping = false;

    [SerializeField] private Vector3 moveDirection;
    [SerializeField] private float rotationX = 0;
    [SerializeField] private float rotationSpeed = 2.0f;
    [SerializeField] private float rotationXLimit = 90.0f;

  
    // Start is called before the first frame update
    void Start()
    {
        Cursor.visible = false;
        Cursor.lockState = CursorLockMode.Locked;
        characterController = GetComponent<CharacterController>();
        playerCamera = camera.GetComponent<Camera>();
        armsAnim = arms.GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {

        Vector3 forward = transform.TransformDirection(Vector3.forward);
        Vector3 right = transform.TransformDirection(Vector3.right);

        //Est-ce qu'on appuie sur un bouton de direction ?
        float speedZ = Input.GetAxis("Vertical");
        float speedX = Input.GetAxis("Horizontal");
        float speedY = moveDirection.y;

        isWalking = (speedZ != 0 || speedX != 0);

        if (inventory!=null)
        {
            armsAnim.SetBool("CarriesRifle", inventory.GetCarried()!=null && inventory.GetCarried().GetComponent<Item>().itemData.type=="Firearm" && inventory.GetCarried().GetComponent<Firearm>().firearmData.subtype=="Rifle");
            armsAnim.SetBool("CarriesGrenade", inventory.GetCarried()!=null && inventory.GetCarried().GetComponent<Item>().itemData.type=="Grenade");
            armsAnim.SetBool("CarriesPistol", inventory.GetCarried()!=null && inventory.GetCarried().GetComponent<Item>().itemData.type == "Firearm" && inventory.GetCarried().GetComponent<Firearm>().firearmData.subtype=="Pistol");
        }

        // Multiplie la vitesse par la vitesse appropriée (course ou marche)
        float moveSpeed = walkingSpeed;
        //float percent = (inventory.GetWeight() / weight) * 100f;
        speedX *= moveSpeed;
        speedZ *= moveSpeed;
        //print($"{speedX}, {speedX * (100f-3*percent)/100f}");
        //speedX *= (100f-5*percent)/100f;
        //speedZ *= (100f-5*percent)/100f;

        //Calcul du mouvement
        moveDirection = (forward * speedZ + right * speedX);

        // Est-ce qu'on appuie sur le bouton de saut (ici : Espace) et est au sol
        if (Input.GetButton("Jump") && characterController.isGrounded)
        {
            moveDirection.y = jumpSpeed;
            isJumping = true;
        }
        else if (characterController.isGrounded)
        {
            moveDirection.y = 0;
            isJumping = false;
        }
        else
        {
            // Applique la gravité
            moveDirection.y = speedY;
            moveDirection.y -= gravity * Time.deltaTime;
        }

        //Applique le mouvement
        
        if (canMove)
        {
            characterController.Move(moveDirection * Time.deltaTime);
            //Rotation de la caméra
            rotationX += -Input.GetAxis("Mouse Y") * rotationSpeed;
            rotationX = Mathf.Clamp(rotationX, -rotationXLimit, rotationXLimit);
            playerCamera.transform.localRotation = Quaternion.Euler(rotationX, 0, 0);

            // Applique la rotation gauche/droite sur le Player
            transform.rotation *= Quaternion.Euler(0, Input.GetAxis("Mouse X") * rotationSpeed, 0);
        }
        else
        {
            moveDirection = new Vector3(0, 0, 0);
        }
    }

    public void SetInVehicle(bool iv)
    {
        inVehicle = iv;
    }


    public bool IsInVehicle()
    {
        return inVehicle;
    }
}

Si quelqu'un peut m'aider, car là je suis coincé pour détecter les collisions de balles c'est compliqué.

Merci