如何要求 public 变量(预制件)在 UNITY 中具有特定组件(RigidBody)?
How can I Require a public Variable (Prefab) to have a certain component (RigidBody) in UNITY?
我正在尝试实现 "Shoot" MonoBehaviour。
我想让它做一些很简单的事情,它应该把一个Prefab作为"Input"(暂时存储在"projectile"public变量中),然后简单地实例化它并添加一个向它的 RigidBody 施加前向力(相对于它所附着的对象,例如坦克)。
但是,如果我不小心插入了没有刚体的预制件,我不希望我的游戏崩溃。 (事实上 ,如果它甚至不允许我添加没有 RigidBodies 作为射弹的预制件,那就太好了。
我试过使用 "RequireComponent" 属性,但它似乎只适用于 类。有没有什么方法可以做到这一点,而不必每次我想射击它时都检查 Projectile 是否有 RigidBody?
我尝试了下面的代码,但它给了我一个错误,提示我无法将 RigidBody 实例化为游戏对象。这是可以理解的,但我 运行 没有想法。
public class Shoot : MonoBehaviour
{
public Rigidbody projectile;
public float firePower = 5f;
public void Fire()
{
GameObject projectileInstance = Instantiate(projectile) as GameObject;
//maybe add some particles/smoke effect
projectile.GetComponent<Rigidbody>().AddForce(firePower * transform.forward);
}
}
您可以检查预制件,看看它是否有像这样的 Rigidbody 组件:
if (currentPrefab.GetComponent<Rigidbody>()){
// Do something
}
如果您作为参数输入的类型不存在,GameObject.GetComponent() 方法将 return 为 null。
您可以在运行时添加您想要的组件,例如:
// First check if there is no rigidbody component on the object
if (!currentPrefab.GetComponent<Rigidbody>()){
// Add the Rigidbody component
currentPrefab.AddComponent<Rigidbody>();
// You can also add a collider here if you want collisions
var bc = currentPrefab.AddComponent<BoxCollider>();
// And you'll have to calculate the new collider's bounds
Renderer[] r = t.GetComponentsInChildren<Renderer>();
for(var i=0; i<r.length; i++) {
bc.bounds.Encapsulate(r[i].bounds);
}
}
我相信你已经在写作轨道上了。您只需通过执行以下操作来修复您的错误:
public Rigidbody projectile;
public float firePower = 5f;
public void Fire()
{
if( projectile == null )
{
Debug.LogError( "You forgot to provide a projectile prefab");
return;
}
Rigidbody projectileInstance = Instantiate(projectile) as Rigidbody;
projectileInstance.AddForce(firePower * transform.forward);
}
但是,使用此方法,您不能要求预制件具有多个组件。如果你需要这个,那么就用其他答案提供的方法吧。
这里的其他人已经为您提供了一些关于如何在运行时执行此操作的示例,但是我建议您向射弹 class 添加一个 [RequireComponent(typeof(RigidBody))]
(如果有的话)。
每次您将组件附加到 gameObject
时,Unity 也会自动添加所需的组件,而不会在运行时对游戏性能产生影响。只需将其添加到射弹脚本的 class 声明中即可。
但是您确实需要通过 Inspector 或 GetComponent
手动分配您的组件。但这可以确保您的对象附加了正确的组件。
你需要在你的射弹上安装某种脚本才能工作。所以如果你没有,你应该使用这里指出的另一个选项。
如果您有兴趣,可以找到文档here。
我正在尝试实现 "Shoot" MonoBehaviour。 我想让它做一些很简单的事情,它应该把一个Prefab作为"Input"(暂时存储在"projectile"public变量中),然后简单地实例化它并添加一个向它的 RigidBody 施加前向力(相对于它所附着的对象,例如坦克)。
但是,如果我不小心插入了没有刚体的预制件,我不希望我的游戏崩溃。 (事实上 ,如果它甚至不允许我添加没有 RigidBodies 作为射弹的预制件,那就太好了。
我试过使用 "RequireComponent" 属性,但它似乎只适用于 类。有没有什么方法可以做到这一点,而不必每次我想射击它时都检查 Projectile 是否有 RigidBody?
我尝试了下面的代码,但它给了我一个错误,提示我无法将 RigidBody 实例化为游戏对象。这是可以理解的,但我 运行 没有想法。
public class Shoot : MonoBehaviour
{
public Rigidbody projectile;
public float firePower = 5f;
public void Fire()
{
GameObject projectileInstance = Instantiate(projectile) as GameObject;
//maybe add some particles/smoke effect
projectile.GetComponent<Rigidbody>().AddForce(firePower * transform.forward);
}
}
您可以检查预制件,看看它是否有像这样的 Rigidbody 组件:
if (currentPrefab.GetComponent<Rigidbody>()){
// Do something
}
如果您作为参数输入的类型不存在,GameObject.GetComponent() 方法将 return 为 null。
您可以在运行时添加您想要的组件,例如:
// First check if there is no rigidbody component on the object
if (!currentPrefab.GetComponent<Rigidbody>()){
// Add the Rigidbody component
currentPrefab.AddComponent<Rigidbody>();
// You can also add a collider here if you want collisions
var bc = currentPrefab.AddComponent<BoxCollider>();
// And you'll have to calculate the new collider's bounds
Renderer[] r = t.GetComponentsInChildren<Renderer>();
for(var i=0; i<r.length; i++) {
bc.bounds.Encapsulate(r[i].bounds);
}
}
我相信你已经在写作轨道上了。您只需通过执行以下操作来修复您的错误:
public Rigidbody projectile;
public float firePower = 5f;
public void Fire()
{
if( projectile == null )
{
Debug.LogError( "You forgot to provide a projectile prefab");
return;
}
Rigidbody projectileInstance = Instantiate(projectile) as Rigidbody;
projectileInstance.AddForce(firePower * transform.forward);
}
但是,使用此方法,您不能要求预制件具有多个组件。如果你需要这个,那么就用其他答案提供的方法吧。
这里的其他人已经为您提供了一些关于如何在运行时执行此操作的示例,但是我建议您向射弹 class 添加一个 [RequireComponent(typeof(RigidBody))]
(如果有的话)。
每次您将组件附加到 gameObject
时,Unity 也会自动添加所需的组件,而不会在运行时对游戏性能产生影响。只需将其添加到射弹脚本的 class 声明中即可。
但是您确实需要通过 Inspector 或 GetComponent
手动分配您的组件。但这可以确保您的对象附加了正确的组件。
你需要在你的射弹上安装某种脚本才能工作。所以如果你没有,你应该使用这里指出的另一个选项。
如果您有兴趣,可以找到文档here。