Bon, on va partir sur un truc simple
(ça va être l'heure de l'apéro, donc....), allant dans le sens de ce que tu cherches à faire (si j'ai bien compris), à toi de l'adapter par la suite à tes besoin.
Première phase, comment arriver à déterminer grâce au pointeur souris, le point vers lequel orienter ton player.
Il existe plusieurs méthodes, tu trouveras en faisant des recherches, des discutions comme
celle-ci abordant différentes approches.
Là, on va faire simple, on va adopter la solution par '
Raycast'.
Pour tester le truc, on créé une scène, avec un sol (Ground) qui sera un grand carré plat, et un pseudo player, représenté par un cube. Le tout avec une vue du dessus, ou à peu près. Cela donne en gros ceci:
Pour faciliter les choses, on va changer le Layer du sol (Ground). Pour ce faire on va en créer un nouveau, que l'on nommera 'Ground' (layer n°8 normalement). Bien penser à mettre le nouveau layer pour le sol. Cela va permettre lors du raycast, de ne prendre en compte que le sol, pas le reste. Maintenant on va écrire un petit script, que l'on va assigner au Player (on va y venir). Niveau inspector, pour le sol et le player, on doit avoir donc ceci:
Maintenant, le script. Il comprend deux parties. La première est donc le picking sur le sol (nous venons d'en parler), la seconde partie est quand à elle destinée à faire avancer le Player, dans la direction pointé par la souris. Au plus simple, cela donnerais ceci (script à placer sur le player bien entendu):
Code : Tout sélectionner
using UnityEngine;
public class PlayerBase : MonoBehaviour {
// INSPECTOR DATA
[SerializeField]
private float Speed = 1.0f; // Vitesse de déplacement
[SerializeField]
private float distStop = 2.0f;
// PRIVATE DATA
private RaycastHit hit;
private Ray ray;
private int mask; // mask pour lque seul le sol soit pris en compte lors du raycast
// Use this for initialization
void Start()
{
mask = 1 << 8;
}
// Update is called once per frame
void Update()
{
// picking sur le sol par raycast pour déterminer le point désigné
// par la souris
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit, Mathf.Infinity, mask))
{ // si on est bien sur le sol, alors on oriente le player vers ce point
transform.LookAt(hit.point);
}
// si on ne se trouve pas trop près du point désigné, on
// autorise l'avancé du player
if (Vector3.Distance(hit.point, transform.position) > distStop)
{
float motor = Input.GetAxis("Vertical") * Speed;
transform.Translate(transform.forward * motor, Space.World);
}
}
}
C'est rigolo, et si tu captes bien le tout, alors tu devrais arriver à modifier et adapter à tes besoin.
Max, copyright - tout droit réservé, selon les lois jedi en vigueur