Я работаю над базовой системой стрельбы из 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);
}
}
Любая помощь будет принята с благодарностью.
Больше кода, которому нужно пройти, тем меньше вероятность, что люди смогут найти вашу проблему: http://stackoverflow.com/help/mcve –
Ну, я не уверен, какой код нужен, чтобы на самом деле помочь решить его, так как я не знаю, почему он не работает должным образом после первой смерти. Я включаю в себя то, что может быть актуальным для этого. – ixTec
Когда вы отключите GameObject (или компонент), вы прекратите прикреплять к нему все сопрограммы. Поскольку ваш режим съемки прекращается, когда игрок умирает, он никогда не сбрасывает значение 'isShooting' в значение по умолчанию. Попробуйте вернуть его в нормальное состояние на респаун. – rutter