123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- 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<Component> allHumansTransform = new List<Component>(); // only first depth children of parent (Humans)
- // Start is called before the first frame update
- private void Start()
- {
- Component[] allTransform = GetComponentsInChildren<Transform>(); // 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<Transform>().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<NavMeshAgent>().radius = 0.5F;
- Debug.Log(lst.gameObject.name + " set to Green");
- lst.transform.Find("BasicMotionsDummyModel").Find("DummyMesh").gameObject.GetComponent<SkinnedMeshRenderer>().material = highlightGreen;
- }
- else
- {
- lst.GetComponent<NavMeshAgent>().radius = 0.0001F;
- Debug.Log(lst.gameObject.name + " set to Trans Green");
- lst.transform.Find("BasicMotionsDummyModel").Find("DummyMesh").gameObject.GetComponent<SkinnedMeshRenderer>().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<NavMeshAgent>().radius = 0.5F;
- Debug.Log(lst.gameObject.name + " set to Yellow");
- lst.transform.Find("BasicMotionsDummyModel").Find("DummyMesh").gameObject.GetComponent<SkinnedMeshRenderer>().material = highlightYellow;
- }
- else
- {
- lst.GetComponent<NavMeshAgent>().radius = 0.0001F;
- Debug.Log(lst.gameObject.name + " set to Trans Yellow");
- lst.transform.Find("BasicMotionsDummyModel").Find("DummyMesh").gameObject.GetComponent<SkinnedMeshRenderer>().material = highlightTransYellow;
- }
- }
- // everything else change to Red
- else
- {
- if (!differentTag)
- {
- lst.GetComponent<NavMeshAgent>().radius = 0.5F;
- Debug.Log(lst.gameObject.name + " set to Red");
- lst.transform.Find("BasicMotionsDummyModel").Find("DummyMesh").gameObject.GetComponent<SkinnedMeshRenderer>().material = highlightRed;
- }
- else
- {
- lst.GetComponent<NavMeshAgent>().radius = 0.0001F;
- Debug.Log(lst.gameObject.name + " set to Trans Red");
- lst.transform.Find("BasicMotionsDummyModel").Find("DummyMesh").gameObject.GetComponent<SkinnedMeshRenderer>().material = highlightTransRed;
- }
- }
- }
- }
- }
|