游戏开发小结——聪明的敌人

发布时间:2023年12月28日

游戏开发小结——聪明的敌人

目标:创造一种面向侧面的新型敌人,当看到玩家时会发射水平激光。

在这里插入图片描述

为我们的新敌人准备图片精灵Sprite。

由于这个敌人将面向侧面,我将把他的涡轮机放置在两侧,以表明他正在使用它来稳定自己。

在这里插入图片描述

我们的敌人拥有两个涡轮增压器。

这个想法是,他会慢慢下降,当我们的玩家水平位于他身后时,他会发射水平激光。
private enum EnemyType
{
    Default,
    Zigzag,
    Aggressive,
    Smart
}
我们必须更新敌人的敌人类型,以便我们可以在检查器(inspector)中设置正确的类型。
现在我们要更新我们的激光器。目前,我们的激光器是我们实例化并使用它的预制件。现在我们将用两个激光器向侧面发射它(与以前不同)。为了使我们的运动更容易计算,我们将创建一个新对象,并使用激光作为对象的精灵sprite。

在这里插入图片描述

我们的水平激光器及其所有组件。

我们的激光只是我们激光的视觉表现,我们的激光脚本位于空白物体中。这对我们来说更容易,因为我们的激光器是旋转的,这意味着它们的运动会与预期不同。
[SerializeField] private bool _isHorizontalLaser = false;
private int _direction = 1;
private void CalculateMovement()
{
    if (_isPlayerLaser)
        transform.Translate(_laserSpeed * Time.deltaTime * Vector3.up);        
    else
    {
        if (!_isHorizontalLaser)
            transform.Translate(_laserSpeed * Time.deltaTime * Vector3.down);            
        else
        {
            Vector3 horizontalDirection = Vector3.right * _direction;
            transform.Translate(_laserSpeed * Time.deltaTime * horizontalDirection);
        }
    }
}
public void SetDirection(int direction)
{
    _direction = direction;
}
通过这个更新的CalculateMovement方法,现在我们添加了敌人激光水平(horizontal)的选项,可以通过我们的_isHorizo??ntalLaser变量在检查器上设置。如果是的话,它现在只是根据面向的方向向侧面移动。
我们还添加了一个可以改变我们的激光方向的方法,可以在它们被实例化时使用,我们可以传递我们想要它们去的方向。
现在我们转向敌人的脚本。在我们知道何时开火之前,我们将更新 FireLaser 方法,以包含实例化水平激光的选项。
private void FireLaser()
{
    if(_type == EnemyType.Aggressive)
        _fireRate = Random.Range(1.5f, 3f);
    else
        _fireRate = Random.Range(3f, 7f);

    _canFire = Time.time + _fireRate;
    if (_type != EnemyType.Smart)
    {
        _laserOffset.Set(0f, -1.4f, 0f);
        Instantiate(_laserPrefab, transform.position + _laserOffset, Quaternion.identity);
    }            
    else
    {
        if(_direction > 0)
                _laserOffset.Set(1.35f, 0f, 0f);
            else
                _laserOffset.Set(-1.35f, 0f, 0f);
        GameObject laserObj = Instantiate(_laserPrefab, transform.position + _laserOffset, Quaternion.identity);
        LaserBehaviour laser = laserObj.GetComponent<LaserBehavior>();
        if (laser != null)
                laser.SetDirection(_direction);
    }
}
那么我们的烧制方法在做什么呢?好吧,我们检查正在开火的敌人的类型,当它不聪明时,我们就正常开火。
当它是我们的聪明敌人时,我们改变激光的偏移。
实例化激光时,我们将其分配给变量 LaserObj,然后从中获取 LaserBehavior 组件。在进行零值检查后,我们只需传递我们的方向,因此激光会移动到正确的方向。
private void RotateEnemy()
{
    if(_type == EnemyType.Smart)
    {
        if (_direction > 0)
        {
            _direction = 1;
            _spriteTransform.rotation = Quaternion.Euler(0f, 180f, 0f);
        }
        else
        {
            _direction = -1;
            _spriteTransform.rotation = Quaternion.Euler(0f, 0f, 0f);
        }
    }
}
这种旋转方法,通过使用 Quaternion.Euler 确保精灵面向正确的一侧,并且我们总是设置方向,以确保它与我们所在的位置相反。这意味着如果我们面朝左侧,我们的方向就是正方向,因此激光会向右移动。如果我们面向右,我们需要它是负的,所以我们的激光向左走。
现在我们必须检查我们的玩家是否在敌人后面,这将如何工作?让我们看看我们在 Update 方法中所做的更改。
private void Update()
{
    CalculateMovement();

    if (Time.time >= _canFire && _type != EnemyType.Zigzag)
    {
        if (_type != EnemyType.Smart)
            FireLaser();
        else
        {
            Vector2 toPlayer = _player.transform.position - transform.position;
            float angle = Vector2.SignedAngle(-transform.right, toPlayer.normalized);
            float alignmentThreshold = 5f;
            float horizontalAlignment = Mathf.Abs(toPlayer.y) / Mathf.Abs(toPlayer.x);

            if (Mathf.Abs(angle) < alignmentThreshold && horizontalAlignment < 1f)
                FireLaser();
        }
    }
}
首先我们从 toPlayer 开始,它计算从敌人到玩家的向量。它将玩家的位置减去敌人的位置,创建一个从敌人指向玩家的矢量。
然后我们得到了计算敌人的负右方向 (-transform.right) 和玩家的归一化方向向量 (toPlayer.normalized) 之间的符号角的角度。使用负右方向是因为您想检查玩家是否位于敌人后面。
现在我们的alignmentThreshold,这设置了角度的阈值。这就是我们如何知道我们的玩家是否在敌人后面的方法。
然后我们有水平对齐,它通过取 toPlayer 的 y 和 x 分量的绝对值并将它们相除来计算播放器的水平对齐方式。这表示玩家相对于敌人的垂直对齐程度。
最后我们有了 if 语句。我们的 if 语句检查角度的绝对值是否低于alignmentThreshold,以及horizo??ntalAlignment 是否小于1。
这意味着什么 ?好吧,如果我们的角度的绝对值低于我们的alignmentThreshold,则意味着我们的玩家位于敌人的后面。
然后我们检查horizo??ntalAlignment是否小于1,这意味着玩家与敌人及其后面垂直对齐。因此,只有当我们的敌人的枪能够击中我们的玩家时,他才会开枪。在这里插入图片描述

我们可以看到,只有当玩家在他身后并与他对齐时,敌人才会开枪。

现在有了这些变化,我们现在有了一个可以从侧面骚扰我们的玩家的敌人,这意味着它会下降,如果玩家不注意它,它会向它发射水平激光!
文章来源:https://blog.csdn.net/qq_37270421/article/details/135252390
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。