我正在尝试实施“射击” MonoBehaviour。 我希望它做的非常简单,应该将Prefab用作“输入”(暂时将其存储在“射弹”公共变量中),然后简单地实例化它并向其RigidBody添加一个正向力(相对于它附加到的对象,例如坦克)。
但是,如果我不小心插入没有RigidBody的Prefab,我不希望游戏崩溃。 (事实上,如果它甚至不允许我添加没有RigidBodies的预制件作为弹丸,那就太好了。
我尝试使用“ RequireComponent”属性,但看起来它仅适用于类。有什么方法可以做到,而不必每次我要射击时都要检查弹丸是否具有RigidBody吗?
我尝试了下面的代码,但是它给我一个错误,提示我无法将RigidBody实例化为GameObject。这是可以理解的,但是我在这里没什么主意。
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);
}
}
答案 0 :(得分:1)
您可以对预制件进行检查,看它是否具有刚体组件,如下所示:
if (currentPrefab.GetComponent<Rigidbody>()){
// Do something
}
如果您输入的类型不存在,GameObject.GetComponent()方法将返回null。
答案 1 :(得分:1)
您可以在运行时添加所需的组件,例如:
// 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);
}
}
答案 2 :(得分:0)
我相信您已经在写作轨道上。您只需执行以下操作即可纠正错误:
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);
}
但是,使用这种方法,您不能要求预制件具有多个组件。如果需要,请使用其他答案提供的方法。
答案 3 :(得分:0)
这里的其他人已经为您提供了一些有关如何在运行时执行此操作的示例,但是,我建议您向射弹类(如果有)添加一个[RequireComponent(typeof(RigidBody))]
。
该操作是每次将组件连接到gameObject
时,Unity也会自动添加所需的组件,而不会影响运行时的游戏性能。只需在投射脚本的类声明上添加此内容即可。
但是,您确实需要通过检查器或GetComponent
手动分配组件。但这可以确保您的对象已附加了正确的组件。
您需要在弹丸上有某种脚本才能正常工作。因此,如果没有,则应使用此处指出的另一个选项。
如果您有兴趣,可以在here上找到文档。