Unity2D: перемещать врага к объекту при обнаружении - PullRequest
0 голосов
/ 19 января 2019

У меня есть скрипт, который заставит врагов осматривать область на предмет случайных объектов в пределах сцены, если враг обнаружит объект, то враг будет двигаться вперед.Однако это не то, что я хочу, чтобы враг делал, вместо того, чтобы враг двигался вперед, я хочу, чтобы враг двигался к объекту, а затем, как только враг достигнет объекта, я хочу, чтобы враг прекратил свое движение.У меня есть разные типы объектов с разными тегами, поэтому я не думаю, что перемещение объекта с использованием имени тега объекта будет эффективным.Я надеюсь найти способ переместить врагов к ближайшему объекту, используя имя слоя объекта, так как все мои объекты имеют одинаковое имя слоя, то есть любой объект, появляющийся на сцене, враг сможет двигаться к нему.Есть ли способ переместить моего врага к объекту, когда он виден?Спасибо за помощь!

Это мой код:

public Transform sightStart, sightEnd, sightStart2, sightEnd2;

public Vector3 direction = Vector3.right;
public Vector3 direction2 = Vector3.right;

public float speed = 2f;

public bool spotted = false;
public bool rotate, moveEnemy = false;

public Camera mainCam;

public GameObject EndSight, EndSight2;

void Start () {
    speed = 2f;
    spotted = false;
    rotate = false;
    moveEnemy = false;
    mainCam = GameObject.Find ("Main Camera").GetComponent<Camera> ();

}


void Update () {
        Behaviours ();
    if (mainCam.WorldToScreenPoint (this.transform.position).x > Screen.width / 2) {
        direction.x = -1;
            InvokeRepeating ("EnemySight", 0, 10f); 
        if (moveEnemy == false) {
            RayCasting (); 
            Destroy (gameObject, 7f);
        } 
    } else {
        direction.x = 1;
            InvokeRepeating ("EnemySight", 0, 10f); 
        if (moveEnemy == false) {
            RayCasting2 (); 
            Destroy (gameObject, 7f);
        }
    }
}

void EnemySight() {
    if (rotate == false) {
        if (mainCam.WorldToScreenPoint (this.transform.position).x > Screen.width / 2) {
            EndSight.transform.Translate (direction2 * speed * Time.deltaTime);
            direction2.x = 0;
            direction2.y = 1;
            StartCoroutine (wait1 ());
        } else {
            EndSight2.transform.Translate (direction2 * speed * Time.deltaTime);
            direction2.x = 0;
            direction2.y = 1;
            StartCoroutine (wait1 ());

        }
    } else if (rotate == true) {
        if (mainCam.WorldToScreenPoint (this.transform.position).x > Screen.width / 2) {
            EndSight.transform.Translate (direction2 * speed * Time.deltaTime);
            direction2.x = 0;
            direction2.y = -1;
            StartCoroutine (wait2 ());
        } else {
            EndSight2.transform.Translate (direction2 * speed * Time.deltaTime);
            direction2.x = 0;
            direction2.y = -1;
            StartCoroutine (wait2 ());
        }
    }
}

IEnumerator wait1() {
    yield return new WaitForSeconds (0.7f);
    rotate = true;
}

IEnumerator wait2() {
    yield return new WaitForSeconds (0.7f);
    rotate = false;
}

void RayCasting()
{
    Debug.DrawLine (sightStart.position, sightEnd.position, Color.black);
    spotted = Physics2D.Linecast (sightStart.position, sightEnd.position, 1 << LayerMask.NameToLayer("Items"));

}

void RayCasting2()
{
    Debug.DrawLine (sightStart2.position, sightEnd2.position, Color.black);
    spotted = Physics2D.Linecast (sightStart2.position, sightEnd2.position, 1 << LayerMask.NameToLayer("Items"));

}

void Behaviours()
{
    if (spotted == true) {
        transform.Translate (direction * speed * Time.deltaTime);
        speed = 2f;
    } else if (spotted == false) {
        speed = 0;
    }
} 

void OnTriggerExit2D (Collider2D col) {
    if (col.tag == "object1") {
        speed = 0;
        CancelInvoke();
    }
    if (col.tag == "object2") {
        speed = 0;
        CancelInvoke();
    }
    if (col.tag == "object3") {
        speed = 0;
        CancelInvoke();
    }
    if (col.tag == "object4") {
        speed = 0;
        CancelInvoke();
    }
  }
}

1 Ответ

0 голосов
/ 19 января 2019

https://docs.unity3d.com/ScriptReference/Vector2.MoveTowards.html

врага.трансформация = Vector2.MoveTowards (враг.трансформация, цель.трансформация, скорость * Time.deltaTime);

Если вы хотите остановить врага немного дальше, чем трансформация цели, ваша цель может быть хит-точкой Рэйкаста.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...