【问题标题】:How to spawn enemies in a certain range but not in-camera?如何在一定范围内而不是在相机内产生敌人?
【发布时间】:2021-11-05 15:23:05
【问题描述】:

所以我正在制作一个 2D 平台游戏,我想在整个地图上生成敌人,但不在摄像机范围内。 不得不说我是用 Cinemachine 来跟随玩家的。

这是我的生成器脚本:

*public class MobSpawner : MonoBehaviour
{
    public GameObject Mob;
    float randX;
    Vector2 whereToSpawn;
    public float spawnRate = 2f;
    float nextSpawn = 0.0f;
    public GameObject Camera;
    // Start is called before the first frame update
    void Start()
    {
    }
    // Update is called once per frame
    void Update()
    {
        if (Time.time > nextSpawn)
        {
            nextSpawn = Time.time + spawnRate;
            randX = Random.Range(-36f, 62);
            whereToSpawn = new Vector2(randX, transform.position.y);
            Instantiate(Mob, whereToSpawn, Quaternion.identity);
        }
    }
    
}*

如你所见,我拿了 2 点,在它们之间我产生了敌人。由于这个范围基本上是整个地图,因此相机将始终在其中。

我希望敌人不会在摄像机内部生成,而是在摄像机外部生成。我怎样才能做到这一点?

【问题讨论】:

  • 也许使用一个碰撞器将相机视图封装在一个特殊的碰撞矩阵上来检查敌人的生成位置是否与它碰撞?
  • 您可以使用 GeometryUtility CalculateFrustumPlanes 和 TestPlanesAABB 对相机平截头体进行测试。或者你可以做一个 WorldToScreenPoint 确保 x 和 y 不在 Rect(0, 0, Screen.width, Screen.height) 中。您可以将生成代码放在首先测试随机位置的 while 循环中,如果正常则生成,否则再次循环。
  • 我会找到不属于观察光谱的角度。一旦你有一个在观察范围之外的方向向量,为长度和生成添加一些标量。这样您就不需要循环或不断尝试寻找有效位置。你只会知道它是有效的。起点可以是this doc。

标签: c# unity3d game-physics spawn


【解决方案1】:

我想说最简单的解决方案是只计算玩家位置和生成位置之间的矢量距离。由于这是一个二维空间,并且您只在一个轴上生成它们应该没问题。

所以你可以这样做

float distanceAwayFromCameraView = 5;
    
    // you will need a method, reference or just get the object via tag
    var playerPos = GameObject.Find("Player").transform.position;
    
    randX = Random.Range(-36f, 62);
    whereToSpawn = new Vector2(randX, transform.position.y);
    
    while ((Vector2.Distance(whereToSpawn, playerPos) < distanceAwayFromCameraView){
        randX = Random.Range(-36f, 62);
        whereToSpawn = new Vector2(randX, transform.position.y);
    }
    
    Instantiate...

我现在不在我的电脑上测试这个,如果有错误请告诉我

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    相关资源
    最近更新 更多