首页 > 解决方案 > 如何检查两个对撞机改变这三个对象的颜色,而不是其他具有相同脚本的实例?

问题描述

我想做一件具体的事情。我有随机运行的字母从天上掉下来。想象一下像 Matrix 这样的东西。但是当出现特定的数字组合(909)时,我希望它们变成红色。

我做了以下工作,它部分有效。

在带有 0 号网格的预制件上,我附上了以下脚本

public class RedNumberZero : MonoBehaviour
{

 Renderer rend;

 public bool red;

 List <GameObject> currentCollisions = new List <GameObject> ();

 void Start()
  {
      rend = GetComponent<Renderer>();
  }

  void OnTriggerEnter (Collider col) {

      if (col.tag == "9")
      {
      // Add the GameObject collided with to the list.
      currentCollisions.Add (col.gameObject);
      }

      if (currentCollisions.Count == 2)
      {
          red = true;
          Color color = rend.material.color;
          rend.material.color = Color.red;
          Debug.Log("collision");
      }


  }

在带有 9 号网格的预制件上,我有以下脚本

public class RedNumberNine : MonoBehaviour
 {
     private bool zeroCol;
     Renderer rend;
     private RedNumberZero zeroScript;
     void Awake()
     {
         zeroScript = GameObject.FindObjectOfType<RedNumberZero> ();
     }
     // Start is called before the first frame update
     void Start()
     {
         rend = GetComponent<Renderer>();
     }
     void OnTriggerEnter (Collider col) {
         if (col.tag == "0")
          {
          zeroCol = true;
          Debug.Log("Coll 2");
          }

     }

     // Update is called once per frame
     void Update()
     {
         if(zeroScript.red == true && zeroCol == true)
         {
             ColorChange();

         }
     }

     void ColorChange()
     {
         Color color = rend.material.color;
         rend.material.color = Color.red;
     }
 }

它的工作原理很奇怪。我无法彻底描述这种行为/因为我真的不明白到底发生了什么。但实际上最大的问题是,如果所有这些条件都通过了我在场景中的所有预制件实例,并且附加脚本会变成红色。我希望这仅在出现组合“909”的地方发生。

知道我可以做得更好吗?

标签: c#visual-studiounity3d

解决方案


并不是说我喜欢你的设计方式,而是回答这个问题:

zeroScript = GameObject.FindObjectOfType<RedNumberZero>();

FindObjectOfType

返回 Type 类型的第一个活动加载对象。

获取对场景中第一个找到的实例的引用=>只要它没有被破坏,它的所有实例都是相同的。RedNumberZeroRedNumberNine


它应该是例如

void OnTriggerEnter (Collider col) 
{
     if (col.CompareTag("0"))
     {
         // Get the RedNumberZero that actually collides with you
         var zeroScript = col.GetComponent<RedNumberZero>();

         zeroCol = zeroScript && zeroScript.red;
     }
 }

这里仍然存在一个问题:您假设这两种OnTriggerEnter情况都发生在对象上之后。我宁愿让它事件驱动并让对象改变碰撞对象的颜色,例如: OnTriggerEnter009

 public class RedNumberNine : MonoBehaviour
 {
     // If possible already reference this via the Inspector
     [SerilaizeField] private Renderer rend;

     // Start is called before the first frame update
     private void Awake()
     {
         if(!rend) rend = GetComponent<Renderer>();
     }

     public void SetRed()
     {
         rend.material.color = Color.red;
     }
 }

然后在 0 脚本中

void OnTriggerEnter (Collider col) 
{
    if (col.tag == "9")
    {
         // Add the GameObject collided with to the list.
         currentCollisions.Add (col.gameObject);
    }

    if (currentCollisions.Count == 2)
    {
        rend.material.color = Color.red;
        Debug.Log("collision");

        // color the two 9s
        foreach(var nine in currentCollisions)
        {
            nine.GetComponent<RedNumberNine>().SetRed();
        }
    }
}

推荐阅读