Comment faire un rectangle de sélection (Selection Box) pour jeu de Stratégie (RTS) ? Tuto Unity en français

Créez un nouveau projet 3D.

La caméra

  • Dans Hierarchy, sélectionnez Main camera.
  • Dans Inspector:
    Position : x=0, y=20, z=-10
    Rotation : x=45, y=0, z=0

Le terrain

  • Dans Hierarchy, faites un clique droit > 3D Object > Terrain
    Sélectionnez le terrain.
  • Dans Inspector:
    Position : x= -500, y=0, z=-500

Les unités

  • Dans Hierarchy, faites un clique droit > 3D Object > Capsule
    Renommez-le en Warrior.
  • Dans Inspector:
    Position : x=0, y=1, z=0

On va ajouter un indicateur de sélection, qui apparaîtra quand l’unité est sélectionnée.

  • Faites un clique droit > 3D Object Sphere
  • Assurez-vous que la Sphere soit bien l’enfant de Warrior.
  • Renommez Sphere en Selection
  • Dans Inspector:
    Position : x=0, y=-0.5, z=0
    Scale : x=2, y=0.1, z=2

Dans Assets, créez un dossier Materials, ouvrez le dossier.

  • Faites un clique droit > Create > Material
  • Renommez le material en Blue
  • Dans Inspector:
    changez la couleur : Albedo > Hexadecimal = 00EAFF

Dans Hierarchy, sélectionnez le GameObject Selection

  • Dans Inspector :
    Mesh Render > Material, choisissez le material Blue.
    On peut faire glisser aussi directement le material.

Dans Hierarchy, sélectionnez le GameObject Warrior

  • Dans Inspector :
    Cliquez sur Add Component, écrivez Warrior, créez un nouveau script, puis ouvrez-le dans Visual Studio.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Warrior : MonoBehaviour
{
    public GameObject imageSelection;

    private void Start()
    {
        UnSelect();
    }

    public void Select()
    {
        imageSelection.SetActive(true);
    }

    public void UnSelect()
    {
        imageSelection.SetActive(false);
    }
}

Revenez dans l’éditeur.

  • Dans Hierarchy:
    Sélectionnez Warrior
  • Dans Inspector:
    Dans le script Warrior > Image Selection
    Faites glisser le Game Object Selection (enfant de Warrior) dans Image Selection.

Dans Assets, créez un dossier Prefabs.

Faites glissez le Game Object Warrior depuis Hierarchy jusque dans le dossier Prefabs.

 

Puis faites glisser deux prefabs Warrior dans Hierarchy afin d’instancier deux nouvelles unités.

Changez la position des nouveaux Warrior.

  • Sélectionnez Warrior (1), dans Inspector:
    Position : x= -5, y=1, z=0
  • Sélectionnez Warrior (2), dans Inspector:
    Position : x= 5, y=1, z=0

Le rectangle de sélection

Dans Hierarchy :

  • Faites un clique droit > UI > Image
  • Renommez Canvas en SelectionController
  • Renommez Image en SelectionBox

Sélectionnez SelectionBox, dans Inspector :

  • Dans Rect Tranform, Anchor presets = Bottom Left
  • Dans le composant Image :
    Source Image, choisissez UI Sprite
    Color > Hexadecimal = 00CBFF

Sélectionnez SelectionController, dans Inspector :

  • Add Component, créez un script SelectionController, ouvrez-le dans Visual Studio

 

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

public class SelectionController : MonoBehaviour
{
    //Camera
    public Camera m_camera;

    //Rectangle de sélection
    public RectTransform selectionBox;

    //Unités disponibles
    public List<GameObject> availableWarriorList;

    //Unités sélectionnées
    public List<GameObject> selectedWarriorList;

    //Position du rectangle de sélection au moment où on clique  
    private Vector2 startPos;

    private bool isDown = false;

    private void Awake()
    {
        //Cherche toutes les unité sur la scène et remplit availableWarriorList
        foreach (var warrior in FindObjectsOfType<Warrior>())    
             availableWarriorList.Add(warrior.gameObject);

        //Initialise selectedWarriorList
        selectedWarriorList = new List<GameObject>();

        //Le rectangle de sélection ne doit pas être visible
        selectionBox.gameObject.SetActive(false);

    }

    private void Update()
    {
        //Si on clique sur le bouton gauche de la souris
        if (Input.GetMouseButtonDown(0))
        {
            //Déselectionne toutes les unités
            foreach (GameObject warrior in availableWarriorList)
                warrior.GetComponent<Warrior>().UnSelect();

            //Vide le tableau
            selectedWarriorList.Clear();

            //Position de la souris au moment du clique
            startPos = Input.mousePosition;

            isDown = true;

            //Fait apparaitre le rectangle de sélection
            selectionBox.gameObject.SetActive(true);
        }

        //Si on relâche le bouton gauche de la souris
        if (Input.GetMouseButtonUp(0))
        {
            isDown = false;

            //Fait disparaitre le rectangle de sélection
            selectionBox.gameObject.SetActive(false);          

        }
            

        //Si on n'est pas en train d'appuyer le bouton, on return pour ne pas lire le reste du script
        if (!isDown)
            return;

        //Position de la souris cette frame
        Vector2 curMousePos = Input.mousePosition;

        //Position du rectangle de sélection
        selectionBox.anchoredPosition = startPos;

        //Calcule de la taille du rectangle de sélection
        // position actuelle de la souris - osition au moment du clique
        float width = curMousePos.x - startPos.x;
        float height = curMousePos.y - startPos.y;

        selectionBox.anchoredPosition = startPos + new Vector2(width / 2, height / 2);
        selectionBox.sizeDelta = new Vector2(Mathf.Abs(width), Mathf.Abs(height));

        //Permettra de savoir si une unité rentre dans le rectangle de sélection
        Bounds bounds = new Bounds(selectionBox.anchoredPosition,
            selectionBox.sizeDelta);

        //Parcours toutes les uniteés
        foreach (GameObject warrior in availableWarriorList)
        {
            //Convertit la position 3D de l'unité en position 2D sur l'écran
            Vector2 posVector2 = m_camera.WorldToScreenPoint(warrior.transform.position);

            //Vérifie si l'unité est dans le rectangle
            if (CheckWarriorInBox(posVector2, bounds))
            {
                //Si oui, on sélectionne l'unité
                warrior.GetComponent<Warrior>().Select();
            }
        }
    }

    //Fonction qui vérifie si l'unité est dans le rectangle
    private bool CheckWarriorInBox(Vector2 position, Bounds bounds)
    {

        return position.x > bounds.min.x
            && position.x < bounds.max.x
            && position.y > bounds.min.y
            && position.y < bounds.max.y;
    }


}

Sélectionnez SelectionController, dans Inspector :

  • Repérez le script SelectionController :
    Camera : choisissez Main Camera
    Selection Box :  choisissez SelectionBox

Recevez les dernières actus

Nous ne spammons pas ! Consultez notre politique de confidentialité pour plus d’informations.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut