我希望我的块每次在 Unity 中被击中时都会改变颜色,但不知道如何
Posted
技术标签:
【中文标题】我希望我的块每次在 Unity 中被击中时都会改变颜色,但不知道如何【英文标题】:I want my block to change color each time it got hit in Unity but don't know how 【发布时间】:2022-01-05 23:06:27 【问题描述】:所以我的问题与 Unity 中的 C# 脚本有关,我希望我的块每次被击中时都会改变颜色(第一次击中块时变为红色,第二次变为黄色,第三次变为绿色并且然后在第四次该块应该被销毁。)我也尝试制作一个像 Color[]mycolor 这样的数组,但似乎不起作用,所以如果可以的话,请发送帮助并感谢您的阅读。下面是我的代码。 这是我的 BlockMaker 脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BlockMaker : MonoBehaviour
public GameObject block;
private int blockWidth = 2;
private int blockHeight = 1;
List<GameObject> blockList = new List<GameObject>();
// Start is called before the first frame update
void Start()
StartCoroutine(BuildWall());
// Update is called once per frame
void Update()
IEnumerator BuildWall()
for (int xAxis = 0; xAxis < 5; xAxis++)
for (int yAxis = 0; yAxis<5; yAxis++)
GameObject latestBlock = Instantiate(block, new Vector3(this.transform.position.x + blockWidth * xAxis, this.transform.position.y + blockHeight * yAxis, this.transform.position.z), Quaternion.identity);
blockList.Add(latestBlock);
Debug.Log("New block added at" +latestBlock.transform.position.x+"x :" +latestBlock.transform.position.y+"y");
yield return new WaitForSeconds(0.2f);
// it makes more sense to loop through blockList.Count, so that it will Destroy everything, not just the first 5 elements.
for (int xAxis = 0; xAxis < blockList.Count; xAxis++)
//Destroy(blockList[xAxis], 0.2f);
// this will clear out the list after we Destroy all the blocks
blockList.Clear();
这是我的 BlockBehaviour 脚本,它将用于操纵颜色或类似的东西:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BlockBehaviour : MonoBehaviour
public Color mycolor;
// Start is called before the first frame update
void Start()
// Update is called once per frame
void Update()
void OnCollisionEnter (Collision ObjectCollidedWith)
if(ObjectCollidedWith.collider.tag == "ammo")
Debug.Log("block detecting collision by " + ObjectCollidedWith.collider.tag);
gameObject.GetComponent<Renderer>().material.color = mycolor;
gameObject.tag = "redBlock";
Debug.Log("Tag changed to " + gameObject.tag);
if(gameObject.tag == "redBlock")
Destroy(gameObject);
else
gameObject.GetComponent<Renderer>().material.color = mycolor;
【问题讨论】:
如问题中所述,您在哪里分配不同的颜色(红色/黄色/绿色)? 【参考方案1】:我认为您的代码应该可以正常工作。 我想知道的第一件事是你是否有碰撞。您可以尝试在 if 检查之外添加调试。请注意,在大多数情况下,当您遇到碰撞问题时,您可能需要确保至少有一个刚体连接到一个 GO 以使 Unity 物理系统工作。在这里:https://docs.unity3d.com/ScriptReference/Collider.OnCollisionEnter.html
void OnCollisionEnter (Collision ObjectCollidedWith)
if(ObjectCollidedWith.collider.tag == "ammo")
Debug.Log("block detecting collision by " + ObjectCollidedWith.collider.tag);
gameObject.GetComponent<Renderer>().material.color = mycolor;
gameObject.tag = "redBlock";
Debug.Log("Tag changed to " + gameObject.tag);
if(gameObject.tag == "redBlock")
Destroy(gameObject);
碰撞检测代码可以用 about 代码简化,将 if 条件检查移到碰撞检查中,我假设颜色变化仅在“弹药”撞墙时发生。如果您计划使用除使用碰撞检测检测之外的其他机制来处理此问题,请将代码放在 Update() 中。
我认为另一件事是为此目的更改标签并不理想。有电梯属性怎么样
int Life=4;
帮助您更好地管理游戏对象。
【讨论】:
以上是关于我希望我的块每次在 Unity 中被击中时都会改变颜色,但不知道如何的主要内容,如果未能解决你的问题,请参考以下文章
每次我使用融合位置 api 获取 lat-long 时都会改变 Lat-long,即使我仍然在同一个位置