为什么在敌方游戏对象被摧毁后我的实体化不会产生一个物体?

时间:2018-01-26 14:08:22

标签: c# unity3d unity5 unityscript

[在此处输入图像描述] [1]最初,这是一个空引用异常,这是在使用/引用变量但尚未初始化时出现的问题。我使用了一个if语句来检查实例是否为null,它将实例化。 Null引用异常问题已经消失,但仍然无法实例化。

ScraptScript.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ScrapScript : MonoBehaviour 
{

public GameObject[] ScrapSprite;

EnemyScript Es;


void Start () 
{
    Es = GameObject.FindObjectOfType<EnemyScript> ();

    foreach(GameObject SSprite in ScrapSprite)
    {
        print (SSprite);
    }


}


void Update () 
{

}

public void SpawnScraps()
{
    if(Es != null   )
    {
        Instantiate (ScrapSprite[0], Es.transform.position, Es.transform.rotation);
    }
}

}

EnemyDestroyed.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyDestroyed : MonoBehaviour {

BulletScript.BulletType theBulletType = 0;


ScrapScript SS;

void Start () 
{
    SS = GameObject.FindObjectOfType<ScrapScript> ();
}

void Update () 
{

}


void OnTriggerEnter(Collider collider)
{
    if(collider.tag == "PlayerBullet" && theBulletType == BulletScript.BulletType.PlayerBullet)
    {
        print ("ship destroyed");
        Destroy(collider.gameObject);
        Destroy(gameObject);
        SS.SpawnScraps ();  
    }

    if(collider.tag == "L.Collider Det")
    {
        Destroy(gameObject);

    }
}

}

EnemyScript.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyScript : MonoBehaviour {

public int enemyHP;
public float enemySpeed;

public GameObject enemyBullet;

internal int enemyBulletCount = 0;
public int maxAllowableBulletCount;

public Transform enemyBulletSpawn;

public EnemyType ET;

public enum EnemyType
{
    Grunt,
    Boss,
}

void Awake()
{
    StartCoroutine (MyShootCoroutine ());
}

void Start () 
{

}


void Update () 
{
    if (ET == EnemyType.Grunt) 
    {
        transform.Translate (-enemySpeed * Time.deltaTime, 0f, 0f);

    }
}

IEnumerator MyShootCoroutine()
{


    for(enemyBulletCount = 0; enemyBulletCount <= maxAllowableBulletCount; enemyBulletCount++)
    {
        yield return new WaitForSeconds (1.5f);
        Instantiate (enemyBullet, enemyBulletSpawn.position, enemyBulletSpawn.rotation);
    }   

}   

}

期望:我对我的代码的期望是产生一种称为“Scraps”的拾取货币,玩家在敌人被摧毁时会接触到该货币。它通过玩家的子弹准确地产生敌人被摧毁的地方。

截图链接 [在此处输入图像说明] [1] [1]:https://i.stack.imgur.com/6iq11.png

2 个答案:

答案 0 :(得分:0)

假设您在Es对象上的SpawnScraps方法中有一个空引用异常,唯一的问题是当您的方法被调用时,Es对象已被销毁。

假设您在尝试调用方法之前杀死了您的ennemy实例,则会得到一个空引用异常:

Destroy(collider.gameObject);
Destroy(gameObject);
SS.SpawnScraps ();

在销毁敌人游戏对象之前,只需调用SpawnScraps方法:

SS.SpawnScraps ();
Destroy(collider.gameObject);
Destroy(gameObject);

答案 1 :(得分:0)

在您的剪贴簿脚本中,您的Es可能仍为空。这可能是因为您的脚本仅在Start()期间找到Enemyscript。 您可以通过将敌人的变换传递到SpawnScraps函数来删除此检查并简化操作。

在Enemydestroyed中

将您的行改为:

SS.SpawnScraps (transform);  
Scraptscript中的

将现有函数更改为:

public void SpawnScraps(Transform enemy)
{
    Instantiate (ScrapSprite[0], enemy.position, enemy.rotation);
}