Indicateur de cible dans Unity
Dans ce didacticiel, je vais montrer comment créer un indicateur de cible dans Unity. Il utilisera la boîte englobante de Collider pour déterminer les coins.
Alors commençons !
Étape 1
- Créez un nouveau script, nommez-le SC_TargetIndicator puis collez-y le code ci-dessous:
SC_TargetIndicator.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SC_TargetIndicator : MonoBehaviour
{
public bool allowMultipleTargets = false;
public Texture topLeftBorder;
public Texture bottomLeftBorder;
public Texture topRightBorder;
public Texture bottomRightBorder;
List<Collider> targets = new List<Collider>();
Camera targetCamera;
// Start is called before the first frame update
void Start()
{
targetCamera = GetComponent<Camera>();
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonUp(0))
{
Collider selectedCollider = GetTargetFromMouseClick();
if (selectedCollider)
{
if (targets.Contains(selectedCollider))
{
targets.Remove(selectedCollider);
return;
}
if (!allowMultipleTargets)
{
targets.Clear();
}
targets.Add(selectedCollider);
}
}
}
Collider GetTargetFromMouseClick()
{
RaycastHit hitInfo = new RaycastHit();
Ray ray = targetCamera.ScreenPointToRay(Input.mousePosition);
bool hit = Physics.Raycast(ray, out hitInfo);
if (hit)
{
return hitInfo.collider;
}
return null;
}
void OnGUI()
{
for(int i = 0; i < targets.Count; i++)
{
if (targets[i])
{
Vector3 boundPoint1 = targets[i].bounds.min;
Vector3 boundPoint2 = targets[i].bounds.max;
Vector3 boundPoint3 = new Vector3(boundPoint1.x, boundPoint1.y, boundPoint2.z);
Vector3 boundPoint4 = new Vector3(boundPoint1.x, boundPoint2.y, boundPoint1.z);
Vector3 boundPoint5 = new Vector3(boundPoint2.x, boundPoint1.y, boundPoint1.z);
Vector3 boundPoint6 = new Vector3(boundPoint1.x, boundPoint2.y, boundPoint2.z);
Vector3 boundPoint7 = new Vector3(boundPoint2.x, boundPoint1.y, boundPoint2.z);
Vector3 boundPoint8 = new Vector3(boundPoint2.x, boundPoint2.y, boundPoint1.z);
Vector2[] screenPoints = new Vector2[8];
screenPoints[0] = targetCamera.WorldToScreenPoint(boundPoint1);
screenPoints[1] = targetCamera.WorldToScreenPoint(boundPoint2);
screenPoints[2] = targetCamera.WorldToScreenPoint(boundPoint3);
screenPoints[3] = targetCamera.WorldToScreenPoint(boundPoint4);
screenPoints[4] = targetCamera.WorldToScreenPoint(boundPoint5);
screenPoints[5] = targetCamera.WorldToScreenPoint(boundPoint6);
screenPoints[6] = targetCamera.WorldToScreenPoint(boundPoint7);
screenPoints[7] = targetCamera.WorldToScreenPoint(boundPoint8);
Vector2 topLeftPosition = Vector2.zero;
Vector2 topRightPosition = Vector2.zero;
Vector2 bottomLeftPosition = Vector2.zero;
Vector2 bottomRightPosition = Vector2.zero;
for (int a = 0; a < screenPoints.Length; a++)
{
//Top Left
if(topLeftPosition.x == 0 || topLeftPosition.x > screenPoints[a].x)
{
topLeftPosition.x = screenPoints[a].x;
}
if (topLeftPosition.y == 0 || topLeftPosition.y > Screen.height - screenPoints[a].y)
{
topLeftPosition.y = Screen.height - screenPoints[a].y;
}
//Top Right
if (topRightPosition.x == 0 || topRightPosition.x < screenPoints[a].x)
{
topRightPosition.x = screenPoints[a].x;
}
if (topRightPosition.y == 0 || topRightPosition.y > Screen.height - screenPoints[a].y)
{
topRightPosition.y = Screen.height - screenPoints[a].y;
}
//Bottom Left
if (bottomLeftPosition.x == 0 || bottomLeftPosition.x > screenPoints[a].x)
{
bottomLeftPosition.x = screenPoints[a].x;
}
if (bottomLeftPosition.y == 0 || bottomLeftPosition.y < Screen.height - screenPoints[a].y)
{
bottomLeftPosition.y = Screen.height - screenPoints[a].y;
}
//Bottom Right
if (bottomRightPosition.x == 0 || bottomRightPosition.x < screenPoints[a].x)
{
bottomRightPosition.x = screenPoints[a].x;
}
if (bottomRightPosition.y == 0 || bottomRightPosition.y < Screen.height - screenPoints[a].y)
{
bottomRightPosition.y = Screen.height - screenPoints[a].y;
}
}
GUI.DrawTexture(new Rect(topLeftPosition.x - 16, topLeftPosition.y - 16, 16, 16), topLeftBorder);
GUI.DrawTexture(new Rect(topRightPosition.x, topRightPosition.y - 16, 16, 16), topRightBorder);
GUI.DrawTexture(new Rect(bottomLeftPosition.x - 16, bottomLeftPosition.y, 16, 16), bottomLeftBorder);
GUI.DrawTexture(new Rect(bottomRightPosition.x, bottomRightPosition.y, 16, 16), bottomRightBorder);
}
}
}
}
Étape 2
- Attachez le script SC_TargetIndicator à la MainCamera
- Attribuez les images ci-dessous aux variables de bordure (assurez-vous de changer leurs types de texture en 'Editor GUI and Legacy GUI' après l'importation):
Créez quelques cubes et placez-les devant la Caméra puis appuyez sur Lecture pour la tester.
Cliquez sur les cubes pour attribuer la cible.