C# 如何检查两个碰撞器是否更改了这三个对象上的颜色,但没有更改附加了相同脚本的其他实例?

C# 如何检查两个碰撞器是否更改了这三个对象上的颜色,但没有更改附加了相同脚本的其他实例?,c#,visual-studio,unity3d,C#,Visual Studio,Unity3d,我想做一件具体的事情。我有随机运行的信从天上掉下来。想象一下矩阵。但当数字的特定组合出现时(909),我希望它们变成红色 我做了以下工作,它的工作部分 在带有0号网格的预制板上,我附加了以下脚本 public class RedNumberZero : MonoBehaviour { Renderer rend; public bool red; List <GameObject> currentCollisions = new List <GameObject&g

我想做一件具体的事情。我有随机运行的信从天上掉下来。想象一下矩阵。但当数字的特定组合出现时(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");
      }


  }
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;
     }
 }
公共类RedNumberZero:monobhavior
{
渲染器渲染;
公共布尔红;
List currentCollisions=新列表();
void Start()
{
rend=GetComponent();
}
无效对撞机(对撞机列){
如果(列标记==“9”)
{
//将与碰撞的游戏对象添加到列表中。
currentCollisions.Add(col.gameObject);
}
如果(currentCollisions.Count==2)
{
红色=真;
颜色=rend.material.Color;
rend.material.color=color.red;
Debug.Log(“冲突”);
}
}
在9号网格的预制板上,我有以下脚本

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");
      }


  }
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;
     }
 }
公共类RedNumberNine:monobhavior
{
私人布尔泽罗科尔;
渲染器渲染;
私有RedNumberZero零脚本;
无效唤醒()
{
zeroScript=GameObject.FindObjectOfType();
}
//在第一帧更新之前调用Start
void Start()
{
rend=GetComponent();
}
无效对撞机(对撞机列){
如果(列标记==“0”)
{
zeroCol=真;
Debug.Log(“Coll 2”);
}
}
//每帧调用一次更新
无效更新()
{
if(zeroScript.red==true&&zeroCol==true)
{
变色();
}
}
void ColorChange()
{
颜色=rend.material.Color;
rend.material.color=color.red;
}
}
它工作起来很奇怪。我无法完全描述这种行为/因为我不太明白到底发生了什么。但最大的问题是,如果所有这些条件都通过了,那么我在现场的所有预制实例(附带脚本)都会变成红色。我希望这种情况只发生在离子“909”出现


你知道我能做得更好吗?

不是因为我喜欢你的设计,而是为了回答这个问题:

zeroScript = GameObject.FindObjectOfType<RedNumberZero>();

这里仍然存在一个问题:您假设在
0
对象上发生
OnTriggerEnter
两个
OnTriggerEnter
后,这些对象会发生
OnTriggerEnter
。我宁愿将其设置为事件驱动,并让
0
对象更改碰撞
9
对象的颜色,如:

 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;
     }
 }
公共类RedNumberNine:monobhavior
{
//如果可能的话,已经通过检查员参考了这一点
[SerilaizeField]私人渲染器渲染器渲染;
//在第一帧更新之前调用Start
私人空间
{
如果(!rend)rend=GetComponent();
}
公共无效设置()
{
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();
        }
    }
}
void ontriggenter(对撞机列)
{
如果(列标记==“9”)
{
//将与碰撞的游戏对象添加到列表中。
currentCollisions.Add(col.gameObject);
}
如果(currentCollisions.Count==2)
{
rend.material.color=color.red;
Debug.Log(“冲突”);
//给两个9上色
foreach(当前碰撞中的九个变量)
{
9.GetComponent().SetRed();
}
}
}