Tutoriels Jeux de plateforme

part7 - Les ennemies


Création de l'ennemi

Aller dans votre dossier Prefabs et dupliquez votre Player et nommer le Ennemi


Script Ennemi

//Code c#
 using UnityEngine;
 using System.Collections;
/*
	notre ennemie aura divers comportement : 
	 - Fixe 
	 - deplacement dans une unique direction
	 - deplacement entre 2 coordonées
	 - Capacité de sauter
 */
public class Ennemy : MonoBehaviour {
	CharacterController m_characterController;

	public enum CpuBehaviour{FIXE, UNIDIRECTIONNELLE, LOOP};
	public CpuBehaviour m_cpuBehaviour;

	public enum CpuDirection {LEFT, RIGHT};
	public CpuDirection m_cpuDirection;

	public bool canJump;
	public float forceJump;
	Vector3 dir = Vector3.zero;
	public float speed;
	public Vector2 pointStart;
	public Vector2 pointEnd;
	Vector2 targetPoint;

	public float dist ;
	float tps ;
	float gravity;


	// Use this for initialization
	void Start () {
		// on s'assure d'avoir un characterController

		if (m_characterController == null)
		{
			if ( GetComponent < CharacterController > ())
			{
				m_characterController = GetComponent < CharacterController > ();
			}else
			{
				m_characterController = gameObject.AddComponent < CharacterController > ();
			}
		}
	//	m_cpuBehaviour = CpuBehaviour.FIXE;
		targetPoint = pointStart;
	}
	
	// Update is called once per frame
	void Update () {
		switch (m_cpuBehaviour) {
		case CpuBehaviour.FIXE: // si c'est fixe on ne fait rien de spécial
			break;
		case CpuBehaviour.UNIDIRECTIONNELLE://on déplace l'ennemie dans une direction donné
			if (m_cpuDirection == CpuDirection.LEFT) {
				transform.localScale = new Vector3 (-1, 1, 1);
				m_characterController.Move (-transform.right * speed * Time.deltaTime);
			} else {
				transform.localScale = new Vector3 (1, 1, 1);
				m_characterController.Move (transform.right * speed * Time.deltaTime);
			}
			break;
		case CpuBehaviour.LOOP:
			// on déplace l'ennemi en direction de sa cible

			dist = Vector3.SqrMagnitude (transform.position - new Vector3 (targetPoint.x, targetPoint.y, 0));
				
			if (targetPoint.x > transform.position.x) {
				transform.localScale = new Vector3 (1, 1, 1);
				m_characterController.Move (transform.right * speed * Time.deltaTime);
			}
			if (targetPoint.x < transform.position.x) {
				transform.localScale = new Vector3 (-1, 1, 1);
				m_characterController.Move (-transform.right * speed * Time.deltaTime);
			}
			if (dist < 2)
			{
				float diffToStart = Vector3.SqrMagnitude (transform.position - new Vector3 (pointStart.x, pointStart.y, 0));
				float diffToEnd = Vector3.SqrMagnitude (transform.position - new Vector3 (pointEnd.x, pointEnd.y, 0));
				if (diffToStart < diffToEnd)
				{
					targetPoint = pointEnd;
					print ("go to  ---> End");
				} else
					{
						targetPoint = pointStart;
						print ("go to  ---> Start");
					}
			}
		
			break;
		}




		if (!m_characterController.isGrounded)// si le personnage n'est pas en collision avec quelque chose
		{
			// On applique la gravité pour le rediriger vers le bas.
			gravity -= 9.81f * Time.deltaTime;//9.81 est la valeur basique de la gravité.
			//   m_CharaterController.Move(transform.up * gravity * Time.deltaTime);// On  applique la gravité à notre personnage.
			
			dir.y += gravity * Time.deltaTime; // on utilise la variable moveUp pour gerer notre position sur l'axeY
			
		}
		else
		{
			gravity = 0;// si on est en collision avec quelque chose nous remettons la valeur de la gravité à 0 pour être sur qu'elle ne s'applique plus à notre personnage.
			if ( canJump) Jump ();
		}
		
		m_characterController.Move(dir * Time.deltaTime);//On deplace le personnage en fonction de la valeur moveUp 
	}



	void Jump () {
		if(m_characterController.isGrounded){ 
			dir.y = forceJump;
		}	
	}





	void OnDrawGizmos()
	{
		if (m_cpuBehaviour == CpuBehaviour.LOOP)
		{
			Gizmos.color = Color.green;
			Gizmos.DrawCube( pointStart, new Vector3(1,1,1));
			Gizmos.DrawCube( pointEnd, new Vector3(1,1,1));
			Gizmos.DrawLine( pointStart, pointEnd);
		}
	}
}
// code : JS
/*
	notre ennemie aura divers comportement : 
	 - Fixe 
	 - deplacement dans une unique direction
	 - deplacement entre 2 coordonées
	 - Capacité de sauter
 */

