所以对于我的自上而下的角色扮演游戏来说,如果你离得太近,主世界里的敌人就会追赶你。 (就像现在大多数回合制角色扮演游戏一样。)它的工作方式是,敌人生成器在场景开始时的随机位置实例化敌人。这不是问题,但问题是敌人的主世界脚本本身。
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,但它不起作用。
一旦涉及任何物理,你就不想通过
移动你的物体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));
...
}
这将考虑碰撞。