gpt4 book ai didi

c# - 如何检查游戏对象是否在 Unity 中具有组件方法?

转载 作者:太空狗 更新时间:2023-10-29 22:25:52 25 4
gpt4 key购买 nike

我正在编写一种方法来检查游戏对象是否有组件。

这里是:

public static bool HasComponent <T>(this GameObject obj)
{
return obj.GetComponent<T>() != null;
}

我是这样使用它的:

void Update()
{

if (Input.GetKey("w"))
{
if (gameObject.HasComponent<Rigidbody>())
{
print("Has a rigid body.");
return;
}

print("Does not have rigid body.");
}
}

gameObject 没有刚体,但它仍在打印它确实有的刚体。

最佳答案

这只是...

public static bool HasComponent <T>(this GameObject obj) where T:Component
{
return obj.GetComponent<T>() != null;
}

请注意,您忘记了

哪里T:Component

第一行的一部分!

由于该语法错误,扩展名毫无意义:它总是在寻找“某些组件”,因为 T 是“空白”。


注意。

“什么是扩展”的解释。

对于不熟悉 c# 中的类别的阅读本文的任何人...也就是说 c# 中的“扩展”...这是一个简单的 tutorial ...

enter image description here

扩展在 Unity 中至关重要。

您几乎在每一行代码中都使用它们。

基本上,在 Unity 中,您几乎可以在扩展中执行所有操作。

请注意,由于扩展非常普遍,因此 OP 甚至懒得显示包装类。扩展总是位于这样的文件中:

public static class ExtensionsHandy
// The wrapper class name is actually irrelevant - it is not used at all.
// Choose any convenient name for the wrapper class.
{

public static bool HasComponent <T>(this GameObject obj) where T:Component
{
return obj.GetComponent<T>() != null;
}

public static bool IsNear(this float ff, float target)
{
float difference = ff-target;
difference = Mathf.Abs(difference);
if ( difference < 20f ) return true;
else return false;
}

public static float Jiggle(this float ff)
{
return ff * UnityEngine.Random.Range(0.9f,1.1f);
}

public static Color Colored( this float alpha, int r, int g, int b )
{
return new Color(
(float)r / 255f,
(float)g / 255f,
(float)b / 255f,
alpha );
}

}

在示例中,我包含了三个典型的扩展。通常情况下,一个项目中会有数十个甚至数百个扩展。

(您可能更愿意将它们分组到不同的 HandyExtensions 文件中,或者只有一个巨大的 HandyExtensions 文件。)

每个工程师和团队都有自己一直使用的“通用扩展”。

这是一个典型的 example question关于 C# 中扩展的微妙之处。

请注意,在较旧的语言中,您通常将扩展称为“类别”。

在c#中它是一个“扩展”,但“类别”或“扩展”都很常见。

正如我所说,您在 Unity 中经常使用这些。


如果你喜欢那种东西,这里有一个漂亮的东西:

// Here's an unbelievably useful array handling category for games!

public static T AnyOne<T>(this T[] ra) where T:class
{
int k = ra.Length;
int r = UnityEngine.Random.Range(0,k);
return ra[r];
}

关于c# - 如何检查游戏对象是否在 Unity 中具有组件方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35166730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com