2015-12-15 2 views
-1

У меня есть простая игра, в которой игрок защищает центральную базу от нападения врагов. В настоящее время, когда игрок касается базы, враги все прекращают атаковать. Атаки обрабатываются в соответствии с сценарием Enemy. Я разместил здесь скрипты противников и базы. ВРАГ SCRIPTCollision останавливает врагов от нападения - Unity3D

using UnityEngine; 
using System.Collections; 

public class Enemy : MonoBehaviour { 

public static float Damage = 10.0f; 
public float Health = 20.0f; 

public Transform target; 
public float Speed; 

public bool isAttacking = false; 

//If the player collides with the enemy 
void OnTriggerEnter2D(Collider2D col) 
{ 
    if(col.gameObject.tag == "Player") 
    { 
     Debug.Log("Player hits enemy"); 
     Health -= PlayerController.Damage; 
     Debug.Log("Enemy health at: " + Health); 
    } 
} 


// Use this for initialization 
void Start() { 

} 

// Update is called once per frame 
void Update() { 

    //Destroy the enemy if it's health reaches 0 
     if(Health <= 0){ 
      isAttacking = false; 
      Debug.Log ("Is attacking: " + isAttacking); 
      Destroy(this.gameObject); 
      Debug.Log ("Enemy Destroyed!"); 
     } 

    //Constantly move the enemy towards the centre of the gamespace (where the base is) 
    float step = Speed * Time.deltaTime; 
    transform.position = Vector3.MoveTowards(transform.position, target.position, step); 
} 
} 

БАЗА SCRIPT

using UnityEngine; 
using System.Collections; 

public class Base : MonoBehaviour { 

public float Health = 100f; 
public float AttackSpeed = 2f; 

//VOID AWAKE - START . contains getcomponent code 
public Enemy enemy; 
void awake(){ 
    enemy = GetComponent<Enemy>(); 
} 
//VOID AWAKE - END 

//If enemy touches the base 
void OnCollisionEnter2D(Collision2D col){ 
    Debug.Log ("Base touched"); 
    if(col.gameObject.tag == "Enemy" && Health > 0f){ 
     enemy.isAttacking = true; 
     Debug.Log ("Enemy attacking base"); 
     StartCoroutine("enemyAttack"); 
    } 
    else{ 
     enemy.isAttacking = false; 
    } 
} 

//Coroutine that deals damage 
public IEnumerator enemyAttack(){ 
    while(Health > 0f){ 
     if(enemy.isAttacking == true){ 
      yield return new WaitForSeconds(2f); 
      Health -= Enemy.Damage; 
      Debug.Log ("Base health at: " + Health); 
     }else{ 
      yield break; 
     } 
    } 
} 

// Use this for initialization 
void Start() { 

} 

// Update is called once per frame 
void Update() { 

    //Load Lose Screen when Base health reaches 0 
    if (Health <= 0){ 
     Application.LoadLevel("Lose Screen"); 
    } 

} 
} 
+1

так что у вас вопрос .. также я спрошу, вы установили точки останова в текущем коде, который вы опубликовали, и шаг за шагом? – MethodMan

+0

Немного сложно говорить, но в основном, когда игрок касается базы, он останавливает врагов от нападения. Я не хочу, чтобы это произошло. Теперь я добавляю точки останова и немного вторгаюсь в код, но просто хотел указать некоторые указатели, если бы это было что-то очевидное. – lucasRHCP

+2

Никто не успевает пробираться через огромный свалку кода. Вам нужно сузить проблему самостоятельно, используя обычный процесс отладки. Сделайте это * первым *, а затем опубликуйте, если у вас все еще есть проблемы. –

ответ

0

Я подозреваю, что ваша проблема с логикой здесь:

void OnCollisionEnter2D(Collision2D col){ 
    Debug.Log ("Base touched"); 
    if(col.gameObject.tag == "Enemy" && Health > 0f){ 
     enemy.isAttacking = true; 
     Debug.Log ("Enemy attacking base"); 
     StartCoroutine("enemyAttack"); 
    } 
    else{ 
     enemy.isAttacking = false; 
    } 
} 

NoW ваше состояние:

if(col.gameObject.tag == "Enemy" && Health > 0f) 

Так что если вещь colli динь с базой (если я правильно понять это) не «враг», то вы идете в статье еще:

enemy.isAttacking = false; 

И остановить противника атаковать.

Возможно, что вы хотите что-то вроде:

if (col.gameObject.tag == "Enemy") 
{ 
    if (Health > 0f) 
    { 
     //...do stuff 
    } 
    else 
    { 
     enemy.isAttacking = false; 
    } 
} 

Теперь-то, что не враг прикасаясь свою базу не остановит воздействовать на противника.

Но трудно сказать, когда вы сбрасываете код в вопросе с небольшим или никаким объяснением, так что это может быть далеко.