Сделать объект лицом к лицу и двигаться к игроку

#c# #unity3d #path-finding

#c# #unity3d #поиск пути

Вопрос:

Я создаю простую 2d-игру с кораблями для моего школьного проекта. Прямо сейчас ии повернется лицом к игроку и будет следовать за ним на определенном расстоянии, затем, когда подойдет достаточно близко, повернется так, чтобы он мог стрелять в игрока с каждой стороны корабля. Но с моим текущим кодом враг будет двигаться боком к игроку на дальности стрельбы, чего, очевидно, не должно произойти.

Итак, как я могу заставить врага двигаться только вперед и оставаться перпендикулярным игроку.

Вот мой текущий код:

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

public class NewBehaviourScript : MonoBehaviour
{
    public float speed, stopD, retreatD, Chase_range, distance,firing_range;
    // declare player and enemy as transform to retrieve their positions
    public Transform player;

    void Start()
    {
        player = GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();

        Chase_range = 14;
        firing_range = 10;
        stopD = 6;
        retreatD = 4;

    }
    // Update is called once per frame
    void Update()
    {

        // Distance between the enemy and player positions
        distance = (Vector2.Distance(transform.position, player.position));
        transform.position = Vector2.MoveTowards(transform.position, player.position, speed * Time.deltaTime);

        if (distance > stopD)
        {
            // move towards the player if the distance is greater than stop distance
            speed = 10;

        }
        else if (distance < stopD amp; distance > retreatD)
        {
            speed = 0;
        }
        else if (distance < retreatD)
        {
            // move away from the player if the distance is less than stop distance (avoid collision)
            speed = -10;
        }

        if (distance > Chase_range)
        { 
         // have to use vector3 since vector2 does not work with the z axis
         // calculate the difference in the position vectors
         Vector3 vectorToTarget = player.position - transform.position;
            // Calculate the angle between the objects and convert the result to degrees
         float angle = Mathf.Atan2(vectorToTarget.y, vectorToTarget.x) * Mathf.Rad2Deg;
            // convert the angle into a quaternion so that it can be used by slerp 
         Quaternion playerq = Quaternion.AngleAxis(angle, Vector3.forward);

         transform.rotation = Quaternion.Slerp(transform.rotation, playerq, Time.deltaTime * speed);      
        }
        if (distance < firing_range)
        {
            float Rfactor;
            Vector3 vectorToTarget = player.position - transform.position;

            float angle = Mathf.Atan2(vectorToTarget.y, vectorToTarget.x) * Mathf.Rad2Deg;
            if (angle < 0) 
            {
                Rfactor = 90;
            }
            else if (angle > 0)
            {
                Rfactor = -90;
            }
                Quaternion playerq = Quaternion.AngleAxis(angle   Rfactor, Vector3.forward);
            
            transform.rotation = Quaternion.Slerp(transform.rotation, playerq, Time.deltaTime * speed);
        }

    }
  

И не обращайте внимания на дерьмовые комментарии, это для школы.
Любые другие комментарии по поводу кода также будут высоко оценены

Комментарии:

1. возможно, вы используете атрибут forward на неправильной оси, но я не совсем понимаю, в чем проблема, не могли бы вы уточнить?

2. Ну, код пока функционирует так, как задумано, враг вращается и движется к игроку на определенном расстоянии, а затем, когда он приближается, поворачивается так, чтобы он был перпендикулярен игроку. Что мне нужно сделать сейчас, так это сделать так, чтобы враг двигался рядом с игроком, чтобы он мог продолжать стрелять.

3. Не могли бы вы попробовать добавить смещение к его движению к оси, которая вам нравится?

Ответ №1:

С помощью быстрого поиска в Google я нашел этот ответ:

https://answers.unity.com/questions/1125044/how-do-i-move-an-object-relative-to-another-object.html

Используя это, вы можете переместить противника вперед относительно игрока. Если вы сейчас повернете игрока, вы получите желаемый результат: враг будет двигаться вместе с игроком, но сосредоточится на нем