PDA

Voir la version complète : Unity 3d Script Point & Click



Ariath
07/11/2013, 14h45
Bonjour tout le monde !
J'essaye de créer un script de facon a déplacer mon perso avec ma souris, et qu'il puisse éviter les obstacles.
Donc, j'ai un Perso + une Cible, le but est que mon perso aille à sa cible automatiquement.


#pragma strict

import Pathfinding;

//variables privées
private var scanneur : Seeker; //recupere les infos du scanner, les routes notamment
private var route : Path;
private var pointcourant : int;
private var controller : CharacterController;

//variables publiques
var cible : Transform;

function Start () {

//on recupere le seeker
scanneur = GetComponent(Seeker);
//on recupere le charcter controller
controller = GetComponent(CharacterController);
scanneur.StartPath(transform.position,cible.positi on, Onpathcomplete);

}

function Update () {

//si la route a été créé et que le perso n'est pas a la fin de la route
if(route != null && pointcourant < route.vectorPath.Count){
transform.position = route.vectorPath[pointcourant];
pointcourant ++;
}

}

function Onpathcomplete(p : Path){

//si pas d'erreur dans la création du chemin
if(!p.error){
route = p;
pointcourant = 0;
}else{
//si erreurs
Debug.Log(p.error);
}
}[/URL]Avec ce code, ca fonctionne, mon perso va à sa cible.Le soucis c'est que je veux qu'il tourne, de façon à éviter des obstacles.

J'ajoute donc a mon perso (capsule) la possibilité de tourner (rotation) de façon a suivre son trajet :


function Update () {
//si la route a été créé et que le perso n'est pas a la fin de la route
if(route != null && pointcourant < route.vectorPath.Count){
rotation = route.vectorPath[pointcourant] - transform.position;
rotation.y = 0;//pour que le perso se déplace bien sur son axe

//on fait tourner le perso
transform.rotation = Quaternion.LookRotation(rotation);
//pour que la vitesse soit la même quelque soit la puissance du PC
controller.SimpleMove(transform.TransformDirection (Vector3.forward) * vitesse * Time.deltaTime);

if(Vector3.Distance(transform.position,route.vecto rPath[pointcourant]) < 0.5){
transform.position = route.vectorPath[pointcourant];
pointcourant ++;
}
}

} (http://www.unity3d-france.com/unity/phpBB3/viewtopic.php?f=7&t=7123#) Et la Je bute sur du code, mon soucis est que mon perso s’arrête au bout de quelque mètres...
Je n'ai pas d'erreur et pourtant je bloque, mon perso(capsule) avance de quelques Unités et s’arrête en tremblotant http://www.unity3d-france.com/unity/phpBB3/images/smilies/icon_lol.gif la capsule qui titube, j'avais jamais vu ca...
Auriez vous une piste ?

Je précise que je suis une bonne grosse nouille en prog, j'apprends avec des tutaux Anglais/Francais sur le net, la plupart du temps je suis en panique...Alors, ayez pitié ne me fusillez pas !

EDIT : je précise que j'utilise A* Pathfinding Project et que je me sers de ce tuto [URL]http://www.youtube.com/watch?v=F_mF17ewzD4 (http://www.unity3d-france.com/unity/phpBB3/viewtopic.php?f=7&t=7123#).

Black Wolf
07/11/2013, 16h46
J'ai juste jeté un oeil en vitesse mais voici une piste, tu testes si la distance qui te sépare de ton point d'arrivée est de moins de 0.5, mais si ton perso durant la frame se déplace de plus de 0.5, t'es emmerdé. Il va en effet dépasser le point "oh tiens je suis à plus de 0.5 de distance, il faut que je recule, oh tiens je suis à plus de 0.5 de distance il faut que je recule, oh tiens je suis..." bref je crois que t'as saisi ;)

Pour éviter ça tu pourrais par exemple tester si durant la frame tu vas te déplacer plus loin que la distance qui te sépare de ton point et dans ce cas définir ta position comme étant le point que tu veux atteindre. Vite fait à l'arrache, tu pourrais faire un truc comme ça

if(vitesse * Time.deltaTime >= Vector3.Distance(transform.position,route.vecto rPath[pointcourant])
{
transform.position = route.vectorPath[pointcourant];
pointcourant ++;
}
else
{
controller.SimpleMove(transform.TransformDirection (Vector3.forward) * vitesse * Time.deltaTime);
}

Ariath
07/11/2013, 17h41
Ok merci de ton aide, c'est sympa !
Mais J'ai trouvé le problème...apparemment il fallait que je mette 1 en "y" à mon CharacterController...la valeur étant a zero, je pense qu'il luttait avec mon terrain jusqu'au blocage !?

punaise le temps que j'ai perdu pour ca...