让敌人在 Unity3D 中跟随玩家



我做了一个脚本,在玩家与地面相撞后,让敌人跟随玩家。

我面临的一个问题是敌人走到起点而不是玩家身边。

如果有人能帮我解决这个问题,那就太酷了:)

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);
}
}

这里有几点:

不要一遍又一遍地在Update中使用GetComponent

而是使你的字段类型化

public SpielerScript Player;

,然后通过检查器将玩家拖入。这做了两件事

  • 检查对象是否甚至附有SpielerScript,并且只允许放置
  • 已经存储了对SpielerScript的引用,因此无需使用GetComponent

此外,该m_Rigidbody2已经可以通过检查器进行引用

[SerializeField] Rigidbody m_Rigidbody2;

然后Quaternion.Slerp是给定因子在01之间的旋转之间的线性插值。在这里使用乘以Time.deltaTime的因子是没有意义的,因为你得到的将是类似于3 * 0.017(60 f/s)的东西,这会导致大约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);
}
}

最新更新