我想做一件事。我有从天上掉下来的随机运行的信件。想象一下像矩阵之类的东西。但是,当出现数字的特定组合(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>();
返回第一个Type类型的活动加载对象。
获得对在场景中找到的FindObjectOfType
的first实例的引用=>只要不破坏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; } }