[在此处输入图像描述] [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
答案 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);
}