2016-08-17 2 views
-1

Ich möchte 10 Punkte gewinnen, wenn der Spieler einen Gegner tötet, aber ich verstehe es nicht. Ich habe eine Methode erstellt, um Punkte auf meinem PuntosPistas Skript im Player hinzuzufügen, und rufen Sie einfach die Methode innerhalb der CheckHealth des Feindes, aber es summieren nicht 10 Punkte in der Punktzahl. Kann mir jemand helfen? Dies ist mein Code:Erhalte Punkte, wenn der Spieler einen Gegner tötet

In dem Feind:

public class v_AIMotor : vCharacter 
{ 
    GameObject Player; 

    void Start() 
    { 
     Player = GameObject.FindGameObjectWithTag("Player"); 
    } 

    public void CheckHealth() 
    { 
     if (currentHealth <= 0 && !isDead) 
     { 

      isDead = true; 
      Player.GetComponent<PuntosPistas>().KillEnemy(); 
      print("10 points”); 
      DisableActions(); 
     } 
    } 
} 

Im Spieler:

public class PuntosPistas : MonoBehaviour 
{ 
    public int Score; 
    public Text TextoContador; 

    void Start() 
    { 
     Score = PlayerPrefs.GetInt("Score"); 
     TextoContador.text = "" + Score; 
    } 

    public void KillEnemy() 
    { 
     Score = Score + 10; 
     TextoContador.text = "" + Score; 
     PlayerPrefs.SetInt("Score",Score); 
    } 
} 

Entschuldigen Sie! Dies ist der vollständige Code, wo ich CheckHealth() aufrufen:

#region AI Health 

    GameObject Player; 

    void Start() 
    { 
     Player = GameObject.FindGameObjectWithTag("Player"); 
    } 

    public void CheckHealth() 
    { 
     if (currentHealth <= 0 && !isDead) 
     { 
      isDead = true; 
      Player.GetComponent<PuntosPistas>().KillEnemy(); 
      DisableActions(); 
     } 
    } 

    public void HealthRecovery() 
    { 
     if (currentHealth <= 0) return; 
     if (currentHealthRecoveryDelay > 0) 
     { 
      currentHealthRecoveryDelay -= Time.deltaTime; 
     } 
     else 
     { 
      if (currentHealth > maxHealth) 
       currentHealth = maxHealth; 
      if (currentHealth < maxHealth) 
       currentHealth = Mathf.Lerp(currentHealth, maxHealth, healthRecovery * Time.deltaTime); 
     } 
    } 

    protected void RemoveComponents() 
    { 
     if (_capsuleCollider != null) Destroy(_capsuleCollider); 
     if (_rigidbody != null) Destroy(_rigidbody); 
     if (animator != null) Destroy(animator); 
     if (agent != null) Destroy(agent); 
     var comps = GetComponents<MonoBehaviour>(); 
     foreach (Component comp in comps) Destroy(comp); 
    } 

    public override void TakeDamage(Damage damage) 
    { 
     if (rolling || currentHealth <= 0) return; 
     if (canSeeTarget() && !damage.ignoreDefense && !actions && CheckChanceToRoll()) return; 
     // change to block an attack 
     StartCoroutine(CheckChanceToBlock(chanceToBlockAttack, 0)); 
     // defend attack behaviour 
     if (canSeeTarget() && BlockAttack(damage)) return; 
     // instantiate hit particle 
     var hitRotation = Quaternion.LookRotation(new Vector3(transform.position.x, damage.hitPosition.y, transform.position.z) - damage.hitPosition); 
     SendMessage("TriggerHitParticle", new HittEffectInfo(new Vector3(transform.position.x, damage.hitPosition.y, transform.position.z), hitRotation, damage.attackName), SendMessageOptions.DontRequireReceiver); 
     // apply damage to the health 
     currentHealth -= damage.value; 
     currentHealthRecoveryDelay = healthRecoveryDelay; 
     // apply tag from the character that hit you and start chase 
     if (!sphereSensor.passiveToDamage && damage.sender != null) 
     { 
      target = damage.sender; 
      currentState = AIStates.Chase; 
      sphereSensor.SetTagToDetect(damage.sender); 
      if (meleeManager != null) 
       meleeManager.SetTagToDetect(damage.sender); 
     } 
     // trigger hit sound 
     if (damage.sender != null) 
      damage.sender.SendMessage("PlayHitSound", SendMessageOptions.DontRequireReceiver); 
     // update the HUD display 
     if (healthSlider != null) 
      healthSlider.Damage(damage.value); 
     // trigger the HitReaction when the AI take the damage 
     var hitReactionConditions = stepUp || climbUp || jumpOver || quickTurn || rolling; 
     if (animator != null && animator.enabled && !damage.activeRagdoll && !hitReactionConditions) 
     { 
      animator.SetInteger("Recoil_ID", damage.recoil_id); 
      animator.SetTrigger("HitReaction"); 
     } 
     // turn the ragdoll on if the weapon is checked with 'activeRagdoll' 
     if (damage.activeRagdoll) 
      transform.SendMessage("ActivateRagdoll", SendMessageOptions.DontRequireReceiver); 

     CheckHealth(); 
    } 

    #endregion 

Und das ist der Fehler in der Konsole:

Nullreferenceexception: Objektverweis nicht auf eine Instanz eines Objekts Invector.v_AIMotor.CheckHealth gesetzt () (bei Assets/Invector-3rdPersonController/Scripts/CharacterAI/v_AIMotor.cs: 504) Invector.v_AIMotor.TakeDamage (.Damage Schaden) (bei Assets/Invector-3rdPersonController/Scripts/CharacterAI/v_AIMotor.cs: 582) UnityEngine .Component: SendMessage (String, Objekt, SendMessageOptions) vMeleeManager: OnDamageHit (HitInfo) (bei Assets/Invector-3rdPersonCon troller/Skripte/MeleeCombat/vMeleeManager.cs: 295) UnityEngine.Component: SendMessageUpwards (String, Objekt, SendMessageOptions) Invector.vHitBox: CheckHitProperties (Collider) (bei Assets/Invector-3rdPersonController/Scripts/MeleeCombat/vHitBox.cs: 68) Invector.vHitBox: OnTriggerEnter (Collider) (bei Aktiva/Invector-3rdPersonController/Scripts/MeleeCombat/vHitBox.cs: 48)

+0

Wo rufen Sie 'CheckHealth()' Methode? –

+0

Bitte formatieren Sie Ihren Code richtig –

Antwort

1

Sie bitte auf die Art und Weise untersuchen Sie rufen CheckHealth(), es ist nicht klar, aus dem Code . Dieser Code sollte Arbeit sein, wenn Sie die Methode richtig aufrufen, versuchen auf diese Weise:

public class v_AIMotor : vCharacter{ 
GameObject Player; 

void Start() 
{ 
    Player = GameObject.FindGameObjectWithTag("Player"); 
} 

public void CheckHealth() 
{ 
    if (currentHealth <= 0 && !isDead) 
    { 

     isDead = true; 
     Player.GetComponent<PuntosPistas>().KillEnemy(); 
     print("10 points”); 
     DisableActions(); 
    } 
} 

void Update() 
{ 
    CheckHealth(); 
} 
} 

Leere Update ist nicht der beste Weg, sicher, aber sollte die Arbeit erledigen sein.

Verwandte Themen