2015-05-12 3 views
0

Я работаю над базовой системой стрельбы из AI, на которой андроиды могут стрелять в людей и людей у ​​андроидов. Система работает, и обе команды могут стрелять и убивать друг друга, но как только один убит, это raycast, похоже, не обнаруживает коллайдеров противника. Результатом этого является то, что бот, который убил другого в первую очередь, больше не может быть поврежден этим ботом и поэтому может «лагерей» его, когда он восстанет.Raycasts останавливают обнаружение коллайдеров (или коллайдеры перестают обнаруживать расисты)

EDIT: Когда они возрождаются, они до сих пор raycast как обычно, он просто не обнаруживает столкновения с коллайдера (ами)

Моя съемка делается чисто raycasts и убить/возродится моих ботов деактивировать их и переместить их обратно в место их появления. Отслеживание другой команды осуществляется через NavMeshAgents и agent.destination. Ниже перечислены все сценарии, которые для них. Извините, если много.

AndroidShoot Script

using UnityEngine; 
using System.Collections; 

public class AndroidShoot : MonoBehaviour { 

public GameObject humanTarget; 
public GameObject playerTarget; 
public PlayerHealth playerHealth; 
public allyHealth allyHealth; 

public lastShooter lastShot; 

float gunDelay = 0.75f; 
bool isShooting = false; 

// Update is called once per frame 
void Update() { 
    shootGun(); 
} 

// Name what for the raycast collides with (used to reference the target point) 
RaycastHit hit; 
void shootGun() { 

    Vector3 rayDirection = GetComponent<Rigidbody>().transform.forward; 

    if (Physics.Raycast (transform.position + transform.up * 1.5f, rayDirection, out hit)) { 
     Debug.Log("enemy shoot check"); 
     Debug.DrawLine(transform.position + transform.up * 1.5f, hit.point, Color.yellow, 2f); 

HumanShoot Script

using UnityEngine; 
using System.Collections; 

public class humanShoot : MonoBehaviour { 

public mainEnemyLife enemyHealth; 
public lastShooter lastShot; 

float gunDelay = 0.75f; 
bool isShooting = false; 

// Update is called once per frame 
void Update() { 
    shootGun(); 
} 

RaycastHit hit; 
void shootGun() { 

    Vector3 rayDirection = GetComponent<Rigidbody>().transform.forward; 

    if (Physics.Raycast (transform.position + transform.up * 1.5f, rayDirection, out hit)) { 
     Debug.Log("ally shoot check"); 
     Debug.DrawLine(transform.position + transform.up * 1.5f, hit.point, Color.black, 2f); 

     if(hit.collider.gameObject.CompareTag ("Enemy_Torso") && isShooting == false) { 
      isShooting = true; 
      StartCoroutine (enemyShootAlly()); 
      Debug.DrawLine(transform.position + transform.up * 1.5f, hit.point, Color.cyan, 2f); 
      lastShot.shotLastUpdate(this.gameObject.name); 
     } 
     if(hit.collider.gameObject.CompareTag ("Enemy_Head") && isShooting == false) { 
      isShooting = true; 
      StartCoroutine (enemyShootAlly()); 
      Debug.DrawLine(transform.position + transform.up * 1.5f, hit.point, Color.cyan, 2f); 
      lastShot.shotLastUpdate(this.gameObject.name); 
     } 
     if(hit.collider.gameObject.CompareTag ("Enemy_Limb") && isShooting == false) { 
      isShooting = true; 
      StartCoroutine (enemyShootAlly()); 
      Debug.DrawLine(transform.position + transform.up * 1.5f, hit.point, Color.cyan, 2f); 
      lastShot.shotLastUpdate(this.gameObject.name); 
     } 
    } 
} 

IEnumerator enemyShootAlly() { 
    Debug.Log("enemy damaged"); 

    enemyHealth.enemyHealth -= 15f; 

    yield return new WaitForSeconds (gunDelay); 
    Debug.Log ("ally can shoot"); 
    isShooting = false; 
} 
} 

AndroidHealth Script

using UnityEngine; 
using System.Collections; 

public class mainEnemyLife : MonoBehaviour { 

public float enemyHealth = 100.0f; 

public lastShooter lastShooter; 
public enemyRespawn enemyRespawn; 
public ScoreboardDisplay scoreboardScore; 

// Update is called once per frame 
void Update() { 
    enemyDeath(); 
} 

public void enemyTakeDamage(float damage) { 
    enemyHealth -= damage; 
} 

public void enemyDeath() { 
    if (enemyHealth <= 0.0f) { 
     Debug.Log(this.gameObject.name + " was killed by " + lastShooter.shotLast); 
     scoreboardScore.scoreboardIncrease(); 
     enemyRespawn.respawnEnemy(); 
     enemyHealth = 100.0f; 
    } 
} 
} 

HumanHealth Script

using UnityEngine; 
using System.Collections; 

public class allyHealth : MonoBehaviour { 

public float humanHealth = 100.0f; 
public string allyName; 

public allyRespawn humanRespawn; 
public lastShooter lastShooter; 
public ScoreboardDisplay scoreboardScore; 

// Use this for initialization 
void Start() { 
    allyName = this.gameObject.name; 
} 
// Update is called once per frame 
void Update() { 
    humanDeath(); 
} 
void humanDeath() { 
    if (humanHealth <= 0f) { 
     gameObject.SetActive(false); 
     Debug.Log(allyName + " was killed by " + lastShooter.shotLast); 
     scoreboardScore.scoreboardIncrease(); 
     humanRespawn.respawnAlly(); 
     humanHealth = 100.0f; 
    } 
} 
} 

AndroidRespawn Script

using UnityEngine; 
using System.Collections; 

public class enemyRespawn : MonoBehaviour { 

public float respawnTime = 1f; 
public GameObject enemy; 

public void respawnEnemy() { 
    StartCoroutine (androidRespawn()); 
} 

IEnumerator androidRespawn() { 
    enemy.SetActive (false); 
    yield return new WaitForSeconds (respawnTime); 
    enemy.transform.position = this.transform.position; 
    enemy.SetActive (true); 
    Debug.Log (enemy.name + " has respawned."); 
} 
} 

HumanRespawn Script

using UnityEngine; 
using System.Collections; 

public class allyRespawn : MonoBehaviour { 

public float respawnTime = 1f; 
public GameObject ally; 

public void respawnAlly() { 
    StartCoroutine (humanRespawn()); 
} 

IEnumerator humanRespawn() { 
    ally.SetActive(false); 
    yield return new WaitForSeconds (respawnTime); 
    ally.transform.position = this.transform.position; 
    Debug.Log (ally.name + " has respawned."); 
    ally.SetActive (true); 
} 
} 

Любая помощь будет принята с благодарностью.

+1

Больше кода, которому нужно пройти, тем меньше вероятность, что люди смогут найти вашу проблему: http://stackoverflow.com/help/mcve –

+0

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

+2

Когда вы отключите GameObject (или компонент), вы прекратите прикреплять к нему все сопрограммы. Поскольку ваш режим съемки прекращается, когда игрок умирает, он никогда не сбрасывает значение 'isShooting' в значение по умолчанию. Попробуйте вернуть его в нормальное состояние на респаун. – rutter

ответ

1

Решения найдено благодаря Раттерам:

Отключение GameObject или компонент останавливает сопрограммы присоединенных к нему и пакам боты застряли на isShooting = True, чтобы они не могли стрелять. Я исправил его, установив isShooting = false; в функции респауна.

+0

Я собирался ответить, но я рад, что вы это решили. – Programmer

 Смежные вопросы

  • Нет связанных вопросов^_^