private var m_characterController : CharacterController ;
enum CpuBehaviour    {FIXE, UNIDIRECTIONNELLE, LOOP};
var m_cpuBehaviour : CpuBehaviour ;
enum CpuDirection    {LEFT, RIGHT};
var m_cpuDirection : CpuDirection ;

var canJump : boolean ;
var forceJump : float ;
private var dir : Vector3 = Vector3.zero;
var  speed : float;
var  pointStart : Vector2;
var pointEnd : Vector2;
private var  targetPoint : Vector2;

var dist : float  ;
private var tps : float ;
private var  gravity : float;


    // Use this for initialization
	function Start () {
    // on s'assure d'avoir un characterController

	if (m_characterController == null)
    {
	    if ( GetComponent.< CharacterController > ())
        {
		    m_characterController = GetComponent.< CharacterController > ();
        }else
        {
			m_characterController = gameObject.AddComponent. < CharacterController > ();
        }
    }
    //	m_cpuBehaviour = CpuBehaviour.FIXE;
	targetPoint = pointStart;
}
	
    // Update is called once per frame
	function Update () {
		switch (m_cpuBehaviour) {
		case CpuBehaviour.FIXE: // si c'est fixe on ne fait rien de spécial
			break;
		case CpuBehaviour.UNIDIRECTIONNELLE://on déplace l'ennemie dans une direction donné
			if (m_cpuDirection == CpuDirection.LEFT) {
				transform.localScale = Vector3 (-1, 1, 1);
				m_characterController.Move (-transform.right * speed * Time.deltaTime);
        } else {
				transform.localScale = Vector3 (1, 1, 1);
				m_characterController.Move (transform.right * speed * Time.deltaTime);
        }
			break;
		case CpuBehaviour.LOOP:
    // on déplace l'ennemi en direction de sa cible

			dist = Vector3.SqrMagnitude (transform.position - Vector3 (targetPoint.x, targetPoint.y, 0));
				
			if (targetPoint.x > transform.position.x) {
				transform.localScale = Vector3 (1, 1, 1);
				m_characterController.Move (transform.right * speed * Time.deltaTime);
            }
			if (targetPoint.x < transform.position.x) {
				transform.localScale = Vector3 (-1, 1, 1);
				m_characterController.Move (-transform.right * speed * Time.deltaTime);
            }
			if (dist < 2)
            {
				var diffToStart = Vector3.SqrMagnitude (transform.position - new Vector3 (pointStart.x, pointStart.y, 0));
				var diffToEnd = Vector3.SqrMagnitude (transform.position - new Vector3 (pointEnd.x, pointEnd.y, 0));
				if (diffToStart < diffToEnd)
                {
					targetPoint = pointEnd;
					print ("go to  ---> End");
            } else
                {
						targetPoint = pointStart;
						print ("go to  ---> Start");
                }
            }
		
			break;
        }




		if (!m_characterController.isGrounded)// si le personnage n'est pas en collision avec quelque chose
        {
    // On applique la gravité pour le rediriger vers le bas.
			gravity -= 9.81f * Time.deltaTime;//9.81 est la valeur basique de la gravité.
    //   m_CharaterController.Move(transform.up * gravity * Time.deltaTime);// On  applique la gravité à notre personnage.
			
			dir.y += gravity * Time.deltaTime; // on utilise la variable moveUp pour gerer notre position sur l'axeY
			
        }
        else
        {
			gravity = 0;// si on est en collision avec quelque chose nous remettons la valeur de la gravité à 0 pour être sur qu'elle ne s'applique plus à notre personnage.
			if ( canJump) Jump ();
        }
		
		m_characterController.Move(dir * Time.deltaTime);//On deplace le personnage en fonction de la valeur moveUp 
    }



	function Jump () {
		if(m_characterController.isGrounded){ 
			dir.y = forceJump;
    }	
}





	function OnDrawGizmos()
    {
		if (m_cpuBehaviour == CpuBehaviour.LOOP)
        {
			Gizmos.color = Color.green;
			Gizmos.DrawCube( pointStart, new Vector3(1,1,1));
			Gizmos.DrawCube( pointEnd, new Vector3(1,1,1));
			Gizmos.DrawLine( pointStart, pointEnd);
        }
    }

Sur votre prefab ennemi, supprimer le script Move et ajouter le script Ennemi et appuyez sur Apply en haut à droite de la fenètre Inspector. Vous pouvez dès à présent faire des tests pour vérifier que tous fonctionne. Par exemple, si vous choisissez d'effectuer un mouvement de type LOOP, 2 gizmos vont apparaitre dans la fenêtre scène et dans l'inspecteur utilisé les valeurs point start et point end pour définir la zone dans laquelle ce déplace l'objet.


Ajout d'intéraction

Nous allons vouloir avoir la capacité de détruire notre ennemi. Dans ce tutoriel, je vais mettre en place 2 possibilitées.
La 1ère il fait qu'on lui saute dessus.
La seconde, il faut lui lancer un objet.
CAS 1 : script Interaction ajouter cette fonction dans le scripts


