Destruction D'Objet en attaquant

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Idolo
Messages : 89
Inscription : 11 Mars 2015 10:16

Destruction D'Objet en attaquant

Message par Idolo » 15 Avr 2015 15:37

Bonjour tous le monde, voila j'essaie de trouver comment savoir que mon personnage attaque pour faire un effet de destruction sur mon objet, j'ai donc deux scripts
Hit.cs que je met sur l'objet que je veux détruire.

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class Hit : MonoBehaviour {
	public Mecanim_Control_melee Click;
	public GameObject DestroyedObject;
	public AudioClip impact;

	void OnCollisionEnter( Collision collision ) {
		Mecanim_Control_melee Click = GameObject.Find("ThirdPersonController").gameObject.GetComponent<Mecanim_Control_melee>();
		if(collision.gameObject.tag == "Arme"&&Click.animLayer2>=0.5f) {
		DestroyIt();
		}
	}
	
		void DestroyIt(){
		if(DestroyedObject) {
			GetComponent<AudioSource>().PlayOneShot(impact);
			Instantiate(DestroyedObject, transform.position, transform.rotation);
		}
		Destroy(gameObject);

	}
}
Je me sert de la ligne "if(collision.gameObject.tag == "Arme"&&Click.animLayer2>=1.5f) {" pour vérifier la collision avec mon arme et pour savoir si mon personnage attaque (bin oui parce que si je ne vérifie pas si il attaque il suffit que mon épée entre en collision avec l'objet sans que mon personnage attaque pour qu'il soit détruit)

Et le script Mecanim_Control_melee.cs

Code : Tout sélectionner

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Mecanim_Control_melee : MonoBehaviour {
	public Animator animator;
	public static bool leftMouseClick=false;
	public bool rightMouseClick=false;
	public bool canControl=true;
	private float shift_axis_late;
	public float leftMouseClicks;

	public float animLayer2;
	public float inputX;
	public float inputY;
	public float inputJump;


	

	void Start () {
		animator = GetComponent<Animator>();

	}
	
	void OnAnimatorIK(){
		animator.SetLayerWeight(1, 1f);
		animator.SetLayerWeight(2, animLayer2);
		
		if(canControl){
			Vector3 camDir =  transform.position - Camera.main.transform.position;
			Vector3 lookPos = transform.position + camDir;
			lookPos.y = transform.position.y -(Camera.main.transform.position.y - transform.position.y) + 10f;
			//animator.SetLookAtWeight(0.2f, 0.2f, 0.8f, 0.99f);
			//animator.SetLookAtPosition(lookPos);

		}
		
		
	
	}
	
	void Update () {
	
		if(leftMouseClick){
			StartCoroutine("TimerClickTime");

		}
		
		if(animator){	
			
			shift_axis_late = Mathf.Clamp((shift_axis_late - 0.005f), 0.0f, 1.1f);
			animLayer2 = Mathf.Clamp((animLayer2 - 0.01f), 0.0f, 1.0f);
			
			animator.SetBool("LeftMouseClick", leftMouseClick);
			
			animator.SetFloat("LeftShift_axis", shift_axis_late);
			animator.SetFloat("Axis_Horizontal", inputX);
			animator.SetFloat("Axis_Vertical", inputY);
			animator.SetFloat("Jump_axis", inputJump);
			animator.SetBool("RightMouse", rightMouseClick);

		}
		
		
		if(canControl){
					
		
			inputX = Input.GetAxis("Horizontal");
			inputY = Input.GetAxis("Vertical");
			inputJump = Input.GetAxis("Jump");
			leftMouseClick = Input.GetMouseButtonDown(0);
		
			
	
				
		if(Input.GetKeyDown(KeyCode.LeftShift)){
			shift_axis_late += 0.25f;
			
		}
		
	
		if(Input.GetAxis("Fire2")>0){
				rightMouseClick=true;
				animLayer2=0.5f;
		}
			else{
				rightMouseClick=false;
			}	
		


		//sync animator Y_axis rotations with Main Camera	
		if(inputX+inputY!=0){
			Vector3 camDir =  transform.position - Camera.main.transform.position;
			Vector3 lookPos = transform.position + camDir;
			lookPos.y = transform.position.y;
			transform.LookAt(lookPos);
		}

		}
		
	}
		



	void FightCombo(){   //every left mouse click +1 to animation number counter

		leftMouseClicks += 1f;
		animator.SetFloat("LeftMouseClicks", leftMouseClicks);

		if(leftMouseClicks>2f){
			leftMouseClicks = 0f;
		}

	}	

	IEnumerator TimerClickTime(){  //timer, few seconds after click mouse bool leftMouseClick = true
	
		yield return new WaitForSeconds(0.1f);
		leftMouseClick=false;
		yield return null;
	
	}
	
	
	IEnumerator InAction(){ //recieve message from fight animation in mecanim controller
		
		yield return null;
	}
	
	
	IEnumerator AnimationEnd(){//recieve message from fight animation in mecanim controller
		
		yield return null;
	}


}//The END

Qui permet apparemment à mon personnage d'effectuer différente attaques en appuyant sur le clique gauche et de maintenir le bouclier lever avec le clique droit (oui il ne fait pas que ça).
J'ai bien compris que dans le script le bouclier lever est égal à "animLayer2=0.5f;" mais je ne trouve pas à quoi mes attaquent correspondent.
Est-ce que quelqu'un aurait une idée ?
Merci ^^

Avatar de l’utilisateur
cayou66
Codeur
Codeur
Messages : 6450
Inscription : 30 Juin 2011 14:45
Localisation : Montréal

Re: Destruction D'Objet en attaquant

Message par cayou66 » 15 Avr 2015 15:45

Salut !
Avec Unity5 tu peux créer des state machine behaviours, et du coup avoir un script qui est actif tant que ton state d'animation l'est.
Tu peux dans l'update de ce script récupérer le temps normalisé d'animation et du coup faire ce que tu souhaites avec ça. Tu peux aussi je pense faire des event dans la timeline de tes animations pour déclencher "j'attaque" et après "j'attaque plus".

http://unity3d.com/learn/tutorials/modu ... behaviours

Idolo
Messages : 89
Inscription : 11 Mars 2015 10:16

Re: Destruction D'Objet en attaquant

Message par Idolo » 15 Avr 2015 16:05

Dur dur mdr.
Bon du coup je sais pas si c'est "normal" mais j'ai du ajouter un script qui se trouve sur mon personnage pour choper son animator et vérifié l'état de la variable qui se trouve dans un script qui lui même se trouve attaché aux animations de "Fight".

Pour qu'avec le script de Hit qui se trouve sur mon objet je puisse vérifier l'état du script qui se trouve sur mon personnage. (je sais pas si on me suit là...) mais du coup ça semble fonctionner (c'est pas super précis non plus mais ça marche).
Donc je te remercie beaucoup !

Répondre

Revenir vers « (C#) CSharp »