Hello,
Pour répondre a ta toute première question, il faut bien que tu comprennes que tout GameObject possède un composant Transform contenant entre autre les données de sa position. Si tu veux la position d'un GameObject, tu dois t'adresser directement à son Transform, le GameObject lui ne possède pas ces infos, il ne sait même pas ce qu'est une position ^^.
Deuxièmement,
Distance = Vector3.Distance(Target.position, transform.position);
Si je regarde ton code, Target est un TABLEAU de GameObject, il n'existe pas de méthode Distance qui prend un tableau et un vector3 en paramètre.
D'ailleur je ne comprend pas la suite de ton explication : "Ce que je voudrais faire, c'est passer Target en GameObject et toujours avoir la position du Transform."
Je suppose que tu veux pouvoir examiner chaque élément de ton tableau, une simple boucle suffit
Code : Tout sélectionner
for( var i :int = 0 ; i < Target.Length; ++i ){
distance = Vector3.Distance(Target[i].transform.position, transform.position);
// do smthng with distance
...
}
Ensuite il y a des erreurs de logique dans ton code.
si je suis le comportement après avoir cliquer sur "Fire1" :
tu joues une animation
tu vérifies si... il y a au moins une cible à portée ?
tu récupéré TOUT les ennemis dans un tableau1
tu créées un tableau2 vide de meme taille que le tableau1
pour chaque element de ton tableau1
tu place le composant dans le tableau2
et tu utilise cette reference pour diminuer la vie
le tableau2 est vraiment de l'utilisation mémoire inutile et il n'y a pas de tri entre tes cibles "valides" ou non
Finalement, je vais rejoindre Boubouk et te conseiller d'apprendre les bases de la programmation sur openclassroom, tu as de bonnes idées dans ton code mais il te manque les concepts de bases et surtout la logique de programmation.
Je vais quand même te mettre une potentiel correction (en c#, plus facile pour moi). Ça devrai te donner une idée du résultat attendu pour ce genre de problème.
Il n'y a pas de calcul de distance, pour moi il faudrait un collider trigger sur ton joueur, et de la on édite une liste en fonction de ce qui rentre et ce qui sort de cette zone.
(code écrit sur notepad donc il y a surement des erreurs)
Code : Tout sélectionner
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Joueur : MonoBehaviour {
[SerializeField] private int damage = 0;
private List<ZombieScript> allZombies;
private List<ZombieScript> targetedZombies;
void Start() {
targetedZombies = new List<ZombieScript>();
}
void Update() {
// Si on appuie sur Fire1 et qu'on a au moins une cible dans notre liste, on attaque
if (Input.GetButton("Fire1") && targetedZombies.Count > 0)
Attack();
}
// On joue l'animation et on inflige des dégats a tout les zombies ciblés.
void Attack() {
GetComponent.<Animator>().Play("Cut", 0, 0);
for (int i = 0; i<targetedZombies ; i++) {
targetedZombies.receiveDamage(damage);
}
}
// Méthode pour ajouter un zombie a notre liste de cible
public void addZombie(ZombieScript zombie) {
targetedZombies.add(zombie);
}
// Méthode pour retirer un zombie de notre liste de cible
public void removeZombie(ZombieScript zombieRef) {
for (int i = 0; i<targetedZombies ; i++)
if (zombieRef == targetedZombies[i]) {
targetedZombies.Remove(i);
return;
}
}
return;
}
// Si un zombie entre dans ma zone de frappe, je l'ajoute a ma liste de cible
void OnTriggerEnter(Collider other) {
if (other.tag == "Zombie")
addZombie(other.gameObject.getComponent<ZombieScript>());
}
// Si un zombie sort de ma zone de frappe, je le retire de ma liste de cible
void OnTriggerExit(Collider other) {
if (other.tag == "Zombie")
removeZombie(other.gameObject.getComponent<ZombieScript>());
}
}
Code : Tout sélectionner
using UnityEngine;
public class Zombie : MonoBehaviour {
[SerializeField] private Joueur myPlayer;
[SerializeField] private float health = 50f;
void Start() {
if (myPlayer == null)
myPlayer = GameObject.FindGameObjectsWithTag("Respawn")
}
// si je meurt, je ne fais plus partie des cibles du joueur.
void onDeath() {
myplayer.removeZombie(this);
GameObject.Destroy(this.gameObject);
}
public void receiveDamage(float amount) {
health -= amount;
if (health <=0)
onDeath();
}
}