//Code C#
void OnTriggerEnter(Collider other)
    {
        if (gameObject.tag == "Player")
        {
            print("other :" + other.gameObject.name);
            if (other.gameObject.name == "weakness")
            {
                other.transform.parent.SendMessage("LosePointLife", 1, SendMessageOptions.DontRequireReceiver);
            }
        }
    }
                                   

                                    

//Code JS
function OnTriggerEnter(other :Collider )
    {
        if (gameObject.tag == "Player")
        {
            print("other :" + other.gameObject.name);
            if (other.gameObject.name == "weakness")
            {
                other.transform.parent.SendMessage("LosePointLife", 1, SendMessageOptions.DontRequireReceiver);
            }
        }
    }


Ajouter un gameObject vide à votre ennemi et nommez le weakness.
Ajoutez lui une sphere collider et cochez la case isTrigger. Ajuster la position de cette sphere pour qu'elle dépasse légèrement vers le haut.
Vérifier bien que votre ennemi possède le tag "ennemi" et que votre player possède le tag "Player".
Voila, votre ennemi perd 1 point de vie à chaque fois que vous lui sauter sur la tête. N'oublier pas d'appliquer cette modification à votre prefab en appuyant sur Apply.

CAS 2 : Lancer un objet

  • Création de l'objet
  • - Créons un objet vide que l'on nommera Power.
    - lui mettre en enfant une sphere et lui enlever son collider.
    - Mettre sur l'objet power une sphere collider et un Rigidbody.
    - et enfin créer un script powerSetting et lui assigner. - Glisser cette objet dans votre dossier prefab et supprimer le de votre scene. - Assigner ce prefab au sur le script du playerpower.

  • Appeler l'objet
  • - sur le Player créer un script power. Il nous servira à appeler notre objet que nous voulons lancer.
    contenu du script power.

    
    //c#
    public class Power : MonoBehaviour {
        public GameObject m_power;
    
    	// Use this for initialization
    	void Start () {
           
    	}
    	
    	// Update is called once per frame
    	void Update () {
            if (Input.GetButtonDown("Fire1"))
            {
                Instantiate(m_power,transform.position, transform.rotation);
            }
    	}
    }
    
    
    
    //Js
        var m_power : GameObject ;
    
    	function Start () {
           
    	}
    	
    	function Update () {
            if (Input.GetButtonDown("Fire1"))
            {
                Instantiate(m_power,transform.position, transform.rotation);
            }
    	}
    

    Contenu du script powerSetting ( sur notre objet )
    
    //C#
    using UnityEngine;
    using System.Collections;
    
    public class PowerSettings : MonoBehaviour {
        Rigidbody rbody;
        public Vector3 force = new Vector3(5.0f,1,0);
        public float TimeOfLife = 2.0f;
        float tps;
    	// Use this for initialization
    	void Start () {
            rbody = GetComponent < Rigidbody > ();
            rbody.velocity = new Vector3(transform.right.x * force.x, transform.right.y * force.y, 0);
    
    
        }
    	
    	// Update is called once per frame
    	void Update () {
            tps += 1 * Time.deltaTime;
            if (tps > = TimeOfLife)
            {
                Destroy(gameObject);
            }
    	}
    
    
        void OnCollisionEnter(Collision collision)
        {
            if (collision.gameObject.tag == "ennemi")
            {
                collision.gameObject.SendMessage("LosePointLife", 1, SendMessageOptions.DontRequireReceiver);
            }
            Destroy(gameObject);
        }
    }
    
    
    
    
    //JS
        private var rbody : Rigidbody ;
        var force  : Vector3 = Vector3(5,0,0);
        var TimeOfLife = 2.0f;
        private var tps : float;
        
        	function Start () {
            rbody = GetComponent.< Rigidbody > ();
            if (transform.eulerAngles.y == 0) rbody.velocity = force;
            if (transform.eulerAngles.y == 270) rbody.velocity = -force;
            
        }
    	
    	function Update () {
            tps += 1 * Time.deltaTime;
            if (tps > = TimeOfLife)
            {
                Destroy(gameObject);
            }
    	}
    
    
        function OnCollisionEnter(collision : Collision )
        {
            if (collision.gameObject.tag == "ennemi")
            {
                collision.gameObject.SendMessage("LosePointLife", 1, SendMessageOptions.DontRequireReceiver);
            }
            Destroy(gameObject);
        }
    

    Voila, il ne vous reste plus qu'à faire des tests au niveau des valeurs pour avoir ce que vous désirez.
    Notre ennemi maintenant peut être détruit si on lui saute dessus ou si on lui envoie un objet. Si vous désirez que j'ajoutes des fonctionnalités n'hésitez pas à me contacter par mail ( voir contact ).



    Fin de la partie 7
    la suite prochainement.

      Partie 1 : La création du monde   Partie 2 : La création du personnage   Partie 3 : Les plateformes   Partie 4 : Intéractions plateformes   Partie 5 : La caméra   Partie 6 : Bonus vie

    Les tutoriels que nous vous proposons