2017-08-21 1 views
0

playerLifeがドロップされるため、変数がインスペクタまたは画面上の正常性テキストで視覚的に更新されません。ゼロ以下。Unity:PlayerLife変数がInspectorまたはHUDで視覚的に更新されず、背景でも機能します。

私はプレハブZombieゲームオブジェクトに添付Playerが単独プレハブPlayerではなく、シーン内のアクティブPlayerであると判断しました。ゾンビは基本的なPlayerプレハブではなく、現場でアクティブなPlayerをスクリプトで参照するようにしますか?

Call hierarchy for playerLife

public class Player : MonoBehaviour 
{ 
    public RaycastHit hit; 
    public int gunDamage = 1; 
    public Zombie zombie; 

    private float hitForce = 100f; 
    public float playerLife; 
    private Vector3 flareLower = new Vector3(0, -0.5f, 0); 

    void Start() 
    { 
     spawnPoints = playerSpawnPoint.GetComponentsInChildren<Transform>(); 
     playerLife = 200; 
    } 

    void Update() //T-toggle 
    { 
     if (Input.GetButton("Fire1")) 
     { 
      LazerBeam(); 
     } 

     if (reSpawn != lastToggle) 
     { 
      ReSpawn(); 
      reSpawn = false; 
     } 
     else 
      lastToggle = reSpawn; 
    } 



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

} 

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

    public void Damage(int damageAmount) 
    { 
     currentHealth -= damageAmount; 
     if (currentHealth <= 0) 
     { 
      PlayerLifeCollider.instance.ObjectsInRange.Remove(gameObject); 
      DestroyZombie(); 
     } 
    } 

    public void DestroyZombie() 
    { 
     Destroy(gameObject); 
     // gameObject.SetActive(false); 
    } 

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

プレイヤーライフが変わる前にプレーヤーが死んでしまう可能性はありますか?それが変化しなければ、それはおそらくゼロに達することができないので、プレイヤーは無敵でなければならない。 –

+0

「更新しない」とまったく同じ意味ですか?プレイヤーが死ぬまでInspectorで 'lifePlayer'の値が決して変更されないことを意味しますか? – Isuka

+0

ゾンビの内部にプレーヤー変数を設定していないと思っていたのですか? –

答えて

0

あなたが言ったように、問題はあなたがしていることである(また、それは私が手動でゾンビにアクティブプレイヤーをドラッグすることはできません)シーンのPlayerオブジェクトを参照するのではなく、プレハブオブジェクトを参照します。これを避けるには、Start関数をゾンビスクリプトに追加して、シーン内の唯一のPlayerインスタンスを探すように依頼することができます。このために、あなたはFindObjectOfType機能を使用することができます:あなただけのシーン全体で1人のプレーヤーのスクリプトを持つことになります考慮

void Start() 
{ 
    player = FindObjectOfType<Player>(); 
} 

を、あなたも何ができるかプレイヤークラスのプレイヤーのインスタンスへの静的参照を保存することです。

public class Player : MonoBehaviour 
{ 
    private static Player _instance; 

    public static Player Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       _instance = FindObjectOfType<Player>(); 
      } 
      return _instance; 
     } 
    } 

    // Reset of your class 

} 

あなたは、あなたのゾンビスクリプトでこの参照を取得することができます:

public class Zombie : MonoBehaviour 
{ 
    static Player player; 

    void Start() 
    { 
     if(player == null) 
     { 
      player = Player.Instance; 
     } 
    } 

    // Rest of your class content 
} 

この方法で、あなただけのFindObjectOfType機能の代わりに、オブジェクトごとに一度ゾンビスクリプトを使用して1つの呼び出しを持つことになります。

0
public void Damage(int damageAmount) 
{ 
    currentHealth -= damageAmount; 

    print(currentHealth);// will show in terminal if thats what you are asking 


    if (currentHealth <= 0) 
    { 
     PlayerLifeCollider.instance.ObjectsInRange.Remove(gameObject); 
     DestroyZombie(); 
    } 
} 
+0

私は説明を編集しました、私はそれが間違ったprefabではなく、ゲームオブジェクトに添付されていることを発見しました。あなたはゲーム内のオブジェクトをスクリプトでつける方法を知っていますか? – MrHero

+0

public GameObject nameOfObject; – Shane

+0

その後、オブジェクトをスクリプトに結合します – Shane

関連する問題