using System.Collections.Generic; using UnityEngine.AI; using UnityEngine; // Use this Script in parent folder of all Humans public class ChangeMaterial : MonoBehaviour { [Multiline] public string info; [Header("Highlighting Materials:")] public Material highlightRed; public Material highlightGreen; public Material highlightYellow; [Header("Highlighting Transparent Materials:")] public Material highlightTransRed; public Material highlightTransGreen; public Material highlightTransYellow; [Header("Thresholds:")] [Tooltip("The maximum number of people (including the observed) that will be colored green.\n Threshold Green = 1 means that no further person is allowed to approach.")] public int thresholdGreen = 1; [Tooltip("The maximum number of people (including the observed) that will be colored yellow.\n Threshold Yellow = 2 means that only one other person may approach.")] public int thresholdYellow = 2; [Space] public float radius = 1f; private Vector3 center; private Collider[] hitHumans; private List allHumansTransform = new List(); // only first depth children of parent (Humans) // Start is called before the first frame update private void Start() { Component[] allTransform = GetComponentsInChildren(); // all possible children of parent object foreach (Transform child in allTransform) { if (child.parent == allTransform[0]) { allHumansTransform.Add(child); } } } //private void OnDrawGizmos() //{ // foreach (Component lst in allHumansTransform) // { // Gizmos.color = Color.blue; // Gizmos.DrawWireSphere(lst.transform.position, radius); // } //} private void FixedUpdate() { foreach (Component lst in allHumansTransform) { center = lst.GetComponent().position; // only collisions with Layer "Humans" are listed in "hitHumans" hitHumans = Physics.OverlapSphere(center, radius, LayerMask.GetMask("Humans")); bool differentTag = false; foreach (Collider hitHuman in hitHumans) { if (lst.CompareTag(hitHuman.tag)) differentTag = false; else { differentTag = true; break; } } int hitHumansLength = 0; foreach (Collider hitHuman in hitHumans) { if (lst.CompareTag(hitHuman.tag)) hitHumansLength++; } // if Human hits lesser then thresholdYellow but is hitting minimum 1 other human, then Material change to Green if (hitHumansLength <= thresholdGreen) { if (!differentTag) { lst.GetComponent().radius = 0.5F; Debug.Log(lst.gameObject.name + " set to Green"); lst.transform.Find("BasicMotionsDummyModel").Find("DummyMesh").gameObject.GetComponent().material = highlightGreen; } else { lst.GetComponent().radius = 0.0001F; Debug.Log(lst.gameObject.name + " set to Trans Green"); lst.transform.Find("BasicMotionsDummyModel").Find("DummyMesh").gameObject.GetComponent().material = highlightTransGreen; } } // if Human hits lesser then thresholdYellow but is hitting minimum 1 other human, then Material change to Yellow else if (hitHumansLength <= thresholdYellow) { if (!differentTag) { lst.GetComponent().radius = 0.5F; Debug.Log(lst.gameObject.name + " set to Yellow"); lst.transform.Find("BasicMotionsDummyModel").Find("DummyMesh").gameObject.GetComponent().material = highlightYellow; } else { lst.GetComponent().radius = 0.0001F; Debug.Log(lst.gameObject.name + " set to Trans Yellow"); lst.transform.Find("BasicMotionsDummyModel").Find("DummyMesh").gameObject.GetComponent().material = highlightTransYellow; } } // everything else change to Red else { if (!differentTag) { lst.GetComponent().radius = 0.5F; Debug.Log(lst.gameObject.name + " set to Red"); lst.transform.Find("BasicMotionsDummyModel").Find("DummyMesh").gameObject.GetComponent().material = highlightRed; } else { lst.GetComponent().radius = 0.0001F; Debug.Log(lst.gameObject.name + " set to Trans Red"); lst.transform.Find("BasicMotionsDummyModel").Find("DummyMesh").gameObject.GetComponent().material = highlightTransRed; } } } } }