我希望我的块每次在 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,即使我仍然在同一个位置

每次运行 iOS 模拟器时都会出现白屏

每次渲染正文时都会调用 SwiftUI Picker onReceive()

如何仅在 Unity 编辑器启动时运行脚本?

Xcode 在验证过程中被击中? [关闭]

为啥 std::distance 在 stl 地图中被击中?