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






