c# - 如何检查两个对撞机改变这三个对象的颜色,而不是其他具有相同脚本的实例?
问题描述
我想做一件具体的事情。我有随机运行的字母从天上掉下来。想象一下像 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>();
返回 Type 类型的第一个活动加载对象。
获取对场景中第一个找到的实例的引用=>只要它没有被破坏,它的所有实例都是相同的。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;
}
}
这里仍然存在一个问题:您假设这两种OnTriggerEnter
情况都发生在对象上之后。我宁愿让它事件驱动并让对象改变碰撞对象的颜色,例如: OnTriggerEnter
0
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();
}
}
}
推荐阅读
- c++ - 三元运算符的 decltype 在 MSVC ~C++17 中是不同的
- macos - clang:错误:在 macOS 上运行鱼片时,链接器命令失败,退出代码为 1
- matplotlib - cv2.imread() 与 plt.imread()
- c# - 在角度 -> aspx web 方法 -> .net core web api 调用中同步调用异步方法时出现问题
- random - 如何为范围内的有符号整数实现无偏随机方法?
- freemarker - 如何配置 Maven Freemarker 以识别 `@include_page` 标签?
- apache-spark - 有没有办法在 Apache Spark 中创建按事件时间排序的窗口分区?
- python-3.x - 在进程之间共享 NetworkX 图,无需额外的内存成本(只读)
- r - 我应该如何在 ggplot2 中使用我的数据创建线图,还是需要在 R 中重构我的数据?
- javascript - 使用 API 的自动完成功能在 Django 中不起作用