c# - 尝试统一制作一个简单的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];
}
}
解决方案
在
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];
}
推荐阅读
- odbc - 我们可以在 Netsuite 中为保存的搜索公式编写 ODBC 查询吗?通过运行查询获得相同的输出?
- python - 使用 cURL/pycurl (oauth 2.0) 处理 http 100 响应
- c++ - 您可以将文件嵌入到 exe 中,并在每次使用时更新它们吗?
- text - 用逗号替换 TXT 文件中数字中的所有点
- django - Django:序列化程序过滤掉未声明的字段
- python - Python3:计算两个列表的所有排列总和为 100 的最有效方法是什么?
- amazon-web-services - “type:LoadBalancer”如何在 Kubernetes 中创建外部负载均衡器?
- parsing - ANTLR4 解析器混淆
- android - Gradle 错误:“配置“:app:api”包含在依赖项解析中后,无法更改其依赖项。”
- nginx - nginx with php7 或 nginx with hhvm ,哪一个更适合API server