ChangeModelMaterial.cs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using System.Collections.Generic;
  2. using UnityEngine;
  3. // Use Script in parent Folder of all humans
  4. public class ChangeModelMaterial : MonoBehaviour
  5. {
  6. public Material highlightRed;
  7. public Material highlightGreen;
  8. public int threshold = 1;
  9. public float radius = 1f;
  10. private Vector3 center;
  11. private Collider[] hitHumans;
  12. private List<Component> allHumansTransform = new List<Component>(); // only first depth children of parent (Humans)
  13. // Start is called before the first frame update
  14. private void Start()
  15. {
  16. Component[] allTransform = GetComponentsInChildren<Transform>(); // all possible children of parent object
  17. foreach (Transform child in allTransform)
  18. {
  19. if (child.parent == allTransform[0])
  20. {
  21. allHumansTransform.Add(child);
  22. }
  23. }
  24. //foreach (Component lst in allHumansTransform)
  25. //{
  26. // Debug.Log(lst.gameObject.name);
  27. //}
  28. }
  29. private void Update()
  30. {
  31. foreach (Component lst in allHumansTransform)
  32. {
  33. center = lst.GetComponent<Transform>().position;
  34. // only collisions with Layer "Humans" are listed in "hitHumans"
  35. hitHumans = Physics.OverlapSphere(center, radius, LayerMask.GetMask("Humans"));
  36. // if Humans only hits themselves (threshold == 1) or nobody, then Material change to Green
  37. if (hitHumans.Length <= threshold)
  38. {
  39. Debug.Log(lst.gameObject.name + " set to Green");
  40. //lst.GetComponent<MeshRenderer>().material = highlightGreen;
  41. lst.transform.GetChild(0).GetChild(0).gameObject.GetComponent<SkinnedMeshRenderer>().material = highlightGreen;
  42. }
  43. // if Humans hits somebody else (threshold >= 1), then Material change to Red
  44. foreach (Collider hitHuman in hitHumans)
  45. {
  46. if (lst.gameObject.name != hitHuman.gameObject.name) // overlap with themselves
  47. {
  48. if (hitHuman.transform.GetChild(0).GetChild(0).gameObject.GetComponent<SkinnedMeshRenderer>().material != highlightRed
  49. || lst.transform.GetChild(0).GetChild(0).gameObject.GetComponent<SkinnedMeshRenderer>().material != highlightRed)
  50. {
  51. Debug.Log(lst.gameObject.name + " overlaps with " + hitHuman.gameObject.name);
  52. hitHuman.transform.GetChild(0).GetChild(0).gameObject.GetComponent<SkinnedMeshRenderer>().material = highlightRed;
  53. lst.transform.GetChild(0).GetChild(0).gameObject.GetComponent<SkinnedMeshRenderer>().material = highlightRed;
  54. }
  55. }
  56. }
  57. }
  58. }
  59. }