In Unity3D nimmt mein Gegner keinen Schaden, wenn er mit meiner Projektil-Explosion kollidiert.Unity3D - Gegner nimmt keinen Schaden
Obwohl dies nicht der Fall ist, da die Gesundheitsvariable bei Kollision mit meiner Projektilexplosion nicht betroffen ist.
Meine Klassen Enemy
und Barrel
erben von Entity
, die den Schaden übernehmen (Subtrahieren der Schadensvariable von der Health-Variable). Obwohl nur die Fassklasse wie vorgesehen funktioniert.
Die Tags sind zu 100% korrekt und ich würde lieber die Vererbung verwenden, also bitte keine Vorschläge, um die Methode zu ändern, in der meine Klassen Schaden erleiden.
die Klasse, die Enemy
und Barrel
vererben
using UnityEngine;
using System.Collections;
public class Entity : MonoBehaviour {
public float health = 25;
// Use this for initialization
void Start() {
}
// Update is called once per frame
void Update() {
}
public virtual void takeDamage(float dmg){
health -= dmg;
if (health <= 0){
Destroy(this.gameObject);
}
}
}
Enemy
Klasse
using UnityEngine;
using System.Collections;
public class Enemy : Entity {
private NavMeshAgent agent;
public GameObject target;
// Use this for initialization
void Start() {
agent = GetComponent<NavMeshAgent>();
}
// Update is called once per frame
void Update() {
agent.SetDestination (target.transform.position);
}
}
Barrel
Klasse
using UnityEngine;
using System.Collections;
public class Barrel : Entity {
private Transform myTransform;
//Effects
public GameObject barrelExplosion;
public GameObject explosionDamage;
public GameObject explosionSound;
// Use this for initialization
void Start() {
myTransform = this.transform;
}
// Update is called once per frame
void Update() {
}
public override void takeDamage(float dmg){
health -= dmg;
if (health <= 0){
Instantiate(barrelExplosion, myTransform.position, myTransform.rotation);
Instantiate(explosionSound, myTransform.position, myTransform.rotation);
Instantiate(explosionDamage, myTransform.position, myTransform.rotation);
Destroy(this.gameObject);
}
}
}
ExplosionAOE
die Klasse, die den Schaden sendet
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class ExplosionAOE : MonoBehaviour {
public float damage = 100.0f;
public float lifeTime = 0.05f;
private float lifeTimeDuration;
public List<GameObject> damageTargets = new List<GameObject>();
public float radius = 15.0f;
GameManager gameManager;
void Start() {
gameManager = GameObject.FindGameObjectWithTag("GameManager").GetComponent<GameManager>();
//Destroy (this.gameObject, lifeTime);
lifeTimeDuration = Time.time + lifeTime;
transform.GetComponent<SphereCollider>().radius = radius;
}
void Update() {
//Explosion finishes, damage targets and remove AOE field
if (Time.time > lifeTimeDuration) {
foreach (GameObject target in damageTargets) {
if (target != null) {
//Calculate damage based on proximity to centre of explosion
float thisDamage = ((radius - Vector3.Distance(target.transform.position, transform.position))/radius) * damage;
print(thisDamage);
target.GetComponent<Entity>().takeDamage(thisDamage);
//target.SendMessage("takeDamage", damage); //<< This is not good code. Let's fix this!
}
}
Destroy(this.gameObject);
}
}
void OnTriggerEnter(Collider otherObject) {
if (otherObject.gameObject.tag == "Enemy") {
damageTargets.Add(otherObject.gameObject);
}
if (otherObject.gameObject.tag == "Player") {
Vector3 jumpVector = (otherObject.transform.position - transform.position).normalized;
jumpVector *= 25;
otherObject.GetComponent<CharacterMotor>().SetVelocity(jumpVector);
}
}
}
Entschuldigung, das ist ein bisschen langwierig und ALLES ist richtig getaggt, also ist das nicht das Problem, danke.
nur neugierig: Gibt es einen Grund für die Erben von einer anderen Klasse anstelle einer Schnittstelle wie 'IHittable'? – garglblarg
@garglblarg Ich bin mir nicht sicher, ich bin ein Student, der Spielprogrammierung an der Uni studiert und das ist genau die Art und Weise, wie wir es gelernt haben. – jozza710
was genau funktioniert nicht? Verliert der Gesundheitswert deines Gegners nicht, wenn 'takeDamage' aufgerufen wird? –