玩家重叠后的实例化敌人

问题描述 投票:0回答:1

所以对于我的自上而下的角色扮演游戏来说,如果你离得太近,主世界里的敌人就会追赶你。 (就像现在大多数回合制角色扮演游戏一样。)它的工作方式是,敌人生成器在场景开始时的随机位置实例化敌人。这不是问题,但问题是敌人的主世界脚本本身。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyOverworld : MonoBehaviour
{
    [Header("Details")]
    public BattleChar[] enemiesInArea;
    public int musicToPlay;
    public int maxAmountOfEnemies;
    public bool cannotFlee;
    public bool boss;

    [Header("Overworld Details")]
    public float speed;
    Vector3 dirToPlayer;
    public bool chase = false;

    void FixedUpdate()
    {
        if (!GameManager.instance.battleActive && chase)
        {
            dirToPlayer = (CameraController.instance.target.position - transform.position).normalized;

            if (dirToPlayer.magnitude > 0)
            {
                transform.position = Vector2.MoveTowards(transform.position, CameraController.instance.target.position, speed * Time.deltaTime);
            }
        }
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (!chase)
        {
            chase = true;
        }
    }

    private void OnTriggerExit2D(Collider2D collision)
    {
        if (chase)
        {
            float wait = 1;

            while (wait > 0)
            {
                wait -= Time.deltaTime;
            }

            chase = false;
        }
    }

    public IEnumerator StartBattleCo()
    {
        List<string> enemies = new();

        UIFade.instance.FadeToBlack();
        GameManager.instance.battleActive = true;
        int amount = 1;

        if (!boss)
        {
            amount = Random.Range(1, maxAmountOfEnemies);
        }

        for (int i = 0; i < amount; i++)
        {
            int enemy = Random.Range(0, enemiesInArea.Length);

            if (enemiesInArea[enemy].rareEnemy)
            {
                int chance = Random.Range(0, enemiesInArea[enemy].rarity * 10);

                if (chance <= enemiesInArea[enemy].rarity)
                {
                    enemies.Add(enemiesInArea[enemy].charName);
                }

                else
                {
                    i = i--;
                }
            }

            else
            {
                enemies.Add(enemiesInArea[enemy].charName);
            }
        }

        yield return new WaitForSeconds(1.5f);

        BattleManager.instance.BattleStart(enemies.ToArray(), cannotFlee, boss, musicToPlay);

        UIFade.instance.FadeFromBlack();
        enemies.Clear();
        Destroy(gameObject);
    }

当敌人追赶玩家时,他们通常会互相重叠,即使他们身上都有胶囊碰撞器(非触发)和刚体。

我尝试了不同的方法,例如翻译位置而不是使用 MoveTowards,但它不起作用。

c# unity-game-engine 2d
1个回答
0
投票

一旦涉及任何物理,你就不想通过

移动你的物体
transform.position = ...

因为这会否决物理引擎并直接传送对象,而不考虑任何碰撞等。

而是使用

Rigidbody2D.MovePosition
,例如

[SerializeField] private Rigidbody2D m_Rigigbody;

...

private void FixedUpdate()
{
    ...

    m_Rigigbody.MovePosition(Vector2.MoveTowards(m_Rigigbody.position, CameraController.instance.target.position, speed * Time.deltaTime));

    ...
}

这将考虑碰撞。

© www.soinside.com 2019 - 2024. All rights reserved.