Przeciwnik goniący gracza powinien wrócić na swoje miejsce po przebyciu określonego dystansu

0

Witam,

Tworzę grę 2D, platformówkę, gdzie przeciwnicy gonią gracza gdy ten zbliży się na odpowiednią odległość. Potrzebuję pomocy w kodzie. Otóż cały kod ogólnie działa i przeciwnik goni gracza, a gdy gracz jest poza zasięgiem przeciwnik wraca do swoich waypointów. Chciałam dodać niewidzialną ścianę, która działa na trigger. Jeśli przeciwnik jej dotknie to przestaje gonić gracza i wraca do swoich waypointów (zrobiłam to po to aby przy platformach przeciwnik nie spadał w dół ponieważ póżniej nie ma jak wrócić) niestety trigger nie działa, nie wyświetla mi się tez Debug.Log który dałam aby sprawdzić czy działa. Ściana ma Tag Granica, a przeciwnik dwa collidery, jeden na trigger aby jeśli gracz go dotknie był cofany do respawnu a drugi zwykły collider bez triggera który jest bardziej w środku, ktory miał działać na ścianę.

Poniżej kod:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChasingEnemy: MonoBehaviour {
  public Transform[] patrolPoints;
  public float moveSpeed;
  public int patrolDestination;

  public Transform playerTransform;
  public bool isChasing;
  public float chaseDistance;

  void Start() {

  }
  void Update() {

    if (isChasing) {
      moveSpeed = 4;

      if (transform.position.x > playerTransform.position.x) {
        transform.localScale = new Vector3(1, 1, 1);
        transform.position += Vector3.left * moveSpeed * Time.deltaTime;
      }

      if (transform.position.x < playerTransform.position.x) {
        transform.localScale = new Vector3(-1, 1, 1);
        transform.position += Vector3.right * moveSpeed * Time.deltaTime;
      }

      if (Vector2.Distance(transform.position, playerTransform.position) > 6) {
        isChasing = false;
        moveSpeed = 2;
      }

    } else {
      if (Vector2.Distance(transform.position, playerTransform.position) < chaseDistance) {
        isChasing = true;
      }

      Walking();
    }

    void Walking() {
      if (patrolDestination == 0) {
        transform.position = Vector2.MoveTowards(transform.position, patrolPoints[0].position, moveSpeed * Time.deltaTime);
        if (Vector2.Distance(transform.position, patrolPoints[0].position) < .2 f) {
          patrolDestination = 1;
          transform.localScale = new Vector3(-1, 1, 1);
        }
      }

      if (patrolDestination == 1) {
        transform.position = Vector2.MoveTowards(transform.position, patrolPoints[1].position, moveSpeed * Time.deltaTime);
        if (Vector2.Distance(transform.position, patrolPoints[1].position) < .2 f) {
          patrolDestination = 0;
          transform.localScale = new Vector3(1, 1, 1);
        }
      }
    }

    void OnTriggerEnter2D(Collider2D other) {
      if (other.CompareTag("Granica")) {
        Debug.Log("Przecwinik przestaje biec");
        isChasing = false;
        Invoke("ResumeChasing", 3 f);

      }
    }

    void ResumeChasing() {
      isChasing = true;
    }

  }
}
2
  1. Nie używaj tagów. Zrób warstwy: https://docs.unity3d.com/Manual/LayerBasedCollision.html
  2. Skoro granica jest Triggerem, to ona powinna mieć skrypt z metodą OnTriggerEnter2D. Ona niech wydaje rozkazy skryptowi postaci. Collider granicy powinien mieć zaznaczonego checkboxa isTrigger. Dla pewności można do obiektu z colliderem triggera dodać rigidbody.
  3. Zamiast triggerów, możesz zawczasu sprawdzać raycastem, czy podłoga znajduje się tam, gdzie postać chce się przemieścić.
  4. Tak w ogóle to w Unity jest coś takiego jak NavMesh, przyda Ci się w takim projekcie:

1 użytkowników online, w tym zalogowanych: 0, gości: 1