首页 > 解决方案 > 尝试统一制作一个简单的Tag游戏

问题描述

我一直在尝试为这个想法编写代码,但我无法理解。基本上,当标记的玩家与未标记的玩家发生碰撞时,角色会发生变化,颜色也会发生变化。这是我当前的代码。有很多错误:

public class Tag : MonoBehaviour
{
    public Material[] material;
    Renderer rend;
    [SerializeField]
    string strTag;
    bool isTagged;

    private void OnCollisionEnter(Collision col)
    {
        if (col.gameObject.tag == strTag)
        {
           
          if(rend.sharedMaterial = material[0] && isTagged == true)
             rend.sharedMaterial = material[1];
             isTagged= false;


          if(rend.sharedMaterial = material[1] && isTagged = false)
             rend.sharedMaterial = material[0];
             isTagged= true;
        }  

    }
     private void OnCollisionExit (Collision col)
     {   
        if(col.gameObject.tag == strTag)
         {
        null;
         }
     }

    void Start()
    {
        rend = GetComponent<Renderer>();
        rend.enabled = true;
        rend.sharedMaterial = material[1];    
    }

}

标签: c#unity3d

解决方案


if(rend.sharedMaterial = material[0] && isTagged == true)
    rend.sharedMaterial = material[1];
isTagged= false;

该条件仅适用于第一行。我改变了缩进,所以你可以看到这意味着什么。

它基本上等于做

if(rend.sharedMaterial = material[0] && isTagged == true)
{
    rend.sharedMaterial = material[1];
}
isTagged= false;

所以不管怎样尽快第一

col.gameObject.tag == strTag

遇见你总是设置

isTagged = true;

然后,在您修复代码并{ }在块周围添加之后,您将遇到第二个陷阱!

设置和分配后

rend.sharedMaterial = material[1];
isTagged= false;

你的第二个条件

if(rend.sharedMaterial = material[1] && isTagged == false)

将自动true并直接还原您刚刚所做的更改


你宁愿使用的是

 private void OnCollisionEnter(Collision col)
 {
    // In general rather use CompareTag instead of ==
    // it (is slightly faster and) adds some security since instead of failing silently
    // it throws an error if the given Tag doesn't exist 
    if (!col.gameObject.CompareTag(strTag)) return;
    
    // And then you want to wrap your multiline code blocks 
    // with brackets - otherwisethe condition only applies to the first line
    if(rend.sharedMaterial = material[0] && isTagged)
    {
        rend.sharedMaterial = material[1];
        isTagged= false;
    }
    // Here you want to use exclusive if - else if blocks!
    // You don't want to execute the second check if the first one was already met!
    else if(rend.sharedMaterial = material[1] && !isTagged)
    {
        rend.sharedMaterial = material[0];
        isTagged= true;
    }
}

就我个人而言,我会稍微改变一下:

private void OnCollisionEnter(Collision col)
{
    if (!col.gameObject.CompareTag(strTag)) return;
    
    // simply invert the bool flag
    isTagged = !isTagged;
    // Depending on the isTagged flag chose the material
    // See https://docs.microsoft.com/dotnet/csharp/language-reference/operators/conditional-operator#conditional-operator-and-an-ifelse-statement
    rend.sharedMaterial = isTagged ? material[1] : material[0];
}

推荐阅读