如何检查两个对撞机是否改变了这三个对象的颜色,但没有检查其他具有相同脚本的实例的颜色?

问题描述 投票:0回答:1

我想做一件事。我有从天上掉下来的随机运行的信件。想象一下像矩阵之类的东西。但是,当出现数字的特定组合(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-studio unity3d
1个回答
1
投票

不是我喜欢您的设计方式,而是回答问题:

zeroScript = GameObject.FindObjectOfType<RedNumberZero>();

FindObjectOfType

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

获得对在场景中找到的FindObjectOfTypefirst实例的引用=>只要不破坏RedNumberZero的所有实例,它都是相同的。


应该是例如

RedNumberNine

这里仍然存在问题:您假设在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; } } 对象上发生了[[both OnTriggerEnter之后,对于这些发生了OnTriggerEnter。我宁愿使其成为事件驱动的,并让0对象更改碰撞的0对象的颜色,例如:

9
然后在0脚本中

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

© www.soinside.com 2019 - 2024. All rights reserved.