【问题标题】:Have an enemy follow the player in Unity3D在 Unity3D 中让敌人跟随玩家
【发布时间】:2020-03-24 15:19:41
【问题描述】:

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

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

如果有人可以帮助我,那就太好了:)

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

【问题讨论】:

  • 仅此元素很难帮助您,您可以将您的统一项目放在 github 或我能看到的地方吗?或者你的包项目我可以在我的统一中测试......

标签: c# unity3d


【解决方案1】:

这里有几点:

不要在Update 中反复使用GetComponent

宁愿让你的字段类型

public SpielerScript Player;

并通过检查器将播放器拖入。这有两件事

  • 检查对象是否甚至附加了SpielerScript,然后才允许放置
  • 已经存储了对SpielerScript的引用,所以不需要使用GetComponent

m_Rigidbody2 也可以通过 Inspector 进行引用

[SerializeField] Rigidbody m_Rigidbody2;

那么Quaternion.Slerp01 之间给定因子的旋转之间的线性插值。在这里使用乘以 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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多