Пусть враг следует за игроком в Unity3D - PullRequest
0 голосов
/ 23 марта 2020

Я сделал скрипт, чтобы враг следовал за игроком после того, как игрок столкнулся с землей.

Я сталкиваюсь с проблемой, заключающейся в том, что враг идет к начальной точке, а не к игрок.

было бы здорово, если бы кто-то мог помочь мне с этим:)

Transform tr_Player;
float f_RotSpeed = 3.0f, f_MoveSpeed = 3.0f;

public int gegnerLeben;
Rigidbody m_Rigidbody2;
Vector3 m_YAxis2;

public int leben;
public GameObject Player;
public GameObject verfolgen;
public GameObject MinenGener;

void Start()
{

    tr_Player = Player.transform;

    m_Rigidbody2 = GetComponent<Rigidbody>();
    m_YAxis2 = new Vector3(0, 5, 0);

}


public void GegnerFreez()
{
    m_Rigidbody2.constraints = RigidbodyConstraints.FreezePosition;
}

void Update()
{
    if (Player.GetComponent<SpielerScript>().MineBetreten == true)
    {
        MinenGener.transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(tr_Player.position - transform.position), f_RotSpeed * Time.deltaTime);
        MinenGener.transform.position += transform.forward * f_MoveSpeed * Time.deltaTime;
    }


    if (gegnerLeben < 1)
    {
        Destroy(Player.GetComponent<SpielerScript>().MinenGegner);
    }
}

1 Ответ

0 голосов
/ 24 марта 2020

Несколько моментов здесь:

Не используйте GetComponent в Update снова и снова.

Скорее сделайте ваше поле типа

public SpielerScript Player;

и перетащите игрока через инспектора. Это делает две вещи

  • Проверьте, есть ли к объекту даже прикрепленный SpielerScript и разрешено ли удаление только тогда
  • Уже хранится ссылка на SpielerScript, поэтому нет необходимости использовать GetComponent

Кроме того, на m_Rigidbody2 уже можно ссылаться через инспектора, сделав его

[SerializeField] Rigidbody m_Rigidbody2;

Тогда Quaternion.Slerp - это линейная интерполяция между вращениями с заданным коэффициентом между 0 и 1. Здесь нет смысла использовать коэффициент, умноженный на Time.deltaTime, так как вы получите что-то вроде 3 * 0.017 (для 60 к / с), что приведет к коэффициенту интерполяции около 0.051, так что очень близко к 0 так что ваш враг просто меняет свое вращение очень медленно!

Скорее используйте фиксированное значение, например, 0.5, чтобы каждый кадр устанавливал его посередине между двумя вращениями или 0.25, чтобы замедлить его. .

После небольшой очистки и рефакторинга ваш код может выглядеть, например,

[Header("References")]
[SerializeField] private PlayerScript Player;
[SerializeField] private Rigidbody m_Rigidbody2;
[SerializeField] private Transform MinenGener;

public GameObject verfolgen;

[Header("Settings")]
[SerializeField] [Range(0,1)] private float f_RotFactor = 0.5f
[SerializeField] private float f_MoveSpeed = 3.0f;

[Header("Runtime Values")]
public int leben;
public int gegnerLeben;

private Transform tr_Player;
private Vector3 m_YAxis2 = new Vector3(0, 5, 0);

private void Start()
{
    tr_Player = Player.transform;

    // only do as fallback if not referenced via the Inspector to save resources
    if(!m_Rigidbody2) m_Rigidbody2 = GetComponent<Rigidbody>();
}

public void GegnerFreez()
{
    m_Rigidbody2.constraints = RigidbodyConstraints.FreezePosition;
}

void Update()
{
    if (Player.MineBetreten)
    {
        MinenGener.transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(tr_Player.position - transform.position), f_RotFactor);
        MinenGener.transform.position += transform.forward * f_MoveSpeed * Time.deltaTime;
    }

    if (gegnerLeben < 1)
    {
        Destroy(Player.MinenGegner);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...