_rUBEN__
Messages postés6Date d'inscriptionsamedi 2 mars 2024StatutMembreDerniè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é.