如何检查两个碰撞体是否更改了这三个对象上的颜色,而不是附加了相同脚本的其他实例?



我想做一件特定的事情。我有随机的连续字母从天而降。想象一下像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"的地方。

知道我可以做得更好吗?

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

zeroScript = GameObject.FindObjectOfType<RedNumberZero>();

FindObjectOfType

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

获取对场景中第一个找到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;
}
}

这里仍然存在一个问题:您假设在0对象上发生两个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;
}
}

然后在 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();
}
}
}

最新更新