2017-01-18 3 views
1

assistants Bonjour de l'internet,unité 3d C# ennemi marche à travers les murs

Je fais une première personne en 3D RPG où vous pouvez attaquer les ennemis qui se trouvent sur la carte. Mon script actuel fonctionne bien, mais il y a un problème: les ennemis traversent les murs à chaque fois qu'ils se concentrent sur le joueur.

J'ai déjà essayé quelques solutions pour résoudre ce problème, mais malheureusement, il n'y a eu aucun résultat. Est-ce que quelqu'un sait une solution à ce problème?

Merci d'avance.

goblinAttack.cs:

using UnityEngine; 
using System.Collections; 

public class goblinAttack : MonoBehaviour { 

    public Transform player; 
    static Animator anim; 

    // Use this for initialization 
    void Start() 
    { 
     anim = GetComponent<Animator>(); 
    } 

    // Update is called once per frame 
    void Update() 
    { 
     Vector3 direction = player.position - this.transform.position; 
     float angle = Vector3.Angle(direction,this.transform.forward); 
     if(Vector3.Distance(player.position, this.transform.position) < 10 && angle < 30) 
     { 

      direction.y = 0; 

      this.transform.rotation = Quaternion.Slerp(this.transform.rotation, 
             Quaternion.LookRotation(direction), 0.1f); 

      anim.SetBool("isIdle",false); 
      if(direction.magnitude > 5) 
      { 
       this.transform.Translate(0,0,0.10f); 
       anim.SetBool("isRunning",true); 
       anim.SetBool("isAttacking",false); 
       anim.SetBool("isCrying",true); 
      } 
      else 
      { 
       anim.SetBool("isAttacking",true); 
       anim.SetBool("isRunning",false); 
       anim.SetBool("isCrying",false); 
      } 

     } 
     else 
     { 
      anim.SetBool("isIdle", true); 
      anim.SetBool("isRunning", false); 
      anim.SetBool("isAttacking", false); 
      anim.SetBool("isCrying",false); 

     } 

    } 
} 

paramètres NPC:

settings

+1

Avez-vous un collisionneur de maille sur vos objets de mur? –

+0

Vous aurez besoin d'effectuer un certain chemin d'accès pour trouver le chemin légal vers le joueur. Dans le cas contraire, le gobelin essaiera de courir directement sur le joueur, ce qui signifiera soit d'être arrêté ou de courir à travers des obstacles potentiellement facilement contournables. – Abion47

+0

Oui, je le fais. Mais il se déplace toujours à travers le mur. –

Répondre

1

A marqué par IsKinematic modèle du solide indéformable is not affected by Forces, collisions or joints. Gardez à l'esprit que l'utilisation Transform.Translate() avec un modèle du solide indéformable Cela peut également entraîner des bogues. Considérez le Rigidbody.MovePosition() qui est destiné à être utilisé avec la physique. Dans l'ensemble cependant, je vous suggère d'utiliser pathfinding pour vous assurer que l'ennemi ne tente pas de traverser les murs en premier lieu.

+1

N'a rien à voir avec IsKinematic. C'est un problème de Transform.Translate. MovePosition ou AddForce doivent être utilisés. – Programmer

+0

Je vois. Qu'est-ce que je dois exactement changer pour MovePosition? Toutes les transformations? –

+0

Vous devez obtenir le Rigidbody avec 'GetComponent', puis remplacer' this.transform.Translate (0,0,0.10f); 'par' yourRigidBody.MovePosition (transformer.position + transformer.forward * Time.deltaTime); ' – Programmer

0

Vous pouvez essayer ceci:

using UnityEngine; 
using System.Collections; 

public class walkTowardsPlayer : MonoBehaviour { 
List<GameObject> enemies = new List<GameObject>(); 
public GameObject player; //drag your player in inspector to this variable 
public GameObject zombie; //drag your enemy in inspector to this variable 


void Start(){ 

} 

void Update(){ 
    foreach(GameObject exampleZombie in enemies){ 
     if (zombiechar.transform.position!=player.transform.position){ 
     zombiechar.transform.position = new Vector3(zombiechar.transform.position.x, 0f, zombiechar.transform.position.z); //enemy move only at x and z axes 
     zombiechar.transform.position = Vector3.MoveTowards(zombiechar.transform.position, player.transform.position, 1.5f*Time.deltaTime); //the enemy move towards you 

     } 

      zombie = exampleZombie; 
     } 
} 

} 
+0

Bien sûr, les ennemis ont besoin d'un corps rigide ou d'un contrôleur de personnage. –