Несколько моментов здесь:
Не используйте 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);
}
}