You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity2D敌人重生位置错误:如何让敌人在对应Box范围内生成?

Unity 2D敌人重生位置错误修复

问题描述

我正在使用Unity 2D进行开发,尝试在已放置的多个Box对象的随机位置生成敌人。但当生成的敌人死亡后,会重生到错误的Box生成点——所有敌人死亡后都会回到第一个Box对象的位置。我已尝试使用transform和GameObject来区分不同的Box,请问如何修复该问题,让敌人能够在对应的Box对象位置生成?

原代码

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

public class SpawnerManager : MonoBehaviour
{
    public GameObject enemy;
    public GameObject box;

    public int count;
    public int MaxCount;
    public int enemyCount;
    public float spawnTime;
    public float curTime;
    private BoxCollider2D area;
    
    public static SpawnerManager _instance;
    
    void Start(){
        _instance = this;
    
        area = box.GetComponent<BoxCollider2D>();
    
        enemyCount++;
        Vector3 spawnPos = GetRandomPosition();
        GameObject instance = Instantiate(enemy, spawnPos, Quaternion.identity);
    }
    
    private void Update(){
        if(curTime >= spawnTime && enemyCount < MaxCount)
            SpawnEnemy();
    
        curTime += Time.deltaTime;
    }
    
    public void SpawnEnemy(){
        curTime = 0;
        enemyCount++;
        Vector3 spawnPos = GetRandomPosition();
        GameObject instance = Instantiate(enemy, spawnPos, Quaternion.identity);
    }
    
    private Vector2 GetRandomPosition(){
        Vector2 basePosition = box.transform.position;
        Vector2 size = area.size;
    
        float posX = basePosition.x + Random.Range(-size.x, size.x);
        
        Vector2 spawnPos = new Vector2(posX, basePosition.y);
    
        return spawnPos;
    }
}

修复方案

1. 移除全局单例,让每个Box绑定独立的Spawner

你的代码用了_instance单例模式,导致所有敌人死亡后只会调用第一个Spawner实例的生成方法,所以全用第一个Box的位置。直接删除以下代码:

  • public static SpawnerManager _instance;
  • Start方法里的_instance = this;

2. 让敌人记录自己所属的Spawner

在你的敌人脚本(比如Enemy.cs)里添加一个变量,用来记录生成它的Spawner:

public SpawnerManager ownerSpawner;

然后修改SpawnerManager的SpawnEnemy方法,给生成的敌人赋值这个变量:

public void SpawnEnemy(){
    curTime = 0;
    enemyCount++;
    Vector3 spawnPos = GetRandomPosition();
    GameObject instance = Instantiate(enemy, spawnPos, Quaternion.identity);
    // 替换成你的敌人脚本类名
    instance.GetComponent<Enemy>().ownerSpawner = this;
}

3. 敌人死亡时调用对应Spawner的生成逻辑

在敌人的死亡处理代码里,先减少所属Spawner的敌人计数,再调用生成方法:

// 敌人死亡时执行的代码
ownerSpawner.enemyCount--;
ownerSpawner.SpawnEnemy();
Destroy(gameObject);

4. 优化随机位置计算(可选)

原代码的随机位置计算没有考虑Box的缩放,而且范围会超出Box区域,修改GetRandomPosition方法:

private Vector2 GetRandomPosition(){
    Vector2 basePosition = box.transform.position;
    // 计算Box的实际半宽(考虑缩放)
    float halfWidth = area.size.x * box.transform.localScale.x / 2f;
    float posX = basePosition.x + Random.Range(-halfWidth, halfWidth);
    Vector2 spawnPos = new Vector2(posX, basePosition.y);
    return spawnPos;
}

内容的提问来源于stack exchange,提问作者account 0298

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 06:04:53