C# Unity3d c“;对象引用未设置为对象的实例";?

C# Unity3d c“;对象引用未设置为对象的实例";?,c#,unity3d,instantiation,C#,Unity3d,Instantiation,`公共课拍摄:单一行为{ 在Unity3d中,我所要做的就是实例化一个shell并启动它。当我播放时,它会实例化shell,但它不会启动它,它只会下降。我不明白为什么我会不断出现这个错误。显然,我已经创建了一个对象的实例,对吗?非常感谢任何帮助!你的问题是你没有实例化一个shell刚体,您正在实例化一个游戏对象,其中包含一个刚体,作为一个组件 当您将用作并尝试将其强制转换为对象不是的对象时,它会设置强制转换空值。将强制转换为游戏对象,然后使用获取刚体,它应该可以工作 projectile = I

`公共课拍摄:单一行为{


在Unity3d中,我所要做的就是实例化一个shell并启动它。当我播放时,它会实例化shell,但它不会启动它,它只会下降。我不明白为什么我会不断出现这个错误。显然,我已经创建了一个对象的实例,对吗?非常感谢任何帮助!

你的问题是你没有实例化一个shell<代码>刚体,您正在实例化一个
游戏对象
,其中包含一个
刚体
,作为一个组件

当您将
用作
并尝试将其强制转换为对象不是的对象时,它会设置强制转换
空值
。将强制转换为
游戏对象
,然后使用获取
刚体
,它应该可以工作

projectile = Instantiate(shell, barrelEnd.position, barrelEnd.rotation) as GameObject;
Rigidbody rb = projectile.GetComponent<Rigidbody>();
rb.AddForce(0, 0, launchForce);
sparlode=实例化(shell,barrelEnd.position,barrelEnd.rotation)为游戏对象;
刚体rb=射弹。GetComponent();
rb.AddForce(0,0,launchForce);

出现此错误的原因有很多

确保在编辑器中指定了
shell
barrelEnd
。如果这样做,则需要从刚刚实例化的对象中获取组件

除非您的相机始终朝向Z轴,否则这行代码
sparket.AddForce(0,0,launchForce);
中会出现问题

如果这是一个FPS游戏,相机可以四处移动,请使用
cameraTransform.forward
使子弹始终向前/远离相机

public GameObject shell;
public Transform barrelEnd;
public float launchForce = 200;

Transform cameraTransform;

void Start()
{
    cameraTransform = Camera.main.transform;
}

void Update()
{

    if (Input.GetButtonDown("Fire1"))
    {
        Fire();
    }
}
void Fire()
{
    GameObject tempObj;
    tempObj = Instantiate(shell, barrelEnd.position, barrelEnd.rotation) as GameObject;
    Rigidbody projectile = tempObj.GetComponent<Rigidbody>();

    projectile.velocity = cameraTransform.forward * launchForce;
}
公共游戏对象外壳;
公共贷款;
公共浮动发射力=200;
变换摄像机变换;
void Start()
{
cameraTransform=Camera.main.transform;
}
无效更新()
{
if(Input.GetButtonDown(“Fire1”))
{
火();
}
}
虚火
{
游戏对象tempObj;
tempObj=实例化(shell,barrelEnd.position,barrelEnd.rotation)为游戏对象;
刚体投射物=tembobj.GetComponent();
射弹速度=摄像机转换向前*发射力;
}
  • 确保您有
    shell
    barrellEnd
    的值。您可以从unity编辑器或从code启动函数中执行此操作
  • 调用
    rb.AddForce(0,0,launchForce);
    检查
    rb
    是否为
    null
    。如果为null,Scott的方法将更有意义

  • 它给出了错误还是实例化了外壳或者两者都有?如果给出了错误,那么它不应该实例化任何东西。你能给我们提供更多细节吗?我们知道
    shell
    是可以的,因为它确实在播放器内创建了一个新的外壳,但是
    barrelEnd
    的优点忽略了这一点。但是我不同意使用t他是向前的,
    barrelEnd。向前的
    看起来更像是一个合乎逻辑的选择。谢谢你给我关于前进方向的提示。这也是一个问题
    public GameObject shell;
    public Transform barrelEnd;
    public float launchForce = 200;
    
    Transform cameraTransform;
    
    void Start()
    {
        cameraTransform = Camera.main.transform;
    }
    
    void Update()
    {
    
        if (Input.GetButtonDown("Fire1"))
        {
            Fire();
        }
    }
    void Fire()
    {
        GameObject tempObj;
        tempObj = Instantiate(shell, barrelEnd.position, barrelEnd.rotation) as GameObject;
        Rigidbody projectile = tempObj.GetComponent<Rigidbody>();
    
        projectile.velocity = cameraTransform.forward * launchForce;
    }