У меня есть скрипт, который заставит врагов осматривать область на предмет случайных объектов в пределах сцены, если враг обнаружит объект, то враг будет двигаться вперед.Однако это не то, что я хочу, чтобы враг делал, вместо того, чтобы враг двигался вперед, я хочу, чтобы враг двигался к объекту, а затем, как только враг достигнет объекта, я хочу, чтобы враг прекратил свое движение.У меня есть разные типы объектов с разными тегами, поэтому я не думаю, что перемещение объекта с использованием имени тега объекта будет эффективным.Я надеюсь найти способ переместить врагов к ближайшему объекту, используя имя слоя объекта, так как все мои объекты имеют одинаковое имя слоя, то есть любой объект, появляющийся на сцене, враг сможет двигаться к нему.Есть ли способ переместить моего врага к объекту, когда он виден?Спасибо за помощь!
Это мой код:
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();
}
}
}