C# 如何检查两个碰撞器是否更改了这三个对象上的颜色,但没有更改附加了相同脚本的其他实例?
我想做一件具体的事情。我有随机运行的信从天上掉下来。想象一下矩阵。但当数字的特定组合出现时(909),我希望它们变成红色 我做了以下工作,它的工作部分 在带有0号网格的预制板上,我附加了以下脚本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
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();
}
}
}