Bien le bonjour,
J'ai essayer d'appliquer tes généreux conseils, j'ai été jusqu’à utiliser une autre méthode pour déplacer mon joueur et mes pnj en utilisant la physique. J'ai séparer mon script principale en plusieurs morceaux, en plusieurs classes ext ...
j'ai encore du mal avec les majuscule et les minuscule mais ça va venir ^^'
Un petit problème survient malgré tout.
Mes personnages n'atteignent plus leurs waypoints avec exactitude.
voici mon scripte de déplacement pour illustrer mes propos :
Code : Tout sélectionner
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PnjMove : MonoBehaviour
{
public float speed = 500f;
public bool move = false;
public Transform[] waypoints;
public int destPoint = 0;
public Rigidbody2D rb;
float horizontal;
float vertical;
public Transform Destination;
private Vector3 velocity = Vector3.zero;
public Animator animator;
Vector2 lookDirection = new Vector2(1, 0);
public AudioSource BruitDePas;
void Start()
{
rb = GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>();
Destination = waypoints[0];
}
void Update()
{
if (move)
{
Vector3 Position = rb.position;
Vector2 Trajectoir = Destination.position - Position;
Debug.Log(Vector3.Distance(Position, Destination.position));
if (Vector3.Distance(Position, Destination.position) < 1.2f)
{
destPoint = (destPoint + 1) % waypoints.Length;
Destination = waypoints[destPoint];
}
horizontal = Trajectoir.normalized.x;
vertical = Trajectoir.normalized.y;
}
else
{
horizontal = 0;
vertical = 0;
}
}
void FixedUpdate()
{
float moveHorizontal = horizontal * speed * Time.deltaTime;
float moveVertical = vertical * speed * Time.deltaTime;
Mouvement(moveHorizontal, moveVertical);
AnimationEtSons();
}
void Mouvement(float moveHorizontal, float moveVertical)
{
Vector3 targetVelocity = new Vector3(moveHorizontal, moveVertical, 0);
rb.velocity = Vector3.SmoothDamp(rb.velocity, targetVelocity, ref targetVelocity, .05f);
}
void AnimationEtSons()
{
Vector2 regard = new Vector2(horizontal, vertical);
if (!Mathf.Approximately(regard.x, 0.0f) || !Mathf.Approximately(regard.y, 0.0f))
{
lookDirection.Set(regard.x, regard.y);
lookDirection.Normalize();
}
animator.SetFloat("Look X", lookDirection.x);
animator.SetFloat("Look Y", lookDirection.y);
animator.SetFloat("Speed", regard.magnitude);
if (regard.magnitude > 0.1f)
{
if (!BruitDePas.isPlaying)
{
BruitDePas.Play();
}
}
else
{
BruitDePas.Stop();
}
}
Lorsque mon perso (ou un pnj) est lancé sur sa trajectoire, il atteint le 1er waypoint et reste dessus sans passés au suivant.
Le débug.Log m'apprend que, à ce moment la, la distance entre le rigidbody2d et le waypoint est de 2.222...
Je ne sais pas si c'est une marge normalement acceptable mais pour moi ça pose problème car
- mon script attends normalement d’atteindre la distance de 1.2f entre le waypoint et le rigidbody pour passer au waypoint suivant et c'est la distance max que je puisse faire car
- je travail en pixel art, mes dessins sont petit, 2.2f c'est beaucoup à mon échelle, c'est presque la largeur d'un perso.
(dans sa vidéo, TUTO UNITY FR préconise même de mettre cette distance a 0.3f)
Peut être que j'utilise mal celle-ci ?
Si vous avez besoin de plus d'information ou de précision, je reste a disposition pour vous répondre au plus vite.
Merci pour votre patience avec la débutante que je suis ^^'