Pour mettre en evidence les objets (porte, interupteur, etc..) j'utilise Quick Outline que j'active en visant un objet avec cette fonction que j'appelle dasn upadte :
Code : Tout sélectionner
void highlight()
{
if (Physics.Raycast(cam.transform.position, cam.transform.TransformDirection(Vector3.forward), out RaycastHit hit, Mathf.Infinity)) //lance le rayon vers le premier objet touché
{
if(hit.transform.GetComponent<Outline>() && hit.distance < highlightDistance) //si possede le script outline et bonne distance
{
hittedObject = hit.transform.gameObject;
if (isDebugLog) Debug.Log("OT on " + hittedObject.name);
hittedObject.GetComponent<Outline>().enabled = true;
}
else if (hittedObject != null)
{
hittedObject.GetComponent<Outline>().enabled = false;
if (isDebugLog) Debug.Log("OT off " + hittedObject.name);
hittedObject = null;
}
if (actionInputValue && hittedObject != null)
{
if (isDebugLog) Debug.Log("ACTION " + actionInputValue);
action(hittedObject);
}
}
}
Cela marche plutôt pas mal sauf quand je passe d'un object possedant le script outline à un autre, dasn ce cas le premier "outline" n'est pas desactivé. Je me creuse la tête mais je pense manquer de connaissance et je ne vois pas comment gérer ça.
Autre chose est-ce que ce genre de code n'est pas trop gourmand ? Je fais plusieurs "GetComponent" et il me semble que ce n'est pas génial. Est-ce qu'il vaut mieux utiliser un objet isTrigger qui representerait mon champ de vision avec OnTriggerEnter/OnTriggerExit ? L'utilisation d'un raycast est quand même super rapide et intuitif et sera sans doute utile par la suite.