Rotation roue tuto FPS

Toutes les questions relatives aux tutoriels du site sont à poser à cet endroit.
Sylvain85
Messages : 2
Inscription : 21 Juin 2013 16:27

Rotation roue tuto FPS

Message par Sylvain85 » 21 Juin 2013 16:39

Bonjour à tous,
Je débute avec Unity, et j'ai suivi différents tutos (qui sont d'ailleurs très clairs et instructifs !!) présents sur ce site. Toutefois, je prends quelques petites libertés pendant les réalisations.
J'ai justement décidé de faire, dans le tuto FPS, des ennemis sous forme de robots à trois roues. Le seul problème arrive au moment où je décide de faire tourner les roues (pour que l'effet soit plus réaliste). En effet, certaines roues tournent, d'autres non, et je n'arrive pas à savoir pourquoi. J'ai pourtant repris le code qui était présent dans les premiers tutos pour débutants (rotation du palmier), mais j'ai du faire une erreur. Voici le code de mon script :

Code : Tout sélectionner

private var roue1:GameObject;
roue1=GameObject.Find("Roue1");
private var roue2:GameObject;
roue2=GameObject.Find("Roue2");
private var roue3:GameObject;
roue3=GameObject.Find("Roue3");

var points=100;

var hitPoints=20;//.....Points de vie de l'ennemi
var explosion:Transform;//.....Objet explosion

var tir1:Transform;
var tir2:Transform;
var missile:GameObject;

var isShooting=false;

var characterLayer:LayerMask;
var gravity=20;

private var player:GameObject;
player=GameObject.Find("Player");

var visionAngle:float=45;
var visionRange:float=100;
private var distanceToPlayer:float;
private var canSeePlayer:boolean=false;

var hit:RaycastHit;

function Update(){
	seekPlayer();
}

function seekPlayer(){
	directionToPlayer=player.transform.position-transform.position;
	distanceToPlayer=Vector3.Distance(transform.position,player.transform.position);
	
	var playerAngle=Vector3.Angle(directionToPlayer,transform.forward);
	
	if((Mathf.Abs(playerAngle)<visionAngle && distanceToPlayer<visionRange)||canSeePlayer==true){
		Physics.Linecast(transform.position,player.transform.position,hit,~characterLayer.value);
		
		if (hit.collider.name==player.collider.name){
			var moveDirection=transform.forward;
			var tempRot=Quaternion.Slerp(transform.rotation,Quaternion.LookRotation(directionToPlayer),2*Time.deltaTime);
			tempRot.x=0;
			tempRot.z=0;
			transform.rotation=tempRot;
			canSeePlayer=true;
			shootMissile();
			moveRoue(roue1);
			moveRoue(roue2);
			moveRoue(roue3);
		}
	}
	moveDirection.y-=gravity*Time.deltaTime;
	var controller:CharacterController=GetComponent(CharacterController);
	var flags=controller.Move(moveDirection*3*Time.deltaTime);
	
}


function makeDamage(damage:float){//.....Fonction de gestion des dommages de l'ennemi
	hitPoints-=damage;//.....On déduit des points de vie la valeur damage
	
	if (hitPoints<=0){//.....Si les points de vie sont inférieurs ou égauts à 0
		Instantiate(explosion,transform.position,transform.rotation);//.....On instantie l'explosion
		Camera.main.SendMessageUpwards("ApplyPoints",points,SendMessageOptions.DontRequireReceiver);
				
		Destroy(gameObject);//.....On détruit l'objet ennemi
	}
}

function shootMissile(){
	if (isShooting==false){
		isShooting=true;
		Instantiate(missile,tir1.position,tir1.rotation);
		Instantiate(missile,tir2.position,tir2.rotation);
		yield WaitForSeconds(2);
		isShooting=false;
	}
}

function moveRoue(arg1:GameObject){
	arg1.transform.Rotate(0,0,Time.deltaTime*80);
}
D'avance merci pour l'aide que vous m'apporterez, et demandez moi si vous avez besoin d'infos supplémentaires par rapport à mon projet. ;)

Avatar de l’utilisateur
Titan
Messages : 582
Inscription : 12 Sep 2011 13:54
Contact :

Re: Rotation roue tuto FPS

Message par Titan » 22 Juin 2013 20:27

balancer tout son script et dire "trouvez l'erreur plz", aussi poliment que possible, même quand on est complètement a bout, ça marche jamais, j'en ai fait les frais encore récemment.
Si ta une question plus précise, je serais ravi de pouvoir t'aider mais je vais pas chercher à ta place.

Commence par isoler le segment de code qui t’embête, voir un raycast et une fonction shootmissile() pour un problème de rotation de roue ça n'a pas de sens.

Sinon un wheelCollider et un rigidbody ça peut donner des résultat sympa et t'aurai pas a t’embêter avec ce genre de détail mais ce serait une approche radicalement différente.
____________________________________________
Hop Boy

Sylvain85
Messages : 2
Inscription : 21 Juin 2013 16:27

Re: Rotation roue tuto FPS

Message par Sylvain85 » 23 Juin 2013 17:23

Je suis d'accord avec toi, mais l'inconvénient est que je commence juste l'utilisation du logiciel, et je ne comprends même pas tout ce que je fais ! :?

Est-ce que la méthode semble bonne pour arriver à faire ce que je veux, ou est-ce plus simple d'utiliser un wheelCollider comme tu le disait ? Si oui, comment ça marche ? (j'ai déjà essayé, pour voir, mais ça ne marchait pas)

Avatar de l’utilisateur
Titan
Messages : 582
Inscription : 12 Sep 2011 13:54
Contact :

Re: Rotation roue tuto FPS

Message par Titan » 24 Juin 2013 00:16

Tout ce que tu veux savoir est dans la doc pour le wheel collider, pour que ça marche il faut déplacer ton objet en lui appliquant des force au lieu de le déplacer directement (doc rigidbody), mais si t'arrive pas a faire tourner une roue avec un transform.Rotate() tu va pas d'avantage réussir à faire un rigidbody.Addforce().

Reprenons, "certaines roues tournent, d'autres non", laquelle tourne ? laquelle tourne pas ? c'est peut être intéressant à se poser comme question si tu veux trouver l'origine du problème, non ? y'a t'il un message d'erreur disant qu'une roue est null ?

GameObject.Find() ne retourne pas nécessairement un child, transform.Find() oui: si ta plusieurs objet le problème viens de là, surtout que ta aucune bonne raison de garder une référence sur le gameObject plutot que le transform.
____________________________________________
Hop Boy

Verrouillé

Revenir vers « Tutoriels du site Unity3D-france »