J'ai suivi les tutoriels de Brackeys pour créer un jeu 2D et en ce moment je suis en animation. L'animation joue, il attaque, le sprite retourne dans les deux sens, etc. mais toujours coincé au même endroit. J'ai regardé et revu le didacticiel et je n'arrive pas à le comprendre.
Avant d'ajouter une animation, tout fonctionnait parfaitement. Il s'est déplacé sur l'écran, il a sauté, etc. Donc je sais que le fait de ne pas bouger est directement lié à essayer d'animer
Voici mon script de mouvement de jeu que j'ai créé en suivant son tutoriel.
XXX
Ceci est mon contrôleur de personnage
public class CharacterController2D : MonoBehaviour { [SerializeField] private float m_JumpForce = 400f; // Amount of force added when the player jumps. [Range(0, 1)] [SerializeField] private float m_CrouchSpeed = .36f; // Amount of maxSpeed applied to crouching movement. 1 = 100% [Range(0, .3f)] [SerializeField] private float m_MovementSmoothing = .05f; // How much to smooth out the movement [SerializeField] private bool m_AirControl = false; // Whether or not a player can steer while jumping; [SerializeField] private LayerMask m_WhatIsGround; // A mask determining what is ground to the character [SerializeField] private Transform m_GroundCheck; // A position marking where to check if the player is grounded. [SerializeField] private Transform m_CeilingCheck; // A position marking where to check for ceilings [SerializeField] private Collider2D m_CrouchDisableCollider; // A collider that will be disabled when crouching const float k_GroundedRadius = .2f; // Radius of the overlap circle to determine if grounded private bool m_Grounded; // Whether or not the player is grounded. const float k_CeilingRadius = .2f; // Radius of the overlap circle to determine if the player can stand up private Rigidbody2D m_Rigidbody2D; private bool m_FacingRight = true; // For determining which way the player is currently facing. private Vector3 m_Velocity = Vector3.zero; [Header("Events")] [Space] public UnityEvent OnLandEvent; [System.Serializable] public class BoolEvent : UnityEvent<bool> { } public BoolEvent OnCrouchEvent; private bool m_wasCrouching = false; private void Awake() { m_Rigidbody2D = GetComponent<Rigidbody2D>(); if (OnLandEvent == null) OnLandEvent = new UnityEvent(); if (OnCrouchEvent == null) OnCrouchEvent = new BoolEvent(); } private void FixedUpdate() { bool wasGrounded = m_Grounded; m_Grounded = false; // The player is grounded if a circlecast to the groundcheck position hits anything designated as ground // This can be done using layers instead but Sample Assets will not overwrite your project settings. Collider2D[] colliders = Physics2D.OverlapCircleAll(m_GroundCheck.position, k_GroundedRadius, m_WhatIsGround); for (int i = 0; i < colliders.Length; i++) { if (colliders[i].gameObject != gameObject) { m_Grounded = true; if (!wasGrounded) OnLandEvent.Invoke(); } } } public void Move(float move, bool crouch, bool jump) { // If crouching, check to see if the character can stand up if (!crouch) { // If the character has a ceiling preventing them from standing up, keep them crouching if (Physics2D.OverlapCircle(m_CeilingCheck.position, k_CeilingRadius, m_WhatIsGround)) { crouch = true; } } //only control the player if grounded or airControl is turned on if (m_Grounded || m_AirControl) { // If crouching if (crouch) { if (!m_wasCrouching) { m_wasCrouching = true; OnCrouchEvent.Invoke(true); } // Reduce the speed by the crouchSpeed multiplier move *= m_CrouchSpeed; // Disable one of the colliders when crouching if (m_CrouchDisableCollider != null) m_CrouchDisableCollider.enabled = false; } else { // Enable the collider when not crouching if (m_CrouchDisableCollider != null) m_CrouchDisableCollider.enabled = true; if (m_wasCrouching) { m_wasCrouching = false; OnCrouchEvent.Invoke(false); } } // Move the character by finding the target velocity Vector3 targetVelocity = new Vector2(move * 10f, m_Rigidbody2D.velocity.y); // And then smoothing it out and applying it to the character m_Rigidbody2D.velocity = Vector3.SmoothDamp(m_Rigidbody2D.velocity, targetVelocity, ref m_Velocity, m_MovementSmoothing); // If the input is moving the player right and the player is facing left... if (move < 0 && !m_FacingRight) { // ... flip the player. Flip(); } // Otherwise if the input is moving the player left and the player is facing right... else if (move > 0 && m_FacingRight) { // ... flip the player. Flip(); } } // If the player should jump... if (m_Grounded && jump) { // Add a vertical force to the player. m_Grounded = false; m_Rigidbody2D.AddForce(new Vector2(0f, m_JumpForce)); } } private void Flip() { // Switch the way the player is labelled as facing. m_FacingRight = !m_FacingRight; // Multiply the player's x local scale by -1. Vector3 theScale = transform.localScale; theScale.x *= -1; transform.localScale = theScale; } private void OnCollisionEnter2D(Collision2D collision) { if(collision.gameObject.tag == "Enemy") { Destroy(collision.gameObject); } } }
3 Réponses :
Vous pouvez vérifier les valeurs de horizontalMove
lors du débogage ou ajouter une instruction Debug.Log
pour vérifier sa valeur pendant le test, juste pour vous assurer que la valeur est bien ce qui est prévu.
Assurez-vous également que le contrôleur
a été attribué.
Il est probablement un peu tard pour aider l'OP maintenant, mais j'ai eu exactement le même problème aujourd'hui et je l'ai finalement résolu. J'étais en train de redimensionner l'objet principal pour certaines de mes animations. Pour résoudre ce problème, je suis entré et j'ai supprimé toute mise à l'échelle de l'objet conteneur principal et j'ai plutôt mis à l'échelle les objets internes individuellement et maintenant le retournement fonctionne.
Il est clair que la mise à l'échelle de l'animation interfère avec la mise à l'échelle du retournement du contrôleur.
Essayez ce code mais assurez-vous que le personnage a un 2DRigidbody et un 2DBoxcollider et faites attention que le script porte le nom "Character2DController" J'espère que cela vous aidera;)
using UnityEngine; public class Character2DController : MonoBehaviour { public float MovementSpeed = 1; public float JumpForce = 1; public Animator animator; private bool facingRight; private Rigidbody2D _rigidbody; void Start() { facingRight = true; _rigidbody = GetComponent<Rigidbody2D>(); } void Update() { if (Input.GetAxis("Horizontal") < 0) { transform.localScale = new Vector2 (-1.5f, transform.localScale.y); } if (Input.GetAxis("Horizontal") > 0) { transform.localScale = new Vector2(1.5f, transform.localScale.y); } var movement = Input.GetAxis("Horizontal"); transform.position += new Vector3(movement, 0, 0) * Time.deltaTime * MovementSpeed; animator.SetFloat("Movement Speed", Mathf.Abs(movement)); { } if ((Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.W) || Input.GetButtonDown("Jump")) && Mathf.Abs(_rigidbody.velocity.y) < 0.001f) { _rigidbody.AddForce(new Vector2(0, JumpForce), ForceMode2D.Impulse); } }`enter code here`
}
Votre console affiche-t-elle des erreurs? Peut-être que vous ne configurez pas correctement le
CharacterController2D
dans votre personnage.Montrez également des travaux sur l'éditeur. Comment avez-vous assigné un contrôleur de personnage ou un animateur?
est-il intentionnel que vous fassiez
animator.SetBool ("Attack", true);
maisAttack = false;
? Veuillez également ajouter des détails sur votre animateur et la configuration des transitions@ b.galerani je n'ai aucune erreur.
@SaadAnees Je leur ai attribué la manière dont le tutoriel de Brackeys me l'a dit. Le contrôleur de personnage est attaché à mon script de mouvement de jeu, tout comme dans sa vidéo, il en va de même pour l'animateur.
@derHugo C'est quelque chose sur lequel je travaille séparément du problème que j'essaie actuellement de résoudre. J'ai également suivi pas à pas le tutoriel brackeys, donc j'ai tout mis en place exactement comme cette vidéo lien a>
Quelle vidéo exactement? s'il vous plaît poster le lien vidéo. Je ne peux pas regarder toutes les vidéos de sa chaîne.
j'ai publié le lien dans mon dernier commentaire youtube.com/watch?v=hkaysu1Z-N8 < / a>