2017-07-21 45 views
0

ゾンビオブジェクトにゾンビプレハブを添付しました。しかし、Playを押すと、ゾンビオブジェクトでスクリプトが消えます。 Playを押すと、スクリプトがオブジェクトに残るようにするにはどうすればよいですか?Unity:プレイモードに入ると、オブジェクト上のスクリプトが消える

私の変数を宣言して初期化しました。私はそれが何か基本的だと知っていますが、あなたの助けが大いに評価されるでしょう!

public class PlayerLifeCollider : MonoBehaviour { 

    public Zombie zombie; //declared 
    public float damage = 1; 

    public void Start() 
    { 
     zombie = GetComponent<Zombie>(); //instantiated 
    } 

    private void Update() 
    { 
     zombie.DamagePlayer(damage); //**Null error here** 
    } 
} 

public class Zombie : MonoBehaviour 
{ 
    public int currentHealth; 
    private Player player; 
    private PlayerLifeCollider playerCollider; 
    public int damage; 

    public void Start() 
    { 
     playerCollider = GetComponent<PlayerLifeCollider>(); 
    } 

    public void Damage(int damageAmount) 
    { 
     currentHealth -= damageAmount; 
     if (currentHealth <= 0) 
     { 
      playerCollider.ObjectsInRange.Remove(gameObject); 
      gameObject.SetActive(false); 
     } 

    } 

    public void DamagePlayer(float damage) 
    { 
     player.Life(damage); 
    } 
} 

public class Player : MonoBehaviour { 

public float playerLife = 100; 

public void Life (float damage) 
    { 
     playerLife -= damage; 
     if (playerLife <=0) 
     { 
      playerLife = 100; 
      SceneManager.LoadScene(2); 
     } 
} 

Before Zombie Attached

After Zombie Not Attached

+0

'player.Life(float)'の実装は何ですか? –

+0

'zombie = GetComponent ()'が既にインスペクタに割り当てられている場合は、割り当てる必要はありません。 – ryeMoss

答えて

1

ここでの問題は、ということです実行時にzombieの値を上書きしてしまい、その値がNULL値に置き換えられます。コード:

public void Start() 
{ 
    zombie = GetComponent<Zombie>(); //instantiated 
} 

親ゲームオブジェクト(PlayerLifeCollider)からZombieスクリプトコンポーネントを取得しようとする試み - しかしPlayerLifeCollider上Zombieスクリプトがありません!したがって、nullを返し、変数zombieに代入します。

zombieに値を割り当てたので、インスペクタのパブリック変数にドラッグすることで、実行時に値を割り当てる必要はありません。この行は安全に削除することができ、その値は保持されます。

希望すると便利です。ご質問がある場合はお知らせください。

+0

ドラッグまたはGetComponentによってオブジェクトに値を割り当てるタイミングをどのように知っていますか()? – MrHero

+0

@MrHero変数をパブリックにして値をドラッグするのが最も便利なことがよくあります。なぜなら、スクリプトを使用しているオブジェクトへの参照を取得する必要がないからです( 'GetComponent() 'を呼び出すことができるように)。しかし、実行時に作成されたオブジェクト(例えば、Viaインスタンス化されたプレハブ)からスクリプトを取得する必要がある場合、事前にそれらを変数にドラッグすることはできません(存在しないため)ので、GetComponent () 'を返します。実行時に実行すると、スクリプトを追加するたびにオブジェクトをその変数にドラッグする必要がないため、スクリプトをシーン間で再利用しやすくなります。 – Serlite

関連する